Seyshell
Loading...
Searching...
No Matches
Functions
disk.c File Reference

Implémentation des primitives de bas niveau et des commandes du Système de Gestion de Fichiers (SGF). More...

#include "disk.h"
#include "env.h"
#include "struct.h"
#include <linux/limits.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
Include dependency graph for disk.c:

Functions

int init_inode_in_disk (disk *d, int inode_index, int filetype, unsigned short perms, int owned_bloc)
 Initialise les métadonnées d'un inode spécifique directement sur le disque.
 
int find_free_bloc (disk *d)
 Parcourt le vecteur d'allocation pour trouver et réserver le premier bloc libre détecté.
 
int find_offset_in_parent_bloc (bloc *parent_bloc)
 Calcule la première position disponible (offset en octets) au sein d'un bloc parent de type répertoire.
 
int is_dir_empty (disk *d, int bloc_index)
 Vérifie si un bloc de répertoire donné est vide.
 
int is_file_empty (disk *d, int bloc_index)
 Scanne l'intégralité d'un bloc de fichier pour valider s'il ne comporte que des zéros.
 
int allocate_node (disk *disk, inode *parent, char *name, char type)
 Alloue un nouvel inode et met à jour les liaisons structurelles dans le répertoire parent.
 
int remove_inode (disk *disk, inode *parent, inode *inode_to_remove, int inode_to_remove_idx)
 Supprime physiquement un inode, libère ses ressources blocs et efface sa référence chez son parent.
 
int do_rmdir (disk *disk, char *filepath)
 Commande système rmdir. Supprime un répertoire vide identifié par son chemin absolu.
 
int do_rm (disk *disk, char *filepath)
 Commande système rm. Supprime un fichier classique ou un lien symbolique.
 
int create_file (disk *disk, inode *parent, char *filename)
 Précise la création d'un nœud d'index typé comme Fichier Régulier (TYPE_FILE).
 
int create_directory (disk *disk, inode *parent, char *dirname)
 Conçoit un sous-répertoire complet et initialise ses entrées auto-référentielles (. et ..).
 
int check_if_name_is_already_taken (char *name, int dir_index, disk *d)
 Détermine si une chaîne textuelle de nommage est déjà enregistrée dans les entrées du répertoire ciblé.
 
int do_touch (disk *d, char *filepath)
 Commande système touch. Crée un nouveau fichier vide à l'emplacement indiqué.
 
int do_mkdir (disk *d, char *dirpath)
 Commande système mkdir. Génère une arborescence de sous-répertoire d'après un chemin fourni.
 
void write_in_file (disk *d, int file_index, char *data, char mode)
 Injecte du contenu texte dans le premier bloc alloué d'un inode fichier selon deux modes d'écriture.
 
int get_number_of_free_blocs (disk *d)
 Calcule le volume de stockage disponible en comptabilisant le nombre de blocs non possédés.
 
int get_number_of_inode_left (disk *d)
 Mesure la quantité d'inodes résiduels disponibles au sein de la table d'inodes globale.
 
int do_df (disk *d)
 Commande système df. Affiche les statistiques d'utilisation de l'espace disque et des inodes.
 
int find_dir_inode_by_name (char *name, int dir_index, disk *d)
 Parcourt les entrées d'un répertoire pour extraire l'ID numérique de l'inode correspondant à un nom donné.
 
int do_ls (disk *d, char *path)
 Commande système ls. Liste l'ensemble des éléments compris dans un répertoire.
 
char * read_in_file (disk *d, int file_index)
 Extrait et copie l'intégralité du texte stocké dans le premier bloc de données d'un fichier.
 
int do_cat (disk *disk, char *path_to_file)
 Commande système cat. Affiche le contenu d'un fichier ou redirige l'entrée standard.
 
int redirect_out (disk *d, int mode, char *file, int in)
 Redirige le flux de données lu depuis un descripteur d'entrée vers un fichier spécifié de notre SGF.
 
disk create_disk ()
 Formate et initialise un tout nouveau disque virtuel brut nommé "disk" sur le support hôte.
 
disk open_disk (char *filename)
 Ouvre un fichier conteneur physique existant sur le système hôte pour charger sa structure logique en mémoire RAM.
 
void persist_on_disk (disk *d)
 Synchronise (sauvegarde) l'arborescence logique en mémoire vive dans le conteneur physique "disk".
 

Detailed Description

