Ouverture
Un appel à la fonction :
desc_t ifs_opendir(char *reference) ;
ouvre en lecture le répertoire de reference spécifiée et renvoie un objet de type desc_t (type des descripteurs de fichiers), et en cas d’échec l’élément renvoyé est -1.
Fonctionnement :
-Envoie de la requête au serveur(OPENDIR)
-Le serveur appelle la fonction
void odir(requete *query, reponse *rep) ;
-odir fait appel à la fonction
desc_t open_dir(USHORT disc_num,char *rep_name);
-open_dir:
récupération du numéro d’inode
vérification de la présence de l’inode du répertoire en mémoire
si l’inode n’est pas en mémoire :
-récupération de la structure d’inode
-chargement de la structure d’inode dans la table des nœuds en mémoire.
création d’une référence dans la table des fichiers ouverts
retourne l’indice dans la table des fichiers ouverts.
-réception de la réponse.
Lecture des entrées de répertoire
Un appel à la fonction :
entreerep_p ifs_readdir(desc_t descripteur) ;
lit l’enregistrement courant dans le répertoire associé au descripteur et place le pointeur d’enregistrement courant sur le suivant .En cas de succès renvoie un objet de type entreerep_p(type des pointeurs sur le entrées de répertoire) et en cas d’échec renvoie le pointeur NULL.
Fonctionnement:
-Envoie de la requête au serveur(READDIR)
-Le serveur appelle la fonction
void rdir(requete *query, reponse *rep);
-rdir fait appel à la fonction read_dir
int read_dir(desc_t ifs_descr, entree_repertoire *dir_entr);
-read_dir :
Récupération du numéro d’inode
Si la position de la tête de lecture est supérieur ou égale au nombre d’entrée du répertoire, dir_entr=NULL et on retourne –1
Sinon on fait appel à la fonction
int read_dir_entr(USHORT disc_num,entree_repertoire *dir_entr,USHORT rep_ino_num,USHORT entr_num);
et on incrémente la position courante.
Fermeture
Un appel à la fonction :
int ifs_closedir(desc_t descripteur) ;
ferme le répertoire associé au descripteur . En cas de succès renvoie 1 et en cas d’échec –1.
Fonctionnement :
-Envoie de la requête au serveur(CLOSEDIR)
-Le serveur fait appel à la fonction cdir
void cdir(requete *query, reponse *rep);
-cdir fait appel à la fonction close_dir
int close_dir(desc_t ifs_descr);
-close_dir :
Récupération du numéro d’inode dans la table
décrémentation du nombre de fichier ouvert sur ce nœud
suppression de l'entrée dans la table des fichier ouverts
Ecriture de l'inode dans la table des caches
Création
Un appel à la fonction :
int ifs_mkdir(char *reference);
permet la création d’un répertoire reference et renvoie 1 en cas de succès et –1 en cas d’échec.
Fonctionnement :
-Envoie de la requête au serveur(MKDIR)
-Le serveur fait appel à la fonction mdir
void mdir(requete *query,reponse *rep);
-mdir fait appel à la fonction
int make_dir(USHORT disc_num,USHORT father_node_num,char *dir_name);
-make_dir:
Recherche du numéro du nœud père et du numéro du répertoire a créer
Test si l'entrée existe déjà ou non
Récupération d'un nouvel inode
Création de la structure d'inode
création des liens . et ..
création d'un liens dans le répertoire père
Changement du répertoire courant
Un appel à la fonction :
int ifs_chdir(char *ref) ;
permet de modifier le répertoire de travail et où ref correspond au nouveau répertoire de travail. En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(CHDIR)
-Le serveur fait appel à la fonction ch_dir
void ch_dir(requete *query,reponse *rep);
-ch_dir:
Conversion de la référence en numéro d’inode(avec la fonction ref2ino)
Vérification que le nœud est bien un répertoire
Récupération du numéro du disque
L’inode du répertoire courant dans la table des disques reçoit l’inode du nouveau répertoire courant.
Effacement
Un appel à la fonction :
int ifs_rmdir(char *reference);
permet la suppression des liens de répertoire correspondant à reference.
En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(RMDIR)
-Le serveur fait appel à la fonction rm_dir
void rm_dir(requete *query,reponse *rep) ;
-rm_dir fait appel à la fonction del_dir
int del_dir(USHORT disc_num,USHORT father_node_num,char *dir_name);
-del_dir:
Récupération de l'inode du répertoire
Vérification que le répertoire est bien vide
Vérification que l'inode du répertoire n'est pas ouvert
Suppression du liens dans le répertoire père (avec del_dir_entry )
Libération de l'inode (avec new_free_node)
Changement du disque courant
Un appel à la fonction :
int ifs_chdisc(char *disc_name) ;
permet de modifier le disque de travail et où disc_name correspond au nouveau disque de travail. En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(CHDISC)
-Le serveur fait appel à la fonction ch_disc
int ch_disc(char *disc_name) ;
-ch_disc :
Attribution de disc_num(un premier numero) au nom du disque avec la fonction de hachage
Tant que le compteur est inférieur au nombre maximum de disques(MAX_DEV), et le numéro du disque donné est vide dans la table des disques ou si les noms des disques sont différents, on incrémente disc_num et le compteur
Si le compteur est plus grand ou égale au nombre maximum de disques(MAX_DEV), on retourne erreur
Le numéro du disque courant dans la table des disques reçoit le nouveau numéro du disque courant
On retourne disc_num, le numéro du disque courant.
Changement du disque courant en passant son numéro
Un appel à la fonction :
int ifs_chdisc_num(int disc_num) ;
permet de modifier le disque de travail et où disc_num correspond au numéro du nouveau disque de travail. En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(CHDISCNUM)
-Le serveur fait appel à la fonction ch_disc_num
int ch_disc_num(USHORT disc_num);
-ch_disc_num :
Si le numéro du disque dans la table des disques est vide, on retourne erreur
Sinon, le numéro du disque courant dans la table des disques reçoit le nouveau numéro du disque courant
On retourne disc_num, le numéro du disque courant.
c) Récupération du numéro du disque courant
Un appel à la fonction :
int curdisc_num() ;
permet de récupérer le numéro du disque courant. En cas de succès renvoie le numéro du disque courant et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(CURDISC)
-Le serveur fait appel à la fonction curdisc
void curdisc(requete *query,reponse *rep);
-curdisc:
Récupération des caractéristiques d'un inode à partir du nom
Un appel à la fonction :
int ifs_stat(char *reference, stat_p buf);
permet d’obtenir les informations sur l’inode de nom reference et les stocke dans buf (objet de type pointeur sur ifsstat). En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(STAT)
-Le serveur remplit une structure ifsstat permettant de récupérer des informations sur un node, et les envoie.
typedef struct ifsstat{
USHORT disc_num;//numéro du disque contenant le fichier
USHORT node_num;//numéro du noeud sur ce disc
USHORT type;//type du fichier
USHORT liens;//nb de liens vers se nœud
USHORT icone;//numéro du nœud de l'icône associé a ce fichier
USHORT taille;//taille du fichier en octet pour les FO,I Rep
}ifsstat;
Récupération des caractéristiques d'un inode à partir du descripteur
Un appel à la fonction :
int ifs_fstat(desc_t descripteur,stat_p buf) ;
permet d’obtenir les informations sur l’inode à partir du descripteur et les stocke dans buf (objet de type pointeur sur ifsstat). En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(FSTAT)
-Le serveur remplit la structure ifsstat permettant de récupérer des informations sur un node, et les envoie.
Lier un fichier à un icône
Un appel à cette fonction :
int ifs_linkicone(char *reference, char *icone);
permet de créer un nouveau lien physique déduit de la référence icône sur le fichier existant de référence reference. En cas de création du lien renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(LNICO)
-Le serveur fait appel à la fonction lnico
void lnico(requete *query, reponse *rep);
-lnico:
Récupération des références du fichier et de l'icône
Récupération du nom du disc et du chemin pour le fichier(parse_discref)
Récupération du nom du disc et du chemin pour l'icône(parse_discref)
Récupération du numéro du disc du fichier et de son numéro d'inode(discname2num)
Récupération du numéro du disc de l'icône et de son numéro d'inode(discname2num)
Vérification que le fichier icône est un fichier icône et que le fichier de destination n'est pas un fichier icône(read_ino)
Changement du champs icône dans l'inode du fichier
Si le nœud est en mémoire on change dans la mémoire sinon on écrit le nœud dans la table des caches(node_in_mem, write_ino)
Suppression de la liaison entre un icône et un fichier
Un appel à la fonction
int ifs_unlinkicone(char *reference);
supprime le lien correspondant à la référence reference donnée.
En cas de suppression du lien renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(ULNICO)
-Le serveur fait appel à la fonction ulnico
void ulnico(requete *query,reponse *rep);
-ulnico:
Récupération du nom du disque et de a référence du fichier(parse_discref)
Récupération du numéro du disque et du numéro d'inode du fichier(discname2num)
Changement de la valeur du champs icône dans l'inode(read_ino)
Si le nœud est en mémoire on change dans la mémoire sinon on écrit le nœud dans la table des caches(node_in_mem).
Ouverture d'un fichier
Un appel à la fonction
desc_t ifs_open(char *reference, int mode, int type) ;
renvoie le descripteur correspondant à l’ouverture du fichier de référence reference donné pour les opérations spécifiée par le mode d’ouverture. En cas d’échec elle renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(FOPEN)
-Le serveur fait appel à la fonction ifs_open_file(ouvre un fichier déjà créer)
int ifs_open_file(char *ref,int mode) ;
-ifs_open_file :
Récupération du nom du disque et du chemin(parse_discref)
Récupération du numéro du disque et du numéro d'inode(discname2num, ref2ino)
Regarder si l'inode n'est pas en mémoire
S'il n'est pas dans la mémoire on crée une structure mem_node et on l'insère dans la table(node_in_mem, read_ino)
Recherche d'un emplacement libre dans la table
Création d'une référence dans la table des fichiers ouverts
Retourne l'indice dans la table des fichiers ouverts
Fermeture d'un fichier
Un appel à la fonction :
int ifs_close(desc_t descripteur) ;
ferme le fichier associé au descripteur descripteur. En cas de succès renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(FCLOSE)
-Le serveur fait appel à la fonction ifs_close_file
int ifs_close_file(desc_t descripteur) ;
-ifs_close_file :
Décrémentation du nombre de fichier ouvert sur ce nœud
Suppression de l'entrée dans la table des fichier ouverts
Si le nombre de liens est nulle alors, on supprime le fichier(ifs_del_file_content_num, new_free_node)
Ecriture de l'inode dans la table des caches(write_ino)
Liaison physique d'un fichier
Un appel à la fonction :
int ifs_link(char *src,char *dst);
permet de créer un nouveau lien physique déduit de la référence dst sur le fichier existant de référence src. En cas de création du lien renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(LN)
-Le serveur fait appel à la fonction lnfile
void lnfile(requete *query,reponse *rep);
-lnfile:
Récupération des références de la source et de la destination
Récupération du nom du disc et du chemin pour la source(parse_discref)
Récupération du nom du disque et du chemin pour la destination(parse_discref)
Comparaison des noms des disques : si ils sont différent erreur : pas de liens d'un disque a l'autre
Récupération du numéro du disque et du numéro d'inode pour la source(discname2num, ref2ino)
Vérification que la source n'est pas un répertoire(read_ino)
Récupération du numéro d'inode du répertoire père et du nom de la destination
en vérifiant que l'entrée n'existe pas déjà(newref2ino)
Ajout de l'entrée de répertoire(add_dir_entry)
Suppression d'une liaison physique d'un fichier et suppression du fichier le cas échéant
Un appel à la fonction :
int ifs_unlink(char *src);
supprime le lien correspondant à la référence src donnée, le cas échéant supprime le fichier src. En cas de suppression renvoie 1 et en cas d’échec renvoie –1.
Fonctionnement :
-Envoie de la requête au serveur(UNLN)
-Le serveur fait appel à la fonction unlnfile
void unlnfile(requete *query, reponse *rep);
-unlnfile:
Récupération du nom du disc et de la référence du fichier(parse_discref)
Récupération du numéro du disc et de l'inode du fichier(discname2num, ref2ino)
Récupération du numéro du nœud du répertoire(cutref, ref2ino)
Suppression de l'entrée de répertoire(del_dir_entry)
Si le compteur de liens est nul alors on supprime le contenu puis le nœud s’il n'est pas en mémoire(ifs(del_file_entry, node_in_mem, write_ino, new_free_node)