Examen de Systèmes (Licence - Janvier 1999)

Exercice

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 ?

Exercice

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 :
  1. Quelles sont les longueurs des fichiers n'utilisant pas d'indirection ?
  2. Quelles sont les longueurs des fichiers utilisant un niveau d'indirection ?
  3. Quelles sont les longueurs des fichiers utilisant deux niveaux d'indirection ?
  4. Quelles sont les longueurs des fichiers utilisant trois niveaux d'indirection ?
  5. Si l'on double la taille des blocs (512 -> 1024) quelle sera la taille maximale obtenue par rapport à l'ancienne ?

Exercice

<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 ?

Exercice

Décrivez deux scénarios conduisant au blocage de la commande cat /tmp/fic.

Exercice

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

Problème

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.

Première partie

É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.

Deuxième partie

É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").

Troisième partie

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.

Quatrième partie

É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.

Cinquième partie

Écrire la fonction main de la commande access (pensez à tester la validité des arguments, etc.).

Jean-Baptiste Yunes
1999-01-29