Sommaire - Description - API

2)Les fonctions auxiliaires


2.1) Les fonctions de traitement des répertoires


a)lecture d’une entrée de répertoire:

-read_dir_entr

int read_dir_entr(USHORT disc_num,entree_repertoire *dir_entr,USHORT rep_ino_num,USHORT entr_num);

-la fonction read_dir_entr fai appel à la fonction offset2addr

-lecture du bloc rep avec read_bloc_rep.

-et enfin sauvegarde avec memcpy.


-offset2addr:

int offset2addr(USHORT disc_num,USHORT node_num,int offset,byte_addr *adresse);

Cette fonction permet la conversion d'un offset en adresse, il faut faire attention à ce que le bloc d'arrivé est déjà été attribué sous peine de se retrouver n'importe où.

  1. conversion de l'offset en indice de blocs logiques

  2. conversion en nombre de blocs d'index à parcourir

  3. lecture dans la partie de l'inode

  4. construction de l'adresse selon les cas

Renvoie 1 en cas de succès -1 le cas échéant.


-la fonction ref2ino permet la conversion d’une référence absolue ou relative en un numéro d’inoeud.


b) suppression d’une entrée de répertoire

-del_dir_entry:

int del_dir_entry(USHORT disc_num,USHORT dir_node_num,char *ent_name);


-Fonctionnement:

  1. Récupération de la structure d'inode

  2. récupération du numéro de la dernière entrée

  3. récupération du numéro de l'entrée a supprimer

  4. si nécessaire, on remplace l'entrée à éliminer par la dernière entrée

  5. élimination de la dernière entrée: si l’entrée est en début de bloc, il faut rendre ce bloc libre ainsi que, éventuellement, le bloc d'index qui le contient

  6. si l'entre est la première d'un bloc d'index il faut le libérer

  7. récupération de l'adresse du bloc d'index précèdent : par sécurité, on fait pointe sont champ next sur IFS_NULL

  8. diminution de la taille de l'inode

  9. écriture de l'inode


c) ajout d’une entrée de répertoire

-add_dir_entry:

int add_dir_entry(USHORT disc_num,USHORT dir_node_num,char *ent_name,USHORT link_num);


-Fonctionnement:

  1. test sur la longueur du nom

  2. création de l'entre du répertoire

  3. récupération de l'adresse du dernier bloc écrit

  4. si l'inode est plein : création d'un bloc d'index

  5. si l'index est plein : création d'un nouvel index

  6. si le dernier bloc est complet, on en crée un autre

  7. mise a jour du nombre de lien dans la cible



d) cutref:

Coupe une référence en deux partie : une partie chemin du répertoire et l'autre nom du fichier ou du dernier répertoire

void cutref(char *ref,char *finref,char *debref);



2.2) Les fonctions de traitement des disques

a) hash_func

fonction de hachage qui attribut un premier numéro en fonction du nom du disque

USHORT hash_func(char * name);


b) parse_discref:

int parse_discref(char *ref,char *disc_ref,char *dir_ref);

sépare le nom du disc du nom du répertoire dans une référence le disque est délimite par les caractères :nom_du_disque: , dans le cas ou l'une des deux refrerence (disc_ref ou dir_ref n'existeraient pas elle pas elle contient '\0'.


Fonctionnement :

  1. si le premier caractère n'est pas ':' alors le disque n'est spécifie

  2. sinon, on parse à l’aide de strncpy.




c) discname2num:

calcul du numéro du disc a partir de son nom

int discname2num(char *disc_name);



2.3) Les fonctions de traitement des inœuds


a) lecture d'un inode sur le disque

-read_ino:

int read_ino(USHORT disc_num,inode *ino,USHORT ino_num);

vérifie si le nœud n'est pas en mémoire et si c'est le cas , le charge à partir de la table des nœuds.


b) écriture d'un inode sur le disque

-write_ino:

int write_ino(USHORT disc_num,inode ino,USHORT ino_num);

vérifie si le nœud n'est pas en mémoire et si c'est le cas, il l'écrit dans la table es nœuds


c) ref2ino:

la fonction ref2ino permet la conversion d’une référence absolue ou relative en un numéro d’inoeud.

int ref2ino(USHORT disc_num,char *ref);



d) new_ref2ino:

int newref2ino(USHORT disc_num,char *ref,char *newref);

conversion d'une référence absolue ou relative dont l' un des membres n'a pas été crée en un numéro d'inode du père et le champ newref contient le nom qui n'existe pas.



