jeudi 9 novembre 2017

Chapitre 10 : lecture d'un répertoire



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