\documentclass[a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{vmargin}
\setmargnohf{1cm}{1cm}{19cm}{27.7cm}
\usepackage{hevea}

\begin{document}
\title{Plusieurs à éditer un fichier}
\author{Louis Granboulan}
\maketitle
\pagestyle{empty}
\thispagestyle{empty}

\section{Motivations}
On suppose qu'un petit groupe d'utilisateurs
travaille en commun à modifier un (ou quelques) fichier(s).
Il s'agit de proposer et de programmer un
moyen de réaliser ceci.

Il y a principalement deux sortes de solutions :
\begin{itemize}
\item donner au fichier des droits Unix
qui limitent les droits en écriture aux
utilisateurs concernés ;
\item réaliser un programme spécifique
pour éditer ce fichier.
\end{itemize}

\bigskip
Une première idée est de créer un compte
spécifique (e.g. \texttt{gourous}) qui sera
propriétaire et aura
le droit d'écrire dans ce fichier, et de donner
le mot de passe de ce compte à tous les
utilisateurs concernés.
Pour un petit nombre de fichiers, c'est écraser une
mouche avec un immeuble.

Une variante est de créer un groupe unix
dont seront memebre tous les
utilisateurs concernés.
Le fichier sera autorisé en écriture
pour les membres du groupe.

Le problème pour ces deux solutions est qu'elles
ne permettent pas de s'assurer que deux utilisateurs
n'éditent pas le fichier simultanément.
De plus, il faut être \texttt{root} pour créer
un compte ou un groupe.

\bigskip
La seconde idée est de créer un programme
spécifique d'édition de ce fichier.
Ce programme aura les droits d'écriture
(à l'aide un bit s par exemple)
et vérifiera l'identité de l'utilisateur
avant d'autoriser l'édition.
On peut imaginer que ce programme est
configurable et que le fichier de
configuration associé connait,
pour chaque fichier, la liste des
utilisateurs autorisés.

L'avantage est que n'importe qui peut mettre
en place ce système et qu'il est possible
d'y rajouter une vérification pour éviter
les accès simultanés (\texttt{lock}).
Un inconvénient est qu'à moins de créer
un compte spécifique qui ait les droits
d'écriture dans le fichier, le propriétaire
du fichier (a priori l'un des utilisateurs)
a la possibilité de contourner le système.

\section{Exercices}
Les programmes ci-dessous peuvent être réalisés
indifféremment en C, en \texttt{perl} ou en shell.
Pour changer des TP précédents, on préférera le C...

\subsection{Vérification d'appartenance à la liste des utilisateurs autorisés}
Le programme (qu'on va appeler \texttt{modif})
est appelé avec un argument, le nom du fichier
qu'on veut éditer. Il lit la liste des utilisateurs autorisés
dans son fichier de configuration (par exemple \texttt{.modifrc})
et renvoie un message qui dit si la modification de
ce fichier est autorisée pour l'utilisateur qui
a exécuté le programme.

Attention. Pour des raisons de sécurité, le fichier
\texttt{.modifrc} se trouve dans le "homedir" du
propriétaire du programme \texttt{modif}, et n'est lisible
que par celui-ci.
NB : faites des vérifications en collaboration avec votre voisin !

\ifhtml\@open{A}{HREF=tp4_ex1.c}Solution\@close{A}\fi

\subsection{Modification du fichier}
Une première solution est de programmer dans \texttt{modif}
un éditeur de texte. C'est un peu fastidieux.
Une seconde solution est d'utiliser l'éditeur préféré de
l'utilisateur (variable d'environnement \texttt{VISUAL}
ou \texttt{EDITOR}). Le programme \texttt{modif} doit
donc appeler un programme extérieur.
On utilise \texttt{system} ou \texttt{fork} et \texttt{exec}.

Modifier le programme \texttt{modif} de l'exercice précédent
pour qu'il appelle un éditeur. Réfléchir aux problèmes de
sécurité.

\subsection{Verrouillage du fichier}
Il existe des primitives pour permettre le verrouillage
d'un fichier et éviter l'édition simultanée.
Regarder \texttt{flock} et \texttt{fcntl}.
Une autre solution est de créer un fichier qui s'appelle
\texttt{filename.lock} et dont l'existence indique que le fichier
est en cours de modification\footnote{C'est ce que fait \texttt{netscape}
pour ne pas être lancé plusieurs fois.}.

Comparer ces méthodes et programmer l'une d'entre elles.

\end{document}