e)-new_free_node: fonction rendant un inode allouable:

int new_free_node(USHORT disc_num,USHORT node_num);


-Fonctionnement:

  1. vérification de la validité du numéro

  2. si la table des inodes en accès rapide n'est pas pleine, on y met le nœud.

  3. positionnement du bit 1 à la bonne place.

  4. incrémentation de la variable qui compte le nombre d'inodes libres


f) node_in_mem

fonction booléenne renvoyant l'indice dans la table des nœud si le nœud est déjà en mémoire -1 i il n'y est pas

int node_in_mem(int disc_num,int node_num);


2.4) Les fonctions de traitement des fichiers


a) ifs_del_file_content_num :

fonction supprimant le contenu d'un fichier et libérant la mémoire associé mais ne supprimant pas le nœud

int ifs_del_file_content_num(int disc_num,int file_num) ;


Fonctionnement:

  1. vérification que ce n'est pas un répertoire

  2. libération des bloc utilisés et diminution de la taille

  3. si le bloc d'index est l'inode

  4. récupération du bloc d'index

  5. libération du bloc index



b)ifs_del_file_content :

fonction supprimant le contenu d'un fichier et libérant la mémoire associé mais ne supprimant pas le nœud

int ifs_del_file_content(char *ref) ;


Fonctionnement :

  1. récupération du nom du disc et du nom du fichier

  2. récupération du numéro du disque et du numéro d'inode

  3. récupération du nœud soit en mémoire soi sur le disque

  4. si la tailles t nulle il n'y a rien a faire

  5. vérification que ce n'est pas un répertoire

  6. libération des bloc utilisés et diminution de la taille

  7. si le bloc d'index est l'inode

  8. si le bloc est dans un index :

-récupération du bloc d'index

-libération du bloc index

  1. écriture du nœud


c) fonction qui écrit dans un fichier

int write_file(desc_t descripteur,void *tampon,int taille);

write_file:

vérification du mode d'ouverture

allocation du premier bloc dans le cas ou a taille est nulle

tant que la taille du fichier est strictement inférieur a l'offset, on remplit le vide avec des zéro jusqu'a ce que la taille et l'offset sont égaux

récupération du numéro du bloc contenant l'octet à écrire(celui d'indice taille)

récupération du bloc

calcul de l'indice de l'octet dans ce bloc

tant que le bloc n'est pas plein ou que la taille n'est pas égale à l'offset, on met des 0 dans le bloc

écriture du bloc

allocation du prochain bloc selon les cas si le dernier bloc est plein

tant que l'offset est strictement inférieur à la taille et que le nombre écrit ne dépasse pas la limite, on modifie les blocs du fichier sans changer la taille

récupération du numéro bloc contenant l'octet à écrire(celui d'indice offset)

récupération du bloc

calcul de l'indice de l'octet dans ce bloc tant que le bloc n'est pas plein ou que l'offset et la taille soit égale ou que le nombre écrit n'a pas atteint la limite, on change les octets

écriture du bloc

quand l'offset est égale a la taille, il faut penser à allouer de nouveau bloc quand c'est nécessaire

récupération du numéro bloc contenant l'octet a écrire(celui d'indice offset ou taille)

récupération du bloc

calcul de l'indice de l'octet dans ce bloc tant que le bloc n'est pas plein ou que le bloc à écrire n'a pas atteint la limite printf("write : le caractère écrit est %c\n",*cur_car);, on change les octets

écriture du bloc

si le dernier bloc est plein, il faut en alloué un autre

allocation du prochain bloc selon les cas si le dernier bloc est plein

retourne le nombre de caractères écrits


d) fonction qui lit dans un fichier

int read_file(desc_t descripteur,void *tampon,int taille);

read_file:

vérification du descripteur

tant que le nombre d'octet lu est inférieur à la limite et que l'offset est inférieur à la taille, on remplit le tampon

récupération du numéro du bloc contenant l'octet à lire(celui d'indice offset)

récupération du bloc

calcul de l'indice de l'octet dans ce bloc

tant que le bloc n'a pas été lu en entier ou que l'offset n'est pas arrivé a la fin du fichier ou que le nombre limite n'a pas été atteint, on lit les octets du bloc

retourne le nombre de caractères lus



e) fonction qui change l’offset du fichier

int seek_file(desc_t descripteur,pos_t position,int mode);

seek_file:

calcul de la nouvelle position par rapport au début du fichier

remplacement de la valeur dans la table des fichiers ouverts

à la fin on retourne l'offset courant


Sommaire - Description - API