Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

112 wiersze
3.6 KiB

#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 ( &current_time );
file->access_time = current_time;
*/
return amount_read;
}