From ba1ccf37e6ccc2df994e23f6439d5df4b48288f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Guldberg?= Date: Tue, 25 Jun 2019 21:58:16 +0200 Subject: [PATCH] Save work --- SingOS.img | Bin 20971520 -> 20971520 bytes lsfs_disk_controller.h | 32 +++++++++++++++--------------- lsfs_folder/kernel/kernel.bin | 0 lsfs_folder/kernel/utils/disk.out | Bin 0 -> 534 bytes lsfs_fuse | Bin 46384 -> 46384 bytes lsfs_fuse.o | Bin 44984 -> 44976 bytes 6 files changed, 16 insertions(+), 16 deletions(-) create mode 100755 lsfs_folder/kernel/kernel.bin create mode 100755 lsfs_folder/kernel/utils/disk.out diff --git a/SingOS.img b/SingOS.img index 615ddcc17a1966b548c0a18e0fded680afb9687c..1dcb119b4b1ca47d0627db847ba734c634b3bd65 100644 GIT binary patch delta 2405 zcmeH{;cFXZ9LJx#B$qVn(kJT{-KObnf-er->{~@)5~4zobfN8rHeDs>j7yu6v?qns zrsUS{JQo?W4Ekaq`pP#74wezI3xrfg$-IQfifY2&g$Y^{{w%mjP57&@;;jjf zFt_lqaP5t4moM*3TIG7^&g2b3s_#u!IC8Ql5x=qGE#E8uFi*&eH-gKm+FW;Rdn{Yg zvW?^ZC|KC%dCC`cbIbJp>`jh>AlL^w!G3T6gupZ4S#S^>0*AqK;CT?fev|9!G25mo zv97i&2RZR~_lMbG`7+1X-@L#*t77wh)4t(>rwuTS-A zznV(BsrXIBXDWhmiMU>LlYyTw9#8ZOePKQ7)@piGC@<rN=uDu70DU~zC~P(#q{Kw zmR#49t6Fjc4ZOyY@sa5zvSljk#wR2aF_jHNv0}p*L4^HO_kC@qzNKAV-Kz8wEm}8~ zx-pHp@6s1$>dluIFU&k_Ru(^xU%XmxCh#uC@u-ZDSz7Y35iR-HR3010A;3cXgCJXK zKYn#DmX;{%eJ8<&bj59b6RaJD|9qa{x>m1)jr8sG%lR*heQi@DU zp9(uWmhF|^<@RB2EU)d|<$kd`dgI6Ug~pmN_b0NsE*ZPHsWz7|f4uwKJas4smZv^R z&OG%M>z?{7*OhLJG`|P|}mnFc6+Wcn`w2@NfS?ODN9bH`i)ULI3~& diff --git a/lsfs_disk_controller.h b/lsfs_disk_controller.h index b3108e9..206d831 100644 --- a/lsfs_disk_controller.h +++ b/lsfs_disk_controller.h @@ -41,10 +41,10 @@ int lsfs_disk_read_data_from_file(lsfs_file *file, int data_length, char *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(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 write_data_to_disk_off(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write, int offset); -int read_data_from_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_buffer); -int read_data_from_disk_off(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write, int offset); +int write_data_to_disk(lsfs_sector_offset at_sector, uint32_t number_sectors, void* data_to_write); +int write_data_to_disk_off(lsfs_sector_offset index, uint32_t number_sectors, void* data_to_write, int offset); +int read_data_from_disk(lsfs_sector_offset index, uint32_t number_sectors, void* data_buffer); +int read_data_from_disk_off(lsfs_sector_offset index, uint32_t number_sectors, void* data_to_write, int offset); int save_modified_file_information(lsfs_file* file); #define SPACE_MBR_RECORD 2048 // Sectors @@ -99,7 +99,7 @@ typedef struct struct_table_entry lsfs_file_id file_id; uint64_t file_size; mif* ext_file_data; - uint32_t file_block_size; // This tells how many block there are allocated for the specific file. eg. we read this amount of bloks for the file. + uint32_t number_sectors; // This tells how many block there are allocated for the specific file. eg. we read this amount of bloks for the file. uint8_t entry_kind; uint8_t extra_control_bits1; uint8_t extra_control_bits2; @@ -178,7 +178,7 @@ typedef struct lsfs_file { uint64_t creation_date; uint64_t access_time; uint64_t modification_time; - uint32_t file_block_size; + uint32_t number_sectors; lsfs_sector_offset table_entry_sector_index; lsfs_sector_offset data_pointer[NUM_DATA_POINTERS]; } lsfs_file; @@ -235,7 +235,7 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { 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. + find_file->number_sectors = 1; // TODO: should be loaded from disk. return 1; } } @@ -278,7 +278,7 @@ int lsfs_disk_read_data_from_file(lsfs_file *file, int buffer_size, char *data, { amount_to_read = (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); } - //read_data_from_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_buffer) + //read_data_from_disk(lsfs_sector_offset index, uint32_t number_sectors, void* data_buffer) if (file->data_pointer[data_pointer_index] == 0) { break; @@ -848,27 +848,27 @@ int save_modified_file_information(lsfs_file* file) { } -int write_data_to_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write) { +int write_data_to_disk(lsfs_sector_offset index, uint32_t number_sectors, void* data_to_write) { fseek ( disk, (index * SECTOR_SIZE), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int written = fwrite(data_to_write, 1, (file_block_size * SECTOR_SIZE), disk); + int written = fwrite(data_to_write, 1, (number_sectors * SECTOR_SIZE), disk); return written; } -int write_data_to_disk_off(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write, int offset) { +int write_data_to_disk_off(lsfs_sector_offset index, uint32_t number_sectors, void* data_to_write, int offset) { fseek ( disk, ((index * SECTOR_SIZE) + offset), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int written = fwrite(data_to_write, 1, ((file_block_size * SECTOR_SIZE) - offset), disk); + int written = fwrite(data_to_write, 1, ((number_sectors * SECTOR_SIZE) - offset), disk); return written; } -int read_data_from_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_buffer) { +int read_data_from_disk(lsfs_sector_offset index, uint32_t number_sectors, void* data_buffer) { fseek ( disk, (index * SECTOR_SIZE ), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int read = fread(data_buffer, 1, (file_block_size * SECTOR_SIZE), disk); + int read = fread(data_buffer, 1, (number_sectors * SECTOR_SIZE), disk); return read; } -int read_data_from_disk_off(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write, int offset) { +int read_data_from_disk_off(lsfs_sector_offset index, uint32_t number_sectors, void* data_to_write, int offset) { fseek ( disk, ((index * SECTOR_SIZE) + offset), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int written = fread(data_to_write, 1, ((file_block_size * SECTOR_SIZE) - offset), disk); + int written = fread(data_to_write, 1, ((number_sectors * SECTOR_SIZE) - offset), disk); return written; } #endif diff --git a/lsfs_folder/kernel/kernel.bin b/lsfs_folder/kernel/kernel.bin new file mode 100755 index 0000000..e69de29 diff --git a/lsfs_folder/kernel/utils/disk.out b/lsfs_folder/kernel/utils/disk.out new file mode 100755 index 0000000000000000000000000000000000000000..bf68117c46bb608c6ecd5fbe7c7c47da4c1004a2 GIT binary patch literal 534 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