Implémentation des primitives de bas niveau et des commandes du Système de Gestion de Fichiers (SGF).

Function Documentation

◆ allocate_node()

int allocate_node ( disk disk,
inode parent,
char *  name,
char  type 
)

Alloue un nouvel inode et met à jour les liaisons structurelles dans le répertoire parent.

  • Cette fonction bas niveau réalise l'équivalent d'une allocation de nœud d'index : recherche d'un inode libre, recherche d'un bloc de données libre, inscription du couple [Nom, ID Inode] dans le parent, et appel à l'initialisation.
  • Parameters
    diskPointeur vers le disque virtuel.
    parentPointeur vers l'inode du répertoire parent devant accueillir la référence.
    nameNom textuel de la nouvelle entrée.
    typeType de fichier à créer (TYPE_FILE, TYPE_DIRECTORY).
    Returns
    int L'indice du nouvel inode créé avec succès, ou -1 en cas d'erreur (Inodes pleins, Disque plein, Répertoire parent saturé).

◆ check_if_name_is_already_taken()

int check_if_name_is_already_taken ( char *  name,
int  dir_index,
disk d 
)

Détermine si une chaîne textuelle de nommage est déjà enregistrée dans les entrées du répertoire ciblé.

  • Parameters
    nameChaîne de caractères (Nom recherché).
    dir_indexIdentifiant numérique de l'inode de répertoire à examiner.
    dPointeur vers le disque virtuel.
    Returns
    int 1 si le nom existe déjà (conflit de nom), 0 si le nom est disponible, -1 en cas d'index invalide.

◆ create_directory()

int create_directory ( disk disk,
inode parent,
char *  dirname 
)

Conçoit un sous-répertoire complet et initialise ses entrées auto-référentielles (. et ..).

  • Parameters
    diskPointeur vers le disque virtuel.
    parentPointeur vers l'inode du dossier parent.
    dirnameNom du nouveau dossier.
    Returns
    int L'indice du nouvel inode de dossier créé, ou -1 en cas d'erreur d'écriture ou d'allocation.

◆ create_disk()

disk create_disk ( )

Formate et initialise un tout nouveau disque virtuel brut nommé "disk" sur le support hôte.

  • Cette fonction crée la structure logique de base : vidage des tables, initialisation de la racine /, création automatique des liens auto-référencés . et .. sur le bloc 0, et génération d'un fichier de test.
  • Returns
    disk La structure de données mémoire représentant le disque nouvellement formaté.

◆ create_file()

int create_file ( disk disk,
inode parent,
char *  filename 
)

Précise la création d'un nœud d'index typé comme Fichier Régulier (TYPE_FILE).

  • Parameters
    diskPointeur vers le disque virtuel.
    parentPointeur vers l'inode du dossier parent.
    filenameNom du fichier à concevoir.
    Returns
    int L'ID du nouvel inode, ou -1 si l'allocation échoue.

◆ do_cat()

int do_cat ( disk disk,
char *  path_to_file 
)

Commande système cat. Affiche le contenu d'un fichier ou redirige l'entrée standard.

  • Parameters
    diskPointeur vers le disque virtuel.
    path_to_fileChemin vers le fichier à lire. Si NULL, la fonction affiche en boucle le flux de l'entrée standard.
    Returns
    int 1 en cas de succès, -1 s'il s'agit d'un répertoire.

◆ do_df()

int do_df ( disk d)

Commande système df. Affiche les statistiques d'utilisation de l'espace disque et des inodes.

  • Parameters
    dPointeur vers le disque virtuel.
    Returns
    int Retourne 0 systématiquement après l'affichage sur la sortie standard.

◆ do_ls()

int do_ls ( disk d,
char *  path 
)

Commande système ls. Liste l'ensemble des éléments compris dans un répertoire.

  • Cette fonction colore la sortie selon le type de fichier rencontré (Vert pour un fichier, Bleu pour un dossier).
  • Parameters
    dPointeur vers le disque virtuel.
    pathOptionnel : chemin vers le dossier à lister. Si NULL, utilise la variable d'environnement PWD.
    Returns
    int 1 en cas de succès, -1 si le répertoire n'existe pas ou s'il s'agit d'un fichier classique.

◆ do_mkdir()

int do_mkdir ( disk d,
char *  dirpath 
)

