|
|
- #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;
-
- }
|