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