#include "lsfs.h" #include "../main.h" struct lsfs_file { long file_id[2]; long table_entry_pointer[2]; Table_Entry_Kind entry_kind; char* filename; long owner_id; 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]; }; int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry) lsfs_file *file; int buffer_size; char *data; long offset_to_next_entry; { int integer_file_size = file->size; int integer_offset = offset_to_next_entry; int integer_datapointer = 0; int data_length = integer_file_size - integer_offset; int amount_read = 0; int amount_to_read = 0; int remaining_offset = offset_to_next_entry; /* 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; } disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer); memcpy((data + amount_read), tmp_buffer, amount_to_read); data_length -= amount_to_read; amount_read += amount_to_read; data_pointer_index++; /* 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], DEFAULT_DATA_POINTER_SIZE, tmp_buffer); memcpy(data, (tmp_buffer + remaining_offset), amount_to_read); data_length -= amount_to_read; amount_read += amount_to_read; remaining_offset -= amount_to_read; data_pointer_index++; /* free(tmp_buffer); */ } else { /* We have to skip a whole data pointer: */ remaining_offset -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); data_pointer_index++; } } /* time_t current_time; time ( ¤t_time ); file->access_time = current_time; */ return amount_read; }