Changed behavior of the inode table. Changed inode behavior. Implemented a function to create an empty inode. Fixed bug caused by strcmp() weirdness.
This commit is contained in:
		
							parent
							
								
									b2cac5bd2d
								
							
						
					
					
						commit
						18f1037e03
					
				
					 2 changed files with 56 additions and 19 deletions
				
			
		
							
								
								
									
										41
									
								
								inode.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								inode.c
									
									
									
									
									
								
							| 
						 | 
					@ -1,9 +1,11 @@
 | 
				
			||||||
#include "inode.h"
 | 
					#include "inode.h"
 | 
				
			||||||
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Inode* find_inode(char filename[], struct inode_table* itable) {
 | 
					Inode* find_inode(char filename[], struct inode_table* itable) {
 | 
				
			||||||
    for (uint32_t i = 0; i < itable->size; i++) {
 | 
					    for (uint32_t i = 0; i < itable->size; i++) {
 | 
				
			||||||
        if (strcmp(filename, itable->inodes[i]->name)) {
 | 
					        if (!strcmp(filename, itable->inodes[i].filename)) {
 | 
				
			||||||
            return itable->inodes[i];
 | 
					            Inode* ret = &itable->inodes[i];
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
| 
						 | 
					@ -11,7 +13,7 @@ Inode* find_inode(char filename[], struct inode_table* itable) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool inode_exists(struct inode_table* itable, char filename[]) {
 | 
					bool inode_exists(struct inode_table* itable, char filename[]) {
 | 
				
			||||||
    for (uint32_t i = 0; i < itable->size; i++) {
 | 
					    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;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -23,3 +25,36 @@ void delete_inode(struct inode_table* itable, char filename[]) {
 | 
				
			||||||
    free(wanted_inode);
 | 
					    free(wanted_inode);
 | 
				
			||||||
    wanted_inode = NULL;
 | 
					    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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										34
									
								
								inode.h
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								inode.h
									
									
									
									
									
								
							| 
						 | 
					@ -5,32 +5,24 @@
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "util.h"
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct Inode Inode;
 | 
					typedef struct Inode Inode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum permissions {
 | 
					enum permissions {
 | 
				
			||||||
    R = 1,
 | 
					    READ = 1,
 | 
				
			||||||
    W = 2,
 | 
					    WRITE = 2,
 | 
				
			||||||
    X = 4
 | 
					    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.
 | 
					// 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_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;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Inode {
 | 
					struct Inode {
 | 
				
			||||||
    // file information
 | 
					    // file information
 | 
				
			||||||
    char name[64];
 | 
					    char *filename;
 | 
				
			||||||
    uint32_t filesize;
 | 
					    uint32_t filesize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ownership and permissions
 | 
					    // ownership and permissions
 | 
				
			||||||
| 
						 | 
					@ -67,7 +59,17 @@ struct Inode {
 | 
				
			||||||
    struct trebly_indirect_data_block* file_trebly_indirect_data_block;
 | 
					    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);
 | 
					Inode* find_inode(char filename[], struct inode_table* itable);
 | 
				
			||||||
bool inode_exists(struct inode_table* itable, char filename[]);
 | 
					bool inode_exists(struct inode_table* itable, char filename[]);
 | 
				
			||||||
void delete_inode(struct inode_table* itable, char filename[]);
 | 
					void delete_inode(struct inode_table* itable, char filename[]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue