#ifndef LSFS_H #define LSFS_H #include "../main.h" typedef struct lsfs_file lsfs_file; typedef struct Directory_Table Directory_Table; typedef struct Table_Entry Table_Entry; int lsfs_disk_getattr(find_file, path, fsci); int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry); Directory_Table* lsfs_find_directory(path, drop_filename, fsci); typedef enum Table_Entry_Kind { /* These are specific values since, is has to corrospond to the implementation in assembly*/ ENTRY_EMPTY = 0, ENTRY_FILE = 1, ENTRY_DIRECTORY = 2, } Table_Entry_Kind; struct Table_Entry { char filename[256]; unsigned long file_id[2]; unsigned long file_size[2]; void* ext_file_data_low; void* ext_file_data_high; long number_sector_s; /* <- Just try to remove the last undercore and compile . */ short entry_kind; short extra_control_bits1; short extra_control_bits2; short extra_control_bits3; long table_entry_sector_index[2]; long data_pointer[NUM_DATA_POINTERS * 2]; /* if it is a directory, the first pointer will be to the next table. */ }; struct lsfs_file { unsigned long file_id[2]; long table_entry_pointer[2]; Table_Entry_Kind entry_kind; char* filename; long owner_id; unsigned long size[2]; long creation_date[2]; long access_time[2]; long modification_time[2]; long number_sector; long table_entry_sector_index[2]; long data_pointer[NUM_DATA_POINTERS * 2]; }; struct Directory_Table { Table_Entry entries[DEFAULT_TABLE_SIZE]; }; /*typedef struct File_System_Control_Information { char filesystem_information[256]; long master_table_index[2]; long this_partition_offset_on_disk[2]; long next_free_sector[2]; long next_uniqe_id[2]; /* both files and directories gets this. long next_sector_reuse_pointer[2]; long last_sector_index_on_partition[2]; long maximum_sectors_on_disk[2]; long sector_size_on_disk[2]; long not_used[48]; } FSCI; */ int lsfs_disk_getattr(find_file, path, fsci) lsfs_file* find_file; char *path; FSCI *fsci; { int i; String_Array *split_path = string_split_c(path, '/', false); Length_String *filename = split_path->strings[split_path->length-1]; /* Start from the master table*/ Directory_Table *dir_table = lsfs_find_directory(path, true, fsci); for (i = 0; i < DEFAULT_TABLE_SIZE; i++) { int j; /* print(dir_table->entries[i].filename); print(filename->chars); print_newline(); print_newline(); print("Size of table_entry: "); dump_ax(sizeof(Table_Entry)); print_newline(); print_newline(); */ if(strcmp( filename->chars, dir_table->entries[i].filename ) == 0) { find_file->file_id[0] = dir_table->entries[i].file_id[0]; find_file->entry_kind = dir_table->entries[i].entry_kind; find_file->table_entry_pointer[0] = i; find_file->filename = dir_table->entries[i].filename; find_file->table_entry_sector_index[0] = dir_table->entries[i].table_entry_sector_index; find_file->owner_id = 1; find_file->size[0] = dir_table->entries[i].file_size[0]; /* dir_table->entries[i].data_pointer[0]; ;*/ find_file->creation_date[0] = 0; find_file->access_time[0] = 0; find_file->modification_time[0] = 0; /* memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, NUM_DATA_POINTERS * 8); */ for (j = 0; j < NUM_DATA_POINTERS; j = j + 2) { find_file->data_pointer[j] = dir_table->entries[i].data_pointer[j]; } find_file->number_sector = 1; /* TODO: should be loaded from disk.*/ return 1; } } return 0; } Directory_Table* lsfs_find_directory(path, drop_filename, fsci) char *path; short drop_filename; FSCI *fsci; { int number_of_traversal; int i, j; String_Array *split_path; Directory_Table *dir_table = calloc(1, sizeof(Directory_Table)); /* printf("Table index: %lu \n",fsci->master_table_index ); */ disk_service_read_data_from_disk(fsci->master_table_index[0], (long) DEFAULT_TABLE_SIZE, dir_table, 0x7e0); split_path = string_split_c(path, '/', false); number_of_traversal = split_path->length; if (drop_filename) { number_of_traversal -= 1; } /* Start from the master table */ for (i = 0; i < number_of_traversal; ++i) { for (j = 0; j < DEFAULT_TABLE_SIZE; ++j) { /* print_newline(); print("New: "); print(dir_table->entries[j].filename); print("vs "); print(split_path->strings[i]->chars); print_newline(); */ if (strcmp(dir_table->entries[j].filename, split_path->strings[i]->chars) == 0) { long index_sector = dir_table->entries[j].data_pointer[0]; /* printf("Table index: %lu \n",index_sector ); */ /* print(dir_table->entries[j].filename); */ disk_service_read_data_from_disk(index_sector, (long) DEFAULT_TABLE_SIZE, dir_table, 0x7e0); break; } } } return dir_table; } int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry, data_segment) lsfs_file *file; unsigned int buffer_size; char *data; long offset_to_next_entry; unsigned int data_segment; { unsigned int integer_file_size = file->size[0]; unsigned int integer_offset = offset_to_next_entry; unsigned int integer_datapointer = 0; unsigned int data_length = integer_file_size - integer_offset; unsigned int amount_read = 0; unsigned int amount_to_read = 0; unsigned int remaining_offset = offset_to_next_entry; void *next_data; /* printf("READ: buffer_size: %d\n", buffer_size); */ /* printf("READ: Data length: %d\n", data_length); */ /* printf("READ: Offset length: %d\n", offset_to_next_entry); */ int data_pointer_index = 0; /* start at first data pointer. */ if (data_length > buffer_size) { data_length = buffer_size; } while(data_length > 0) /* We have more to write */ { /* printf("READ: Remaing Data length: %d\n", data_length); */ if (remaining_offset == 0) { char *tmp_buffer = calloc(DEFAULT_DATA_POINTER_SIZE, SECTOR_SIZE); /* assert(tmp_buffer); */ if (data_length < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) { amount_to_read = data_length; } else { amount_to_read = (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); } /* disk_service_read_data_from_disk(lsfs_sector_offset index, uint32_t number_sector, void* data_buffer) */ integer_datapointer = file->data_pointer[data_pointer_index]; if (integer_datapointer == 0) { break; } next_data = data + amount_read; disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], (long) DEFAULT_DATA_POINTER_SIZE, next_data, data_segment); /* memcpy((data + amount_read), data_segment, tmp_buffer, 0x7e0, amount_to_read); */ data_length -= amount_to_read; amount_read += amount_to_read; data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/ /* free(tmp_buffer); */ } else if (remaining_offset < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) { char *tmp_buffer = calloc(1, (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)); /* assert(tmp_buffer); */ if (data_length < ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset) ) { amount_to_read = data_length; } else { amount_to_read = ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset); } disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], (long) DEFAULT_DATA_POINTER_SIZE, tmp_buffer, 0x7e0); memcpy(data, data_segment, (tmp_buffer + remaining_offset), 0x7e0, amount_to_read); data_length -= amount_to_read; amount_read += amount_to_read; remaining_offset -= amount_to_read; data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/ /* free(tmp_buffer); */ } else { /* We have to skip a whole data pointer: */ remaining_offset -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); data_pointer_index = data_pointer_index + 2; } } /* time_t current_time; time ( ¤t_time ); file->access_time = current_time; */ return amount_read; } #endif