Commande système mkdir. Génère une arborescence de sous-répertoire d'après un chemin fourni.

  • Parameters
    dPointeur vers le disque virtuel.
    dirpathChemin logique qualifiant le nouveau dossier.
    Returns
    int 0 en cas de succès, -1 en cas d'erreur de cheminement ou si le répertoire est déjà pris.

◆ do_rm()

int do_rm ( disk disk,
char *  filepath 
)

Commande système rm. Supprime un fichier classique ou un lien symbolique.

  • Parameters
    diskPointeur vers le disque virtuel.
    filepathChemin vers le fichier cible à supprimer.
    Returns
    int 0 en cas de succès, -1 en cas d'erreur d'accès ou s'il s'agit d'un répertoire.

◆ do_rmdir()

int do_rmdir ( disk disk,
char *  filepath 
)

Commande système rmdir. Supprime un répertoire vide identifié par son chemin absolu.

  • Parameters
    diskPointeur vers le disque virtuel.
    filepathChemin absolu menant au répertoire à supprimer.
    Returns
    int 0 en cas de succès, -1 en cas d'erreur de chemin, si le dossier n'est pas vide, ou s'il n'existe pas.

◆ do_touch()

int do_touch ( disk d,
char *  filepath 
)

Commande système touch. Crée un nouveau fichier vide à l'emplacement indiqué.

  • Note
    Si le nom existe déjà, une erreur est renvoyée (le comportement diffère du touch Unix classique).
    Parameters
    dPointeur vers le disque virtuel.
    filepathChemin complet d'accès au fichier à générer.
    Returns
    int 0 en cas de succès, -1 si le chemin intermédiaire n'existe pas ou si le nom est indisponible.

◆ find_dir_inode_by_name()

int find_dir_inode_by_name ( char *  name,
int  dir_index,
disk d 
)

Parcourt les entrées d'un répertoire pour extraire l'ID numérique de l'inode correspondant à un nom donné.

  • Parameters
    nameNom de l'élément recherché au sein du dossier.
    dir_indexIndex du nœud d'index du répertoire de recherche.
    dPointeur vers le disque virtuel.
    Returns
    int L'index numérique de l'inode trouvé, ou -1 en cas d'erreur ou d'absence.

◆ find_free_bloc()

int find_free_bloc ( disk d)

Parcourt le vecteur d'allocation pour trouver et réserver le premier bloc libre détecté.

  • Parameters
    dPointeur vers le disque virtuel.
    Returns
    int L'indice du bloc libre alloué, ou -1 si le disque est saturé (Disk Full).

◆ find_offset_in_parent_bloc()

int find_offset_in_parent_bloc ( bloc parent_bloc)

Calcule la première position disponible (offset en octets) au sein d'un bloc parent de type répertoire.

  • Le calcul repose sur une analyse séquentielle par pas de taille fixe (MAX_INODE_NAME + sizeof(int)). Une entrée est considérée libre si son premier caractère est '\0'.
  • Parameters
    parent_blocPointeur vers le bloc de données du répertoire parent.
    Returns
    int L'offset en octets par rapport au début du bloc, ou -1 si le bloc est complet.

◆ get_number_of_free_blocs()

int get_number_of_free_blocs ( disk d)

Calcule le volume de stockage disponible en comptabilisant le nombre de blocs non possédés.

  • Parameters
    dPointeur vers le disque virtuel.
    Returns
    int Le nombre total de blocs libres.

◆ get_number_of_inode_left()

int get_number_of_inode_left ( disk d)

Mesure la quantité d'inodes résiduels disponibles au sein de la table d'inodes globale.

  • Parameters
    dPointeur vers le disque virtuel.
    Returns
    int Le nombre d'inodes libres (dont le type est égal à TYPE_NULL).

◆ init_inode_in_disk()

int init_inode_in_disk ( disk d,
int  inode_index,
int  filetype,
unsigned short  perms,
int  owned_bloc 
)

Initialise les métadonnées d'un inode spécifique directement sur le disque.

  • Parameters
    dPointeur vers la structure représentant le disque virtuel.
    inode_indexIndice de la table d'inodes à initialiser.
    filetypeType à attribuer à l'inode (TYPE_FILE, TYPE_DIRECTORY, etc.).
    permsPermissions d'accès sous forme de masque binaire (ex: 0b111111111).
    owned_blocIndice du premier bloc de données associé à cet inode.
    Returns
    int Retourne 0 en cas de succès, -1 si l'inode ciblé est déjà utilisé (type différent de TYPE_NULL).

