TD/TP8

Transcription

TD/TP8
Université Paris Diderot
L3 Informatique
Année 2008-2009
TD/TP de Système no 8 : Création d’arborescences
Exercice 1 : mkdir récursif
On souhaite écrire une commande recmkdir qui se comporte comme mkdir -p, c’est-àdire créant les répertoires dont les noms sont passés en argument sans occasionner d’erreur
s’ils existent déjà et en créant éventuellement les ancêtres nécessaires.
1. Écrire une fonction char *next_slash(char *ref) qui remplace le premier caractère / de la chaîne ref (s’il existe) par un caractère de fin de chaîne, puis retourne
un pointeur sur ce caractère ; la fonction retournera NULL si aucun / n’est présent
dans ref.
2. Écrire une fonction int recmkdir(char *ref, mode_t mode) se comportant comme mkdir, à la nuance près que les répertoires ancêtres de ref sont créés s’ils
n’existent pas. En particulier, cette fonction retournera 0 si le répertoire a été créé,
et -1 sinon (et errno sera alors positionnée de manière appropriée).
3. Écrire la fonction main de la commande.
Exercice 2 : sauvegarde d’une arborescence par ln récursif
On souhaite écrire une commande sauv qui crée une copie d’une arborescence (repérée
par sa racine) dans une autre, en créant les sous-répertoires nécessaires et en dupliquant
les liens vers les i-nœuds des autres fichiers qu’elle contient. Le comportement attendu
varie légèrement selon que le répertoire destination existe déjà ou non, comme illustré
par l’exemple de la page suivante. Pour créer créer le fichier newname comme un lien vers
l’i-nœud de oldname, on utilisera l’appel système
int link(const char *oldname, const char *newname).
On pourra décomposer le programme en :
1. une fonction récursive void sauv_rec(char *src, char *dest) effectuant la sauvegarde du répertoire src sous le nom dest ; cette fonction créera si nécessaire le
répertoire dest avant de parcourir src pour lancer récursivement des sauvegardes
des sous-répertoires et créer des liens physiques vers les autres fichiers ;
2. une fonction void sauvegarde(char *src, char *dest) qui vérifie que la référence src est celle d’un répertoire, puis teste si dest existe ou non, avant de lancer
sauv_rec avec les arguments adaptés.
Julien Cristau, Anne Micheli, Samuel Mimram
Université Paris Diderot
L3 Informatique
lucien:~$ ls -iR *
Tata:
Titi:
2336864 fifi 2336866 loulou 2336865 riri 2336862 Toto
Titi/Toto:
2336863 Turlu 2336867 Tutu
Titi/Toto/Turlu:
2336868 chapeau
Titi/Toto/Tutu:
2336869 pointu
lucien:~$
lucien:~$ sauv Titi Tata
lucien:~$ ls -iR Tata
Tata:
2336874 Titi
Tata/Titi:
2336864 fifi 2336866 loulou 2336865 riri 2336875 Toto
Tata/Titi/Toto:
2336876 Turlu 2336877 Tutu
Tata/Titi/Toto/Turlu:
2336868 chapeau
Tata/Titi/Toto/Tutu:
2336869 pointu
lucien:~$
lucien:~$ sauv Titi Grosminet
lucien:~$ ls -iR Grosminet
Grosminet:
2336864 fifi 2336866 loulou 2336865 riri 2336879 Toto
Grosminet/Toto:
417354 Turlu 417355 Tutu
Grosminet/Toto/Turlu:
2336868 chapeau
Grosminet/Toto/Tutu:
2336869 pointu
2
Année 2008-2009