From 2b1fed19073ffb8a92e48e1c20b8f299efba85b7 Mon Sep 17 00:00:00 2001 From: Guamss Date: Thu, 26 Mar 2026 12:53:40 +0100 Subject: [PATCH] add: create disk --- .gitignore | 3 ++- Makefile | 3 ++- src/const.h | 12 +++++++----- src/disk.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/disk.h | 8 ++++++++ src/main.c | 11 ++++++++++- src/struct.h | 14 +++++++------- 7 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 src/disk.c create mode 100644 src/disk.h diff --git a/.gitignore b/.gitignore index 8eec1cb..b7a67d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ obj/* -seyshell \ No newline at end of file +seyshell +disk \ No newline at end of file diff --git a/Makefile b/Makefile index 9713b68..50008c9 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ NAME := seyshell +DRIVE := disk CC := gcc CFLAGS := -Wall -Wextra -Werror -g OBJ_DIR := obj @@ -20,7 +21,7 @@ clean: @rm -rf $(OBJ_DIR) fclean: clean - @rm -f $(NAME) + @rm -f $(NAME) $(DRIVE) re: fclean all diff --git a/src/const.h b/src/const.h index 0749a3c..a0cb71c 100644 --- a/src/const.h +++ b/src/const.h @@ -1,8 +1,10 @@ #define BUFSIZE 1024 -#define MAX_BLOCS_PER_INODE 30 +#define MAX_BLOCS 30 #define MAX_BYTES_PER_BLOC 1024 +#define MAX_INODE 10 -#define FILE 0 -#define BINARY 1 -#define DIRECTORY 2 -#define SYMBOLIC_LINK 3 \ No newline at end of file +#define TYPE_NULL 0 +#define TYPE_FILE 1 +#define TYPE_BINARY 2 +#define TYPE_DIRECTORY 3 +#define TYPE_SYMBOLIC_LINK 4 \ No newline at end of file diff --git a/src/disk.c b/src/disk.c new file mode 100644 index 0000000..7c0e525 --- /dev/null +++ b/src/disk.c @@ -0,0 +1,40 @@ +#include "disk.h" +#include "struct.h" +#include +#include + +disk create_disk() { + FILE *fptr; + fptr = fopen("disk", "wb"); + + disk d; + for (int i = 0; i < MAX_INODE; i++) { + d.inodes[i].filetype = TYPE_NULL; + d.inodes[i].perms = 0b000000000; + for (int j = 0; j < MAX_BLOCS; j++) { + d.inodes[i].blocs[j] = -1; + } + } + + // création de la racine '/' + d.inodes[0].filetype = TYPE_DIRECTORY; + d.inodes[0].perms = 0b111111111; // tlm fait ce qu'il veut + d.inodes[0].blocs[0] = 0; // utilise le bloc 0 + + + 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); + } + + fclose(fptr); + return d; +} + +disk open_disk(char* filename) { + disk d; + FILE *fptr = fopen(filename, "r"); + fread(&d, sizeof(d),1, fptr); + fclose(fptr); + return d; +} \ No newline at end of file diff --git a/src/disk.h b/src/disk.h new file mode 100644 index 0000000..2cbcbbb --- /dev/null +++ b/src/disk.h @@ -0,0 +1,8 @@ +#pragma once + +#include +#include "const.h" +#include "struct.h" + +disk create_disk(); +disk open_disk(char* filename); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 5032213..df3b813 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,4 @@ +#include "disk.h" #include "parsing.h" #include #include @@ -7,7 +8,15 @@ int main(int argc, char *argv[], char *envp[]) { (void)argv; (void)envp; - shell_loop(); + // shell_loop(); + + disk drive; + if (access("disk", F_OK) == 0) + drive = open_disk("disk"); + else + drive = create_disk(); + + (void)drive; return EXIT_SUCCESS; } \ No newline at end of file diff --git a/src/struct.h b/src/struct.h index 0a2c229..effb127 100644 --- a/src/struct.h +++ b/src/struct.h @@ -2,9 +2,9 @@ #include "const.h" typedef struct inode { - char perms[8]; // rwxrwxrwx - char filetype; // d, -, l - int blocs[MAX_BLOCS_PER_INODE]; + unsigned short perms; // rwxrwxrwx + char filetype; + int blocs[MAX_BLOCS]; } inode; typedef struct bloc { @@ -12,9 +12,9 @@ typedef struct bloc { } bloc; typedef struct disk { - inode inodes[10]; - bloc blocs[30]; + inode inodes[MAX_INODE]; + bloc blocs[MAX_BLOCS]; } disk; -// pour 10 inode qui a 30 blocs de chacun 1024 octets, on a 307200 octets, soit -// 307,2 Ko sur le disque \ No newline at end of file +// pour 10 inode qui a 30 blocs de chacun 1024 octets, on a 30720 octets, soit +// 30,7 Ko sur le disque \ No newline at end of file