Examen de Systèmes (Licence - Janvier 1999)
Voici la séquence suivante :
<64-[18:37]> pwd
/tmp/truc
<65-[18:37]> ls -ail
total 5
160 drwxr-xr-x 5 yunes 512 Jan 18 18:37 ./
8070 drwxrwsrwt 5 root 512 Jan 18 18:36 ../
2745 drwxr-xr-x 2 yunes 512 Jan 18 18:36 bidule/
162 drwxr-xr-x 2 yunes 512 Jan 18 18:37 chose/
165 drwxr-xr-x 2 yunes 512 Jan 18 18:37 machin/
- 1.
- Combien de liens la référence "." possède-t'elle ?
- 2.
- Sauriez-vous donner la référence absolue de tous ces liens ?
En supposant qu'un disque soit composé de blocs de longueur 512 octets, qu'un
entier soit codé sur 4 octets, qu'un numéro de bloc peut être contenu dans un
entier, qu'un inœud contient 10 numéros de blocs ``directs'', 1 numéro de
bloc d'indirection, 1 numéro de bloc de double indirection et 1 numéro de bloc
de triple indirection :
- Quelles sont les longueurs des fichiers n'utilisant pas d'indirection ?
- Quelles sont les longueurs des fichiers utilisant un niveau
d'indirection ?
- Quelles sont les longueurs des fichiers utilisant deux niveaux
d'indirection ?
- Quelles sont les longueurs des fichiers utilisant trois niveaux
d'indirection ?
- Si l'on double la taille des blocs (512 -> 1024) quelle sera la
taille maximale obtenue par rapport à l'ancienne ?
<312-[19:03]> ls -ail /bin/vi
369212 -r-xr-xr-x 5 bin bin 227768 juil 16 1997 /bin/vi
<313-[19:03]> find / -inum 369212 -print
/usr/local/pvs/emacs/ilisp19/ilisp-snd.el
/usr/bin/edit
/usr/bin/ex
/usr/bin/vedit
/usr/bin/vi
/usr/bin/view
<314-<19:06]> man find
SYNOPSIS
find path... expression
DESCRIPTION
The find utility recursively descends the directory hierar-
chy for each path seeking files that match a Boolean expres-
sion written in the primaries given below.
OPERANDS
The following operands are supported:
path A path name of a starting point in the direc-
tory hierarchy.
valid expressions are:
-inum n True if the file has inode number n.
-print Always true; causes the current path name to
be printed.
Sachant que la commande ls indique que /bin/vi possède 5 liens
:
- 1.
- Pourquoi la commande find trouve-t'elle 6 références pour
l'inœud 369212 ?
- 2.
- Pourquoi la commande find ne donne pas la référence /bin/vi ?
Décrivez deux scénarios conduisant au blocage de la commande cat
/tmp/fic.
Décrivez ce qui a pu se passer pour aboutir à la situation suivante :
<322-[19:14]> pwd
/tmp
<323-[19:15]> cd truc
<324-[19:15]> pwd
pwd : impossible de déterminer le répertoire courant !
<325-[19:17]> ls
.: Ce fichier ou ce répertoire n'existe pas
Il s'agit d'écrire une commande UNIX permettant de tester si une
référence est accessible dans un mode donné par un utilisateur autre que
soi-même.
Cette commande s'appellera access et son source access.c,
prendra 3 options :
- 1.
- le nom d'un utilisateur (login),
- 2.
- une combinaison de modes d'accès : r pour la lecture, w pour
l'écriture et x pour l'exécution (ex : pour obtenir la lecture et
l'écriture on utilisera rw),
- 3.
- la référence d'un inœud.
Cette commande renverra la valeur de retour 0 en cas de succès, et autre
chose en cas d'échec. D'autre part des messages d'erreurs devront être envoyés
afin d'aider l'utilisateur à comprendre pourquoi la demande a échouée.
Voici un exemple d'utilisation de la commande :
<252-[17:46]> id
uid=1001(yunes) gid=10(staff)
<253-[17:46]> access mz r /etc/passwd
<254-[17:46]> access gastin w /etc/passwd
ecriture dans /etc/passwd impossible
<255-[17:46]> access gastin x /tmp/essai
execution de /tmp/essai impossible
<256-[17:46]> pwd
/home/automate/yunes/essai/bidule/truc/much/gnark
<257-[17:46]> access hf r .
traversee de /home/automate/yunes/essai impossible
<258-[17:50]> access bizarre rwx /tmp
access : Utilisateur bizarre inconnu
<259-[17:52]> access hf rdf /tmp
access : Mode rdf inconnu
Note : Dans la suite vous pourrez (si nécessaire) utiliser la
fonction suivante :
struct passwd *getpwnam(const char *name);
permettant de récupérer les informations relatives à l'utilisateur dont le nom
de login est name. La structure passwd comporte de nombreux
champs, mais seuls pw_uid et pw_gid vous seront utiles.
Remarque : Ne vous acharnez pas trop longtemps sur un problème
rencontré : vous pouvez toujours supposer avoir résolu ce qui est
nécessaire pour avancer.
Écrire une fonction dont le prototype sera le suivant :
void acces(int *lect,int *ecr,int *exec,struct stat *buf,uid_t u,gid_t g);
et qui calculera les valeurs de lect, ecr et exec, trois
entiers représentant la valeur de vérité correspondant respectivement à
l'accès en lecture, écriture et exécution pour l'utilisateur dont l'identité
est représentée par u et g sur l'inœud dont les
caractéristiques sont contenues dans buf.
Écrire une fonction dont le prototype sera le suivant :
char *prefixe(const char *chem,int n);
et qui renverra une référence préfixe contenant n composantes extraites
de chem.
Exemple : prefixe("/tmp/toto/truc/bidule/cuicui",3) renverra
"/tmp/toto/truc").
Soit la définition suivante :
#define M_R 1 /* Pour l'accès en lecture */
#define M_W 2 /* Pour l'accès en écriture */
#define M_X 4 /* Pour l'accès en exécution */
Écrire une fonction :
int mode(struct stat *buf,int mode,uid_t u,gid_t g);
renvoyant 0 si l'utilisateur d'identité (u,g) peut accéder
à l'inœud buf dans l'ensemble des modes combinés dans mode.
Écrire une fonction de prototype :
int accessible(const char *ch,int mode,uid_t u,gid_t g);
ch représentant une référence, mode étant une combinaison des
modes précédemment définis, u et g l'identité d'un utilisateur. La
fonction devra renvoyer 0 si le mode demandé est possible, et autre
chose sinon.
Écrire la fonction main de la commande access (pensez à tester la
validité des arguments, etc.).
Jean-Baptiste Yunes
1999-01-29