Ce document a été produit par HEVEA.
Votre browser peut avoir a être configuré pour afficher correctement certains symboles.
Reportez-vous à la
documentation d'HEVEA.

Licence d'informatique
Module de C/Unix
Projet Unix

real-file --- Localisation d'un fichier

Philippe Marquet

Octobre 1995

Ce document est disponible sous forme d'un fichier PostScript compressé.



Le but est d'écrire un shell-script indiquant la machine sur laquelle se trouve un fichier de nom donné en paramètre.

Dans une première partie, à partir d'un nom [nom absolu ou nom relatif] d'entrée [fichier ou répertoire], on recherche un nom absolu désignant le fichier tel qu'aucune des composantes de ce nom ne soit un lien symbolique. La commande real-name que vous allez écrire assure cette fonctionnalité.

Soient les entrées suivantes dans le système de fichiers :
% ls -ld /
drwxr-xr-x  18 root     1024    May  4 14:12 /
% ls -ld /usr
drwxr-xr-x  20 root     512     May  4 17:02 /usr
% ls -ld /usr/local
lrwxrwxrwx  21 root     512     May  6 14:11 /usr/local -> /usr/local.luxe
% ls -ld /usr/local.luxe
drwxr-xr-x   2 root     1536    May  6 14:16 /usr/local.luxe
% ls -ld /usr/local/bin
drwxr-xr-x   2 root     1536    May  9 14:16 /usr/local/bin
% ls -ld /usr/local/emacs
drwxr-xr-x   3 root     512     May  9 14:24 /usr/local/emacs
% ls -ld /usr/local/emacs/19.28
drwxr-xr-x   3 root     512     May  9 14:25 /usr/local/emacs/19.28
% ls -ld /usr/local/emacs/19.28/bin
drwxr-xr-x   3 root     512     May  9 14:27 /usr/local/emacs/19.28/bin
% pwd 
/usr/local
% ls -l bin/emacs* 
lrwxrwxrwx   2 root     13      May  9 14:42 emacs -> ./emacs-19.28
lrwxrwxrwx   2 root     24      May  9 14:42 emacs-19.28 -> ../emacs/19.28/bin/emacs
% ls -l emacs/19.28/bin/emacs
-rwxr-xr-t   2 root     3366912 May  9 14:38 emacs
Exercice 1  [Arborescence du système de fichiers]   Donnez un schéma du système de fichiers sur lequel les commandes précédentes ont été appliquées. Vous ferez figurer les liens symboliques par une représentation adéquate dans l'arbre.

Sur ce système de fichiers, la commande real-name est illustrée par les exemples suivants :
% real-name /usr/local/emacs/19.28/bin/emacs
/usr/local.luxe/emacs/19.28/bin/emacs
% real-name /usr/local/bin/emacs
/usr/local.luxe/emacs/19.28/bin/emacs
% cd /usr
% real-name local
/usr/local.luxe
% cd /usr/local
% real-name bin/emacs-19.28
/usr/local.luxe/emacs/19.28/bin/emacs
% real-name . 
/usr/local.luxe
Exercice 2  [Algorithme real-name]   Donnez une description de l'algorithme de la commande real-name. Dans une première étape vous pouvez ne pas considérer les entrées référençant le répertoire courant (.) ou le répertoire père (..).

Exercice 3  [Commande real-name]   Donnez l'implémentation en Bourne Shell de l'algorithme proposé à l'exercice précédent.

