From 18f1037e030fa451566018dfcb8dbdb250787c70 Mon Sep 17 00:00:00 2001 From: Emma Nora Theuer Date: Fri, 25 Oct 2024 16:44:48 +0200 Subject: [PATCH] Changed behavior of the inode table. Changed inode behavior. Implemented a function to create an empty inode. Fixed bug caused by strcmp() weirdness. --- inode.c | 41 ++++++++++++++++++++++++++++++++++++++--- inode.h | 34 ++++++++++++++++++---------------- 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/inode.c b/inode.c index 3f5ecca..90bec61 100644 --- a/inode.c +++ b/inode.c @@ -1,9 +1,11 @@ #include "inode.h" +#include "util.h" Inode* find_inode(char filename[], struct inode_table* itable) { for (uint32_t i = 0; i < itable->size; i++) { - if (strcmp(filename, itable->inodes[i]->name)) { - return itable->inodes[i]; + if (!strcmp(filename, itable->inodes[i].filename)) { + Inode* ret = &itable->inodes[i]; + return ret; } } return NULL; @@ -11,7 +13,7 @@ Inode* find_inode(char filename[], struct inode_table* itable) { bool inode_exists(struct inode_table* itable, char filename[]) { for (uint32_t i = 0; i < itable->size; i++) { - if (strcmp(filename, itable->inodes[i]->name)) { + if (!strcmp(filename, itable->inodes[i].filename)) { return true; } } @@ -23,3 +25,36 @@ void delete_inode(struct inode_table* itable, char filename[]) { free(wanted_inode); wanted_inode = NULL; } + +Inode* create_inode() { + Inode* new_inode = (Inode*) malloc(sizeof(Inode)); + if (new_inode == NULL) { + errno = ENOMEM; + perror("Failed to allocate memory for inode"); + return new_inode; + } + + new_inode->filename = NULL; + new_inode->filesize = 0; + new_inode->owner = 0; + new_inode->group = 0; + new_inode->created = get_local_time(); + new_inode->last_modified = get_local_time(); + new_inode->block_count = 0; + new_inode->first_data_block = NULL; + new_inode->second_data_block = NULL; + new_inode-> third_data_block = NULL; + new_inode->fourth_data_block = NULL; + new_inode->fifth_data_block = NULL; + new_inode->sixth_data_block = NULL; + new_inode->seventh_data_block = NULL; + new_inode->eighth_data_block = NULL; + new_inode->nineth_data_block = NULL; + new_inode->tenth_data_block = NULL; + new_inode->eleventh_data_block = NULL; + new_inode->twelveth_data_block = NULL; + new_inode->file_indirect_data_block = NULL; + new_inode->file_doubly_indirect_data_block = NULL; + new_inode-> file_trebly_indirect_data_block = NULL; + return new_inode; +} diff --git a/inode.h b/inode.h index 48495f7..4811fc2 100644 --- a/inode.h +++ b/inode.h @@ -5,32 +5,24 @@ #include #include #include +#include +#include #include "util.h" typedef struct Inode Inode; enum permissions { - R = 1, - W = 2, - X = 4 + READ = 1, + WRITE = 2, + EXECUTE = 4 }; -// NOTE: Add handling for the block bitmap for when a file is deleted and created. That's how you solve the issue of when a block is usable. - -struct inode_table { - // the following keyword spam purely exist so I definitely see it with highlighting. - // NOTE, TODO, FIXME, DEPRECATED, HACK, IMPORTANT: always initialize all values to be null when the inode table is created!!!! - // TODO: Change currently hardcoded value to actually accurately describe the size of the filesystem, only for temporary purposes. - Inode* inodes[640000]; - uint32_t size; - uint32_t used_inodes; - uint32_t free_inodes; -}; +// TODO: Add handling for the block bitmap for when a file is deleted and created. That's how you solve the issue of when a block is usable. struct Inode { // file information - char name[64]; + char *filename; uint32_t filesize; // ownership and permissions @@ -67,7 +59,17 @@ struct Inode { struct trebly_indirect_data_block* file_trebly_indirect_data_block; }; -Inode* create_inode(char name[64], uint8_t user_permissions, uint8_t group_permissions, uint16_t owner, uint16_t group, block* data_block); +struct inode_table { + // the following keyword spam purely exist so I definitely see it with highlighting. + // NOTE, TODO, FIXME, DEPRECATED, HACK, IMPORTANT: always initialize all values to be null when the inode table is created!!!! + // TODO: Change currently hardcoded value to actually accurately describe the size of the filesystem, only for temporary purposes. + Inode inodes[640000]; + uint32_t size; + uint32_t used_inodes; + uint32_t free_inodes; +}; + +Inode* create_inode(); Inode* find_inode(char filename[], struct inode_table* itable); bool inode_exists(struct inode_table* itable, char filename[]); void delete_inode(struct inode_table* itable, char filename[]);