Si avec le programme de lecture du chapitre 8, nous essayons
de lire un répertoire, nous avons une erreur qui indique que le fichier lu
n’est pas un fichier mais un répertoire !! Donc il nous faut trouver un
autre appel système qui traite les répertoires. Nous trouvons un READDIR code
89 mais un premier test retourne une erreur -38 : appel non implémenté.
Enfin nous trouvons un appel GETDENTS code 8D qui fonctionne. Cet appel donne à
l’adresse passée dans le registre r1 une structure qui contient des entrées
composées entre autres de l’identification des fichiers et leurs noms. Pour
certainement un gain de place, les noms ne sont pas stockés dans une zone de
longueur fixe mais dans une zone de longueur variable. Ainsi pour connaitre
l’emplacement de début de l’entrée suivante chaque entrée contient le
déplacement (offset) qui permet d’aller à l’entrée suivante.
Voyons ce petit programme qui accède à un répertoire, qui
affiche le nom de chaque fichier qui compose le répertoire et son type. Voici
le lien vers le source du programme lectdir2.s.
Tout d’abord, nous trouvons une série de constantes pour les
types des fichiers possibles puis les libellés des messages d’erreurs ou de
résultats et la description de la structure utilisée.
Dans la partie code, nous effectuons comme précédemment
l’ouverture du répertoire puis la lecture des données dans un buffer avec
l’appel GETDENTS. Nous affichons le contenu de ce buffer par notre routine
habituelle de vidage pour vérification puis nous entrons dans une boucle qui va
afficher le nom du fichier. Ce nom est récupéré grâce à l’instruction : add
r0,r2,#Dir_name r2 contenant l’adresse
de début du buffer. Ensuite nous effectuons le calcul de l’adresse de l’entrée
suivante car le type du fichier que nous venons d’afficher se trouve au caractère
précèdent l’entrée suivante (ouf !!). En fonction de ce type nous
affichons le message correspondant. (ici je me suis contenté de n’afficher que
les types fichiers et répertoires). Et nous terminons en bouclant.
Remarquez que rien n’indique la fin des entrées stockées
dans la structure. Il nous faut donc conserver le nombre d’octets lus dans le
registre r6 et à chaque entrée traitée il faut ajouter sa longueur au registre
r7 . Ceci permet de comparer les 2 registres et d’arrêter la boucle quand
tous les octets sont traités.
Exercice :
compléter le programme avec les autres types de fichiers.
Afficher
toutes les informations de chaque entrée (inode, offset, longueur).
Éliminer
de l’affichage les 2 répertoires Unix . et .. (au fait savez-vous à quoi ils
correspondent ?)
Aucun commentaire:
Enregistrer un commentaire