Pour simplifier le retrait d’un fichier dans la liste des fichiers d’un répertoire, on identifie les entrées détruites (par exemple avec une valeur remarquable pour un des champs de entry_s).
new_entry() retourne l’index dans un répertoire (vu comme un tableau d’entrées) de la première entrée libre. Le répertoire est identifié par un descripteur de fichier, il a donc préalablement été ouvert.unsigned int new_entry(file_desc_t *dir_fd); int find_entry(file_desc_t *dir_fd, const char *basename);
find_entry() retourne l’index dans un répertoire d’une entrée dont le nom est donnée, une valeur négative si aucune entrée est trouvée.
Pour réaliser cette opération, on peut écrire successivement les fonctions suivantes :
unsigned int inumber_of_basename(unsigned int idir, const char *basename); unsigned int inumber_of_path(const char *pathname); unsigned int dinumber_of_path(const char *pathname, const char **basename);
La fonction inumber_of_basename() retourne le inombre de l’entrée de nom basename (qui ne doit pas comporter de /) dans le répertoire idir, 0 en cas d’échec.
La fonction inumber_of_path() retourne le inombre d’un nom de fichier absolu, 0 en cas d’échec.
La fonction dinumber_of_path() retourne à la fois le inombre d’un nom de fichier absolu, mais aussi le nom relatif de ce fichier dans son répertoire dans le paramètre basename. La valeur retournée pour basename est un pointeur dans pathname.
Interface de manipulation de fichiers
/* Most of the following functions returns RETURN_FAILURE (a <0 value) in case of failure. */ /*------------------------------ Initialization and finalization ------------------------------------------------------------ One must mount a volume/file system before any other operation. The environement variable $CURRENT_VOLUME contains this partition number. A sole file system mount is allowed. The file system must be umount. */ int mount(); int umount(); /*------------------------------ File creation and deletion ------------------------------------------------------------*/ /* return RETURN_FAILURE in of failure (pre-existing file, full volume...) */ int create_file(const char *pathname, enum file_type_e type); /* return RETURN_FAILURE in of failure (non pre-existing file, non empty directory...) */ int delete_file(const char *pathname); /*------------------------------ File management ------------------------------------------------------------*/ int open_file(file_desc_t *fd, const char *pathname); void close_file(file_desc_t *fd); void flush_file(file_desc_t *fd); void seek_file(file_desc_t *fd, int offset); /*------------------------------ File accesses ------------------------------------------------------------*/ /* return the conversion to an int of the current char in the file. Return READ_EOF if the file is at end-of-file. */ int readc_file(file_desc_t *fd); /* write a char in the file. Fail if there is no place on device. */ int writec_file(file_desc_t *fd, char c); /* read nbytes char from the file and copy them in the buffer. Return the number of actually read char; READ_EOF if the file is at end-of-file. */ int read_file(file_desc_t *fd, void *buf, unsigned int nbyte); /* write nbyte char from the buffer on the file. Return the number of char writen, RETURN_FAILURE in case of error. */ int write_file(file_desc_t *fd, const void *buf, unsigned int nbyte);