Plusieurs à éditer un fichier

Objectif

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 deux approches possibles :
  1. Donner au fichier des droits Unix qui limitent les droits en écriture aux utilisateurs concernés ; 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 root pour créer un compte ou un groupe.

  2. Réaliser un programme spécifique pour éditer ce fichier. Ce programme vérifiera l'identité de l'utilisateur avant d'autoriser l'édition. On préfère un programme configurable dont le fichier de configuration indique pour chaque fichier géré par le programme 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 (lock). Un inconvénient est qu'à moins de créer un compte réservé à cet usage (par exemple appelé cvs) le propriétaire du fichier (qui est a priori l'un des utilisateurs) a la possibilité de contourner le système de verrous.

    Pour l'édition du fichier, trois techniques peuvent être imaginées.

Exercices

Le programme modif peut être réalisé indifféremment en C, en perl ou en shell. Pour changer des TP précédents, on préférera le C...

Vérification d'appartenance à la liste des utilisateurs autorisés

Le programme 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 .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é, on place le fichier .modifrc dans le homedir du propriétaire du programme modif, et on s'arrange pour qu'il ne soit lisible que par celui-ci. NB : faites des vérifications en collaboration avec votre voisin !
Solution

Modification du fichier

Modifier le programme de l'exercice précédent pour qu'il appelle un éditeur externe, selon les variables d'environnement VISUAL ou EDITOR. On utilise system ou fork et exec (vous verrez ces fonctions en détail plus tard).
Réfléchir aux problèmes de sécurité. Regarder par exemple la description du shell /usr/lib/rsh (Solaris) ou /usr/libexec/smrsh (FreeBSD).

Verrouillage du fichier

Il existe des primitives pour permettre le verrouillage d'un fichier et éviter l'édition simultanée. Regarder flock et fcntl. Une autre solution, a priori plus simple à implanter, est de créer un fichier qui s'appelle filename.lock et dont l'existence indique que le fichier est en cours de modification (c'est par exemple ce que fait netscape pour ne pas être lancé plusieurs fois).

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