diff --git a/SingOS.img b/SingOS.img new file mode 100644 index 0000000..3e20edf Binary files /dev/null and b/SingOS.img differ diff --git a/a.out b/a.out index 1838447..3cf6fed 100755 Binary files a/a.out and b/a.out differ diff --git a/lsfs_disk_controller.h b/lsfs_disk_controller.h index c7ebd6a..d7b71e0 100644 --- a/lsfs_disk_controller.h +++ b/lsfs_disk_controller.h @@ -29,6 +29,7 @@ typedef lsfs_sector_offset lsfs_file_id; //typedef uint64_t sector_index; static FILE* disk; static partition_control p_control; +static time_t timestamp_loading; int create_file_system(char* disk_name, char* hdd_or_partition, uint64_t filesystem_size_in_MB); int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind); @@ -39,7 +40,7 @@ int get_free_sectors_table(); int get_free_sectors(int num_sectors_needed, lsfs_sector_offset* output_array); int lsfs_disk_read_data_from_file(lsfs_file* file, int buffer_size, void* buffer_for_data); int lsfs_disk_write_data_to_file(lsfs_file* file, int data_length, char *data, size_t offset_to_next_entry); -int lsfs_disk_rename_file(lsfs_file* file, const char* new_filename); +int lsfs_disk_rename_file(const char* old_filename_, const char* new_filename); int lsfs_disk_load_disk(); int write_data_to_disk(lsfs_sector_offset at_sector, uint32_t file_block_size, void* data_to_write); int read_data_from_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_buffer); @@ -54,7 +55,7 @@ int save_modified_file_information(lsfs_file* file); #define NUMBER_OF_MBR_PARTITIONS 4 #define DEFAULT_FILE_SIZE 4 // This is in sectors #define DEFAULT_DATA_POINTER_SIZE 4 // This is in sectors -#define DEFAULT_TABLE_SIZE 10 +#define DEFAULT_TABLE_SIZE 16 #define NUM_DATA_POINTERS 27 typedef enum Table_Entry_Kind @@ -100,22 +101,22 @@ typedef struct struct_table_entry typedef struct Directory_Table { - struct_table_entry entries[10]; + struct_table_entry entries[DEFAULT_TABLE_SIZE]; } __attribute__((packed)) Directory_Table; typedef struct File_System_Control_Information { - char filesystem_information[256]; - uint64_t master_table_index; - uint64_t this_partition_offset_on_disk; - uint64_t next_free_sector; - uint64_t next_uniqe_id; // both files and directories gets this. - uint64_t next_sector_reuse_pointer; - uint64_t last_sector_index_on_partition; - uint64_t maximum_sectors_on_disk; - uint64_t sector_size_on_disk; - uint64_t not_used[24]; + char filesystem_information[256]; + lsfs_sector_offset master_table_index; + lsfs_sector_offset this_partition_offset_on_disk; + lsfs_sector_offset next_free_sector; + uint64_t next_uniqe_id; // both files and directories gets this. + lsfs_sector_offset next_sector_reuse_pointer; + lsfs_sector_offset last_sector_index_on_partition; + lsfs_sector_offset maximum_sectors_on_disk; + lsfs_sector_offset sector_size_on_disk; + uint64_t not_used[24]; } __attribute__((packed)) FSCI; @@ -177,7 +178,8 @@ typedef struct lsfs_file { Directory_Table* lsfs_find_directory(const char *path, bool drop_filename) { - Directory_Table *dir_table = &p_control.master_table; + Directory_Table *dir_table = calloc(1, sizeof(Directory_Table)); + read_data_from_disk(p_control.fsci.master_table_index, DEFAULT_TABLE_SIZE, dir_table); lsfs_string_array split_path = lsfs_string_split_c(path, '/', false); int number_of_traversal = split_path.length; @@ -195,16 +197,6 @@ Directory_Table* lsfs_find_directory(const char *path, bool drop_filename) if (strcmp(dir_table->entries[j].filename, split_path.strings[i].chars) == 0) { int index_sector = dir_table->entries[j].data_pointer[0]; - if (i == 0) - { - // Alocate space, we refuse this further on - dir_table = calloc(1, sizeof(Directory_Table)); - } - else - { - free(dir_table); - dir_table = calloc(1, sizeof(Directory_Table)); - } read_data_from_disk(index_sector, DEFAULT_TABLE_SIZE, dir_table); break; } @@ -223,9 +215,6 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { for (int i = 0; i < DEFAULT_TABLE_SIZE; ++i) { if(strcmp( filename.chars, dir_table->entries[i].filename ) == 0) { - time_t current_time; - time ( ¤t_time ); - find_file->file_id = dir_table->entries[i].file_id; find_file->entry_kind = dir_table->entries[i].entry_kind; find_file->table_entry_pointer = i; @@ -233,10 +222,10 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { find_file->table_entry_sector_index = dir_table->entries[i].table_entry_sector_index; find_file->owner_id = getuid(); find_file->size = dir_table->entries[i].file_size; // dir_table->entries[i].data_pointer[0]; //; - find_file->creation_date = (uint64_t) current_time; - find_file->access_time = (uint64_t) current_time; - find_file->modification_time = (uint64_t) current_time; - memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, DEFAULT_DATA_POINTER_SIZE * 8); + find_file->creation_date = (uint64_t) timestamp_loading; + find_file->access_time = (uint64_t) timestamp_loading; + find_file->modification_time = (uint64_t) timestamp_loading; + memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, NUM_DATA_POINTERS * 8); find_file->file_block_size = 1; // TODO: should be loaded from disk. return 1; } @@ -352,18 +341,21 @@ time_t lsfs_disk_truncate_file(lsfs_file *file, off_t offset) { return result; } -int lsfs_disk_rename_file(lsfs_file* file, const char* new_filename) { - - memset(file->filename, 0, 256); - sprintf(file->filename, "%s", new_filename); +int lsfs_disk_rename_file(const char* old_filename, const char* new_filename) { - time_t current_time; - time ( ¤t_time ); + lsfs_file *old_file = calloc(1, sizeof(lsfs_file)); + lsfs_file *new_file = calloc(1, sizeof(lsfs_file)); - file->access_time = (uint64_t) current_time; - file->modification_time = (uint64_t) current_time; + lsfs_disk_getattr(old_file, old_filename); + lsfs_disk_create_entry(new_filename, ENTRY_FILE); + lsfs_disk_getattr(new_file, new_filename); - save_modified_file_information(file); + new_file->file_id = old_file->file_id; + new_file->size = old_file->size; + // TODO(Jørn) The data pointer assignt to the new file should be released. + memcpy(new_file->data_pointer, old_file->data_pointer, NUM_DATA_POINTERS * 8); + save_modified_file_information(new_file); + lsfs_disk_delete_file(old_file); return 0; } @@ -371,7 +363,7 @@ int lsfs_disk_rename_file(lsfs_file* file, const char* new_filename) { int lsfs_disk_delete_file(lsfs_file *file) { Table_Entry *zero_buffer = calloc(1, (DEFAULT_ENTRY_SIZE * SECTOR_SIZE)); //read_data_from_disk(file_id, 1, mif_record); - write_data_to_disk(file->table_entry_sector_index, DEFAULT_TABLE_SIZE, zero_buffer); + write_data_to_disk(file->table_entry_sector_index, DEFAULT_ENTRY_SIZE, zero_buffer); free(zero_buffer); return 1; @@ -453,6 +445,7 @@ int create_file_system(char* disk_name, char* hdd_or_partition, uint64_t filesys // Create disk on host system: disk = fopen ( disk_name , "wb" ); + ftruncate(fileno(disk), SECTOR_SIZE * fsci->last_sector_index_on_partition); write_data_to_disk(fsci->this_partition_offset_on_disk, 1, fsci); @@ -467,6 +460,8 @@ int lsfs_disk_load_disk() { // Find the partition talbe: // This makes is BIOS dependent. // UEFI is not supported. + time(×tamp_loading); + Master_Boot_record mbr; fseek( disk , 0 * SECTOR_SIZE, SEEK_SET ); fread(&mbr, 1, sizeof(mbr), disk); @@ -523,7 +518,8 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) // Start from the master table int free_index = -1; // -1 is no index found. - Directory_Table *dir_table = &p_control.master_table; + Directory_Table *dir_table = calloc(1, sizeof(Directory_Table)); + read_data_from_disk(p_control.fsci.master_table_index, DEFAULT_TABLE_SIZE, dir_table); lsfs_sector_offset table_disk_position = p_control.fsci.master_table_index; @@ -541,11 +537,6 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) // We have found the next directory to traverse. //printf("Get next dir at sector: "); table_disk_position = dir_table->entries[j].data_pointer[0]; - if (i == 0) - { - // Alocate space, we refuse this further on - dir_table = malloc(sizeof(Directory_Table)); - } //printf("%d\n", table_disk_position); read_data_from_disk(table_disk_position, DEFAULT_TABLE_SIZE, dir_table); break; @@ -610,7 +601,7 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) time ( ¤t_time ); */ //printf("File is written to sector: %d\n", table_disk_position); - write_data_to_disk(table_disk_position, 1, &dir_table->entries[free_index]); + write_data_to_disk(table_disk_position, DEFAULT_ENTRY_SIZE, &dir_table->entries[free_index]); return 0; } @@ -623,9 +614,8 @@ int save_modified_file_information(lsfs_file* file) { //entry.file_id = file->file_id; memcpy(entry->filename, file->filename, 256); - printf("Filse size: %d\n", file->size); entry->file_size = file->size; // p_control.master_table.entries[i].data_pointer[0]; //; - //p_control.master_table.entries[i].data_pointer = find_file->data; + memcpy(entry->data_pointer, file->data_pointer, NUM_DATA_POINTERS * 8); write_data_to_disk(file->table_entry_sector_index, DEFAULT_ENTRY_SIZE, entry); return 0; diff --git a/lsfs_fuse b/lsfs_fuse index db7d14c..05f89a7 100755 Binary files a/lsfs_fuse and b/lsfs_fuse differ diff --git a/lsfs_fuse.c b/lsfs_fuse.c index 908c4a5..aae7440 100644 --- a/lsfs_fuse.c +++ b/lsfs_fuse.c @@ -82,12 +82,8 @@ int lsfs_truncate(const char *path, off_t offset) { int lsfs_rename(const char *path, const char *to) { - (void)path; - (void)to; - lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); - lsfs_disk_getattr(found_file, path); - return lsfs_disk_rename_file(found_file, to); + return lsfs_disk_rename_file(path, to); } int lsfs_getattr( const char *path, struct stat *stbuf ) { @@ -149,14 +145,7 @@ int lsfs_readdir( const char *path, void *buf, fuse_fill_dir_t filler, off_t off filler(buf, "..", NULL, 0); Directory_Table *directory_table; - if (strcmp(path, "/") != 0) - { - directory_table = lsfs_find_directory(path, false); - } - else - { - directory_table = &p_control.master_table; - } + directory_table = lsfs_find_directory(path, false); if (directory_table != NULL) { diff --git a/lsfs_fuse.o b/lsfs_fuse.o index 18cf29a..0f4e5e8 100644 Binary files a/lsfs_fuse.o and b/lsfs_fuse.o differ