From 20d796515b87098ea3245bef5a9924d17969c0d5 Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Fri, 15 Jul 2022 21:45:56 +0200 Subject: [PATCH] Fixed VFS --- src/kernel/fs/vfs.c | 24 ++++++++++++++++++------ src/kernel/fs/vfs.h | 8 +++++--- src/kernel/lib/string.c | 7 +++++++ src/kernel/lib/string.h | 1 + src/kernel/main.c | 11 ++++++++++- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/kernel/fs/vfs.c b/src/kernel/fs/vfs.c index c5792e9..6b8aeec 100644 --- a/src/kernel/fs/vfs.c +++ b/src/kernel/fs/vfs.c @@ -1,13 +1,16 @@ #include #include #include "vfs.h" +#include "../lib/string.h" + +file_t g_file_table[256]; // Return some OR-ed flags for the given mode string static uint8_t flags_from_mode(const char *mode){ uint8_t flags = 0; bool read = false; bool write = false; - while(mode){ + while(*mode){ switch(*mode){ case 'r': read = true; @@ -35,13 +38,22 @@ static uint8_t flags_from_mode(const char *mode){ return flags; } -file_descriptor_t *vfs_open(const char *path, const char *mode){ +// Initialize VFS +void vfs_initialize(){ + for(int i = 0; i < 256; i++){ + *g_file_table[i].name = '\0'; + g_file_table[i].flags = 0; + } +} + +// Open a file and return its file descriptor +file_t *vfs_open(const char *path, const char *mode){ uint8_t flags = flags_from_mode(mode); for(int i = 0; i < 256; i++){ - if(!*g_fds[i].name){ // If empty - g_fds[i].flags = flags; - strcpy(g_fds[i].name, path); - return &g_fds[i]; + if(!*g_file_table[i].name){ // If empty + g_file_table[i].flags = flags; + strcpy(g_file_table[i].name, (char *)path); // TODO: Check if path is longer than expected + return &g_file_table[i]; } } return NULL; // No free file descriptors diff --git a/src/kernel/fs/vfs.h b/src/kernel/fs/vfs.h index 3ceed0d..5aa4706 100644 --- a/src/kernel/fs/vfs.h +++ b/src/kernel/fs/vfs.h @@ -14,8 +14,10 @@ typedef struct{ char name[256]; uint8_t flags; -} file_descriptor_t; +} file_t; -file_descriptor_t g_fds[256]; +extern file_t g_file_table[256]; -file_descriptor_t *vfs_open(const char *path, const char *mode); +void vfs_initialize(); + +file_t *vfs_open(const char *path, const char *mode); diff --git a/src/kernel/lib/string.c b/src/kernel/lib/string.c index d7dd98b..f7003bc 100644 --- a/src/kernel/lib/string.c +++ b/src/kernel/lib/string.c @@ -10,3 +10,10 @@ int strcmp(char *s1, char *s2){ while(*s1 && (*s1 == *s2)) {s1++; s2++;} return *(const unsigned char *)s1 - *(const unsigned char *)s2; } + +void strcpy(char *dest, char *src){ + while(*src){ + *(dest++) = *(src++); + } + *dest = '\0'; +} diff --git a/src/kernel/lib/string.h b/src/kernel/lib/string.h index b4ecaf3..6338e57 100644 --- a/src/kernel/lib/string.h +++ b/src/kernel/lib/string.h @@ -2,3 +2,4 @@ int strlen(char *s); int strcmp(char *s1, char *s2); +void strcpy(char *dest, char *src); diff --git a/src/kernel/main.c b/src/kernel/main.c index b4f4258..343b536 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -4,12 +4,21 @@ #include "drivers/timer.h" #include "drivers/keyboard.h" #include "drivers/serial.h" +#include "fs/vfs.h" void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ + // Clear screen + clear_screen(); + + // Initialize chip-specific hardware hal_initialize(); + + // Initialize drivers timer_initialize(); keyboard_initialize(); - clear_screen(); + // Initialize FS + vfs_initialize(); + for(;;); }