On considère maintenant les partitions disques. La commande mount [Selon les systèmes, il s'agit de /etc/mount ou de /sbin/mount.] affiche les partitions montées sur le système de fichiers.
% mount 
/dev/rz3a on / type ufs (rw)
/dev/rz3g on /usr type ufs (rw)
/dev/rz3h on /mnt type ufs (rw)
lifl:/export/home1/west on /tmp_mnt/home/west type nfs (v2, rw, soft, intr)
/var/spool/mail@lifl on /usr/var/spool/mail type nfs (v2, rw, soft, intr)
/export/local.luxe@luxe on /usr/local.luxe type nfs (v3, ro, soft, intr)
La syntaxe d'une ligne du résultat produit par la commande mount est la suivante :
<partition> on <point-de-montage> type <type> <options>
Un point-de-montage est un nom absolu dans l'arborescence du système de fichiers sous lequel la partition sera montée. Un montage peut éventuellement masquer une partie du système de fichiers si ce nom absolu correspond à celui d'un répertoire non vide.

Trois syntaxes sont acceptées pour partition :
<machine-distante>:<répertoire-distant>     (1)
<répertoire-distant>@<machine-distante>     (2)
<disque>     (3)
La syntaxe  désigne un disque situé physiquement sur la machine locale. Les syntaxes  et  sont équivalentes et autorisent le montage de répertoires << exportés >> par une machine distante.

Notez qu'une machine n'a pas le droit de << ré-exporter >> une partition montée depuis une autre machine.

Exercice 4  [Système de fichiers]   Complétez le schéma de l'arborescence du système de fichiers donné précédemment pour y faire figurer les partitions.

Le but de la commande display-partition est d'afficher la partition correspondant à un nom d'entrée donné en paramètre. Ce nom de partition est recherché à partir du nom retourné par la commande real-name sur le paramètre.

Sur l'exemple précédent, on obtient les résultats suivants :
% display-partition /usr/local
/export/local.luxe@luxe
% display-partition /usr/local/bin/emacs
/export/local.luxe@luxe
Exercice 5  [Algorithme de la commande display-partition]   Donnez une description de l'algorithme de la commande display-partition.

Exercice 6  [Commande display-partition]   Donnez l'implémentation en Bourne Shell de l'algorithme proposé à l'exercice précédent.

Le résultat retourné par la commade display-partition peut comporter des composantes qui sont des liens symboliques. L'option -t (-true) de la commande display-partition assure qu'aucune des composantes de ce résultat n'est un lien symbolique. Pour cela, il est nécessaire d'exécuter des commandes sur la machine distante exportant la partition. On utilise alors une commande à distance (remote-command). La syntaxe de rsh utilisée sera la suivante :
rsh <machine-distante> <commande> [<argument>]
Pour que cette commande puisse s'exécuter, il peut être nécessaire d'ajouter une ligne de la forme suivante dans le fichier $HOME/.rhosts (cf. man rhosts):
<machine-locale> <utilisateur>
On veillera à restituer le fichier $HOME/.rhosts dans son état initial après l'exécution de la commande à distance.

Exemple :
% hostname
bock
% display-partition /usr/local
/export/local.luxe@luxe
% rsh luxe ls -ld /export/local.luxe
permission denied
% cat >> ~/.rhosts
bock marquet
% rsh luxe ls -ld /export/local.luxe
drwxr-xr-x   2 root     1236    May  2 12:14 /export/local.luxe
Il est possible que l'utilisateur n'ait pas le droit de lancer une commande distante sur la machine sur laquelle réside la partition référencée, par exemple parce qu'il n'a pas le droit de se connecter sur le serveur exportant cette partition. Dans ce cas, la commande display-partition -t l'indiquera par une valeur de retour appropriée (i.e. strictement positive).

Exercice 7  [Option -t de display-partition]   Donner l'algorithme et son implémentation en Bourne Shell de la commande display-partition [-t].

À partir des informations précédentes, on développe maintenant la commande real-file qui affiche le nom d'une entrée dans le système de fichiers passée en paramètre sous la forme
<nom-de-fichier>@<machine>
telle que le nom de fichier retourné corresponde à une entrée dans le système de fichiers monté sur une partition locale à la machine et telle qu'aucune des composantes de ce nom ne soit un lien symbolique.

Voici quelques exemples d'utilisation de cette commande [On suppose que /export/local.luxe/emacs/19.28/bin/emacs sur la machine luxe ne comporte pas de liens symboliques] :
% real-file /usr/local/bin/emacs
/export/local.luxe/emacs/19.28/bin/emacs@luxe
% hostname
bock
% real-file /usr
/usr@bock
Pour le cas ou l'utilisateur ne peut avoir confirmation que le nom retourné par la commande display-partition -t ne contient pas de liens symboliques, la commande real-file retourne une valeur strictement positive.

Exercice 8  [Algorithme de la commande real-file]   Donnez une description de l'algorithme de la commande real-file

Exercice 9  [Commande real-file]   Donnez l'implémentation en Bourne Shell de l'algorithme proposé à l'exercice précédent.

On étend maintenant la commande real-file pour supporter l'option -d (-disk) qui retourne le résultat sous la forme
<nom-de-fichier>@<machine>:<disque>
indiquant le nom du disque physique sur lequel le fichier est présent sur la machine donnée. Il est nécessaire de connaître le résultat de la commande mount sur cette machine donnée. Pour ce faire, on peut à nouveau être amené à utiliser une commande à distance (remote-command).

Exemple :
% hostname
bock
% real-file /usr/local/bin/emacs
/export/local.luxe/emacs/19.28/bin/emacs@luxe
% rsh luxe /etc/mount
/dev/rz3a on / type ufs (rw)
/dev/rz3g on /usr type ufs (rw)
/dev/rz3b on /export type ufs (rw)
/dev/rz3h on /mnt type ufs (rw)
lifl:/export/home1/west on /tmp_mnt/home/west type nfs (v2, rw, soft, intr)
/var/spool/mail@lifl on /usr/var/spool/mail type nfs (v2, rw, soft, intr)
% real-file -d /usr/local/bin/emacs
/export/local.luxe/emacs/19.28/bin/emacs@luxe:/dev/rz3b
Si l'utilisateur n'a pas le droit de lancer une commande distante sur la machine sur laquelle réside la partition référencée, la commande real-file -d l'indiquera par une valeur de retour appropriée (i.e. strictement positive) et fournira le résultat sous la forme
<nom-de-fichier>@<machine>:

Exercice 10  [Option -d de real-file]   Donner l'algorithme et son implémentation en Bourne Shell de la commande real-file [-d].

Réalisation du projet

Vous devez rendre (sous une forme à définir avec votre enseignant de TD/TP) :
Ce document a été traduit de LATEX par HEVEA.