diff --git a/docs/compte_rendus/compte_rendu_1.md b/docs/compte_rendus/compte_rendu_1.md index a79a4e4..0a2b65c 100644 --- a/docs/compte_rendus/compte_rendu_1.md +++ b/docs/compte_rendus/compte_rendu_1.md @@ -84,7 +84,8 @@ Le SGF utilise des structures à taille fixe pour simuler la partition . ```c /** * @struct inode - * @brief Un inode est un fichier, il possède des permissions, un type (répertoire par exemple) et pointe sur des blocs de données + * @brief Un inode est un fichier, il possède des permissions, un type + * (répertoire par exemple) et pointe sur des blocs de données */ typedef struct inode { unsigned short perms; // rwxrwxrwx @@ -97,7 +98,7 @@ typedef struct inode { * @brief Un bloc possède un tableau de données brut concernant des inodes */ typedef struct bloc { - char datas[MAX_BYTES_PER_BLOC]; // 1024 octets + char datas[MAX_BYTES_PER_BLOC]; } bloc; /** @@ -105,8 +106,9 @@ typedef struct bloc { * @brief Un disque est un liste d'inodes qui pointent sur des blocs de donnée */ typedef struct disk { - inode inodes[MAX_INODE]; // 10 inodes max - bloc blocs[MAX_BLOCS]; // 30 blocs max + char owned_blocs[MAX_BLOCS]; // 1 si possédé par un inode, 0 si libre + inode inodes[MAX_INODE]; + bloc blocs[MAX_BLOCS]; } disk; // pour 10 inode qui a 30 blocs de chacun 1024 octets, on a 30720 octets, soit @@ -118,7 +120,7 @@ typedef struct disk { ## V. Liste des fonctions principales ### Primitives Système -- **`int mycreat(char *nom, int mode)`** : Crée un fichier et retourne son inode. +- **`int create_inode(disk *disk, inode *parent, char inode_type, char *name)`** : Crée un fichier et retourne son inode. - **`int myread(int inode, char *buffer, int nombre)`** : Lit n octets depuis l'inode. ### Commandes Shell diff --git a/docs/compte_rendus/compte_rendu_1.pdf b/docs/compte_rendus/compte_rendu_1.pdf index f7ba2b4..495de2a 100644 Binary files a/docs/compte_rendus/compte_rendu_1.pdf and b/docs/compte_rendus/compte_rendu_1.pdf differ diff --git a/src/const.h b/src/const.h index 99129eb..1ae30ed 100644 --- a/src/const.h +++ b/src/const.h @@ -3,7 +3,7 @@ #define MAX_BLOCS 30 #define MAX_BYTES_PER_BLOC 1024 #define MAX_INODE 10 -#define MAX_INODE_NAME 30 // 29 caractères + '\0' + numero de l'inode ref +#define MAX_INODE_NAME 28 // 27 caractères + '\0' + numero de l'inode ref #define TYPE_NULL 0 #define TYPE_FILE 1 diff --git a/src/disk.c b/src/disk.c index cf01c6a..0281dca 100644 --- a/src/disk.c +++ b/src/disk.c @@ -3,6 +3,7 @@ #include "struct.h" #include #include +#include #include int init_inode_in_disk(disk *d, int inode_index, int filetype, @@ -47,9 +48,9 @@ int find_offset_in_parent_bloc(bloc *parent_bloc) { return -1; } -void create_directory(disk *disk, inode *parent, char *dirname) {} +int create_directory(disk *disk, inode *parent, char *dirname) {} -void create_file(disk *disk, inode *parent, char *filename) { +int create_file(disk *disk, inode *parent, char *filename) { int inode_index = 0; while (inode_index < MAX_INODE && disk->inodes[inode_index].filetype != TYPE_NULL) { @@ -58,13 +59,13 @@ void create_file(disk *disk, inode *parent, char *filename) { if (inode_index >= MAX_INODE) { dprintf(STDERR_FILENO, "No free inodes\n"); - return; + return -1; } int new_bloc_idx = find_free_bloc(disk); if (new_bloc_idx == -1) { dprintf(STDERR_FILENO, "Disk Full\n"); - return; + return -1; } int p_bloc_idx = parent->blocs[0]; @@ -72,7 +73,7 @@ void create_file(disk *disk, inode *parent, char *filename) { if (offset == -1) { dprintf(STDERR_FILENO, "Parent directory full\n"); - return; + return -1; } strncpy(&disk->blocs[p_bloc_idx].datas[offset], filename, MAX_INODE_NAME); @@ -80,24 +81,25 @@ void create_file(disk *disk, inode *parent, char *filename) { sizeof(int)); init_inode_in_disk(disk, inode_index, TYPE_FILE, 0b111111111, new_bloc_idx); + return inode_index; } -void create_inode(disk *disk, inode *parent, char inode_type, char *name) { +int create_inode(disk *disk, inode *parent, char inode_type, char *name) { if (strlen(name) > MAX_INODE_NAME) { dprintf(STDERR_FILENO, "A inode name must be < %d\n", MAX_INODE_NAME); - return; + return -1; } if (parent->filetype != TYPE_DIRECTORY) { dprintf(STDERR_FILENO, "A parent's inode must be a directory!\n"); - return; + return -1; } switch (inode_type) { case TYPE_DIRECTORY: - create_directory(disk, parent, name); + return create_directory(disk, parent, name); break; case TYPE_FILE: - create_file(disk, parent, name); + return create_file(disk, parent, name); case TYPE_BINARY: // TODO plus tard break; @@ -107,19 +109,49 @@ void create_inode(disk *disk, inode *parent, char inode_type, char *name) { default: break; } + return -1; } -void write_in_file(disk *d, int file, char* data/*, char mode*/) { - if (file != TYPE_FILE) { +void write_in_file(disk *d, int file_index, char *data /*, char mode*/) { + inode file = d->inodes[file_index]; + if (file.filetype != TYPE_FILE) { dprintf(STDERR_FILENO, "Can only write in files\n"); return; } - sizeof(data); + // mode 'w' (on écrase tout ^^) + // les blocs sont possédés par un seul inode donc c'est ok de tout écraser + // TODO: regarder si l'inode est sur plusieurs blocs et écraser tous les blocs + // possédé + + int bloc_index_to_overwrite = file.blocs[0]; + if (bloc_index_to_overwrite == -1) { + dprintf(STDERR_FILENO, "This inode does not have any bloc\n"); + return; + } + + strncpy(&d->blocs[bloc_index_to_overwrite].datas[0], data, strlen(data)); +} + +void do_ls(disk *d, int dir_index) { + inode dir = d->inodes[dir_index]; + if (dir.filetype != TYPE_DIRECTORY) { + dprintf(STDERR_FILENO, "ls: Can only list in directories\n"); + return; + } + + int bloc = dir.blocs[0]; + + for (int i = 0; i < MAX_BYTES_PER_BLOC; i += MAX_INODE_NAME + sizeof(int)) { + if (d->blocs[bloc].datas[i] != '\0') { + printf("%s\n", &d->blocs[bloc].datas[i]); + } + } } void init_env_var_file(disk *d) { - create_inode(d, &d->inodes[0], TYPE_FILE, "env"); + int inode_idx = create_inode(d, &d->inodes[0], TYPE_FILE, "env"); + write_in_file(d, inode_idx, "PWD=/\nUSER=user"); } /** @@ -151,14 +183,14 @@ disk create_disk() { d.inodes[0].blocs[0] = 0; // utilise le bloc 0 d.owned_blocs[0] = 1; // le bloc 1 est maintenant occupé + init_env_var_file(&d); + int n = fwrite(&d, sizeof(disk), 1, fptr); if (n == 1) { dprintf(STDOUT_FILENO, "Disk of size %.2fKb created successfully.\n", (float)(MAX_BYTES_PER_BLOC * MAX_BLOCS) / 1000); } - init_env_var_file(&d); - fclose(fptr); return d; } diff --git a/src/disk.h b/src/disk.h index 5557293..424aaf5 100644 --- a/src/disk.h +++ b/src/disk.h @@ -7,4 +7,5 @@ #include disk create_disk(); -disk open_disk(char* filename); \ No newline at end of file +disk open_disk(char* filename); +void do_ls(disk *d, int dir_index); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1b520e3..185b985 100644 --- a/src/main.c +++ b/src/main.c @@ -12,9 +12,10 @@ int main(int argc, char *argv[], char *envp[]) { // shell_loop(); disk drive; - if (access("disk", F_OK) == 0) + if (access("disk", F_OK) == 0) { drive = open_disk("disk"); - else + do_ls(&drive, 0); + } else drive = create_disk(); (void)drive;