◆ is_dir_empty()

int is_dir_empty ( disk d,
int  bloc_index 
)

Vérifie si un bloc de répertoire donné est vide.

  • Un répertoire est jugé vide s'il ne contient aucune autre entrée que les pointeurs système obligatoires de navigation "." et "..".
  • Parameters
    dPointeur vers le disque virtuel.
    bloc_indexIndice du bloc de données associé au répertoire à analyser.
    Returns
    int 1 si le répertoire est vide, 0 s'il contient au moins un sous-élément actif.

◆ is_file_empty()

int is_file_empty ( disk d,
int  bloc_index 
)

Scanne l'intégralité d'un bloc de fichier pour valider s'il ne comporte que des zéros.

  • Parameters
    dPointeur vers le disque virtuel.
    bloc_indexIndice du bloc à analyser.
    Returns
    int 1 si le fichier ne contient aucune donnée (rempli de zéros), 0 sinon.

◆ open_disk()

disk open_disk ( char *  filename)

Ouvre un fichier conteneur physique existant sur le système hôte pour charger sa structure logique en mémoire RAM.

  • Parameters
    filenameChaîne de caractères qualifiant l'emplacement du fichier fichier-disque (généralement "disk").
    Returns
    disk La structure mémoire complétée par la lecture brute sérialisée.

◆ persist_on_disk()

void persist_on_disk ( disk d)

Synchronise (sauvegarde) l'arborescence logique en mémoire vive dans le conteneur physique "disk".

  • Parameters
    dPointeur vers la structure mémoire globale à sérialiser sur le disque dur réel.

◆ read_in_file()

char * read_in_file ( disk d,
int  file_index 
)

Extrait et copie l'intégralité du texte stocké dans le premier bloc de données d'un fichier.

  • Warning
    Alloue dynamiquement de la mémoire via malloc. C'est à la fonction appelante de libérer la ressource.
    Todo:
    Prendre en charge le parcours chaîné de l'ensemble des blocs possédés par l'inode, pas uniquement le premier.
    Parameters
    dPointeur vers le disque virtuel.
    file_indexIdentifiant numérique de l'inode de type fichier.
    Returns
    char* Un pointeur vers le tampon contenant la chaîne extraite, ou NULL en cas de typage incorrect.

◆ redirect_out()

int redirect_out ( disk d,
int  mode,
char *  file,
int  in 
)

Redirige le flux de données lu depuis un descripteur d'entrée vers un fichier spécifié de notre SGF.

  • Si le fichier existe déjà, le contenu est soit écrasé, soit complété selon la valeur du paramètre mode. S'il n'existe pas, un fichier classique est automatiquement créé dans son répertoire d'appartenance.
  • Parameters
    dPointeur vers le disque virtuel.
    modeMode d'ouverture : 0 pour écraser (>), 1 pour ajouter à la fin (>>).
    fileNom ou chemin du fichier cible devant intercepter le flux.
    inDescripteur d'écriture d'entrée (Pipe, stdin, etc.) depuis lequel lire les octets.
    Returns
    int 1 après écriture réussie et synchronisation sur le support physique, -1 en cas d'échec de chemin.

◆ remove_inode()

int remove_inode ( disk disk,
inode parent,
inode inode_to_remove,
int  inode_to_remove_idx 
)

Supprime physiquement un inode, libère ses ressources blocs et efface sa référence chez son parent.

  • Parameters
    diskPointeur vers le disque virtuel.
    parentPointeur vers l'inode du répertoire parent.
    inode_to_removePointeur vers l'inode devant être détruit.
    inode_to_remove_idxIndex numérique de l'inode à détruire dans la table des inodes.
    Returns
    int 1 en cas de suppression réussie, -1 si l'opération est interdite (tentative de suppression de la racine ou erreur d'index parent).

◆ write_in_file()

void write_in_file ( disk d,
int  file_index,
char *  data,
char  mode 
)

Injecte du contenu texte dans le premier bloc alloué d'un inode fichier selon deux modes d'écriture.

  • Parameters
    dPointeur vers le disque virtuel.
    file_indexIndex numérique de l'inode cible.
    dataPointeur vers le buffer de chaînes textuelles à enregistrer.
    modeSélection de comportement : 0 pour écraser (>), toute autre valeur pour concaténer à la fin (>>).