|
|
@ -238,18 +238,19 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { |
|
|
|
|
|
|
|
int lsfs_disk_read_data_from_file(lsfs_file *file, int buffer_size, char *data, size_t offset_to_next_entry) |
|
|
|
{ |
|
|
|
int data_length = file->size; |
|
|
|
int data_length = file->size - offset_to_next_entry; |
|
|
|
int amount_read = 0; |
|
|
|
int amount_to_read = 0; |
|
|
|
//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 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. |
|
|
|
while(data_length > 0) // We have more to write |
|
|
|
{ |
|
|
|
if (offset_to_next_entry == 0) |
|
|
|
if (remaining_offset == 0) |
|
|
|
{ |
|
|
|
char *tmp_buffer = calloc(DEFAULT_DATA_POINTER_SIZE, SECTOR_SIZE); |
|
|
|
assert(tmp_buffer); |
|
|
@ -270,25 +271,26 @@ int lsfs_disk_read_data_from_file(lsfs_file *file, int buffer_size, char *data, |
|
|
|
data_pointer_index++; |
|
|
|
free(tmp_buffer); |
|
|
|
} |
|
|
|
else if (offset_to_next_entry <= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) |
|
|
|
else if (remaining_offset < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) |
|
|
|
{ |
|
|
|
char *tmp_buffer = calloc(1, ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - offset_to_next_entry)); |
|
|
|
char *tmp_buffer = calloc(1, (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)); |
|
|
|
assert(tmp_buffer); |
|
|
|
|
|
|
|
if (data_length < ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - offset_to_next_entry) ) |
|
|
|
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) - offset_to_next_entry); |
|
|
|
amount_to_read = ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset); |
|
|
|
} |
|
|
|
|
|
|
|
read_data_from_disk_off(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, offset_to_next_entry); |
|
|
|
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); |
|
|
|
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); |
|
|
@ -296,7 +298,7 @@ int lsfs_disk_read_data_from_file(lsfs_file *file, int buffer_size, char *data, |
|
|
|
else |
|
|
|
{ |
|
|
|
// We have to skip a whole data pointer: |
|
|
|
offset_to_next_entry -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); |
|
|
|
remaining_offset -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); |
|
|
|
data_pointer_index++; |
|
|
|
} |
|
|
|
|
|
|
@ -321,19 +323,22 @@ int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data, s |
|
|
|
int new_filesize = data_length + offset_to_next_entry; |
|
|
|
int amount_written = 0; |
|
|
|
int amount_to_write = 0; |
|
|
|
//printf("Data length: %d\n", data_length); |
|
|
|
//printf("Offset length: %d\n", offset_to_next_entry); |
|
|
|
printf("Data length: %d\n", data_length); |
|
|
|
printf("Offset length: %d\n", offset_to_next_entry); |
|
|
|
|
|
|
|
|
|
|
|
int data_pointer_index = 0; // start at first data pointer. |
|
|
|
while(data_length > 0) // We have more to write |
|
|
|
{ |
|
|
|
printf("Outside: Data pointers: %d\n", file->data_pointer[data_pointer_index]); |
|
|
|
while (file->data_pointer[data_pointer_index] == 0) |
|
|
|
{ |
|
|
|
printf("inside: Data pointers: %d\n", file->data_pointer[data_pointer_index]); |
|
|
|
// we have to assign a free sector |
|
|
|
if (get_free_sectors(1, file->data_pointer)) |
|
|
|
{ |
|
|
|
// This is a fail case, we cannot assign a new sector: |
|
|
|
printf("SHIT"); |
|
|
|
return amount_written; |
|
|
|
} |
|
|
|
} |
|
|
@ -360,10 +365,11 @@ int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data, s |
|
|
|
data_pointer_index++; |
|
|
|
free(tmp_buffer); |
|
|
|
} |
|
|
|
else if (offset_to_next_entry <= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) |
|
|
|
else if (offset_to_next_entry < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) |
|
|
|
{ |
|
|
|
char *tmp_buffer = calloc(1, ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - offset_to_next_entry)); |
|
|
|
char *tmp_buffer = calloc(1, (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)); |
|
|
|
assert(tmp_buffer); |
|
|
|
read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer); |
|
|
|
|
|
|
|
if (data_length < ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - offset_to_next_entry) ) |
|
|
|
{ |
|
|
@ -375,12 +381,12 @@ int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data, s |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
memcpy(tmp_buffer, (data + amount_written), amount_to_write); |
|
|
|
memcpy(tmp_buffer + offset_to_next_entry, data, amount_to_write); |
|
|
|
data_length -= amount_to_write; |
|
|
|
amount_written += amount_to_write; |
|
|
|
offset_to_next_entry -= amount_to_write; |
|
|
|
|
|
|
|
|
|
|
|
write_data_to_disk_off(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, offset_to_next_entry); |
|
|
|
write_data_to_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer); |
|
|
|
data_pointer_index++; |
|
|
|
free(tmp_buffer); |
|
|
|
} |
|
|
@ -388,6 +394,7 @@ int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data, s |
|
|
|
{ |
|
|
|
// We have to skip a whole data pointer: |
|
|
|
offset_to_next_entry -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); |
|
|
|
printf("Skip, offset is now: %d\n", offset_to_next_entry); |
|
|
|
data_pointer_index++; |
|
|
|
} |
|
|
|
|
|
|
@ -406,6 +413,7 @@ int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data, s |
|
|
|
//write_data_to_disk(file->file_id, 4, &p_control.master_table[file->file_id]); |
|
|
|
|
|
|
|
// Should return the total new file size |
|
|
|
printf("We Think that we have written: %d \n", amount_written); |
|
|
|
return amount_written; |
|
|
|
} |
|
|
|
|
|
|
@ -518,6 +526,7 @@ int get_free_sectors(int num_sectors_needed, lsfs_sector_offset* output_array) { |
|
|
|
{ |
|
|
|
return -EINVAL; // We don't have any more data pointers. |
|
|
|
} |
|
|
|
|
|
|
|
if (output_array[i] == 0) |
|
|
|
{ |
|
|
|
// If free we can assign: |
|
|
@ -619,8 +628,8 @@ int lsfs_disk_install_vbr(char *vbr_path) |
|
|
|
|
|
|
|
fseek(vbr, 0, SEEK_SET); |
|
|
|
fread(vbr_buffer, 1, st.st_size, vbr); |
|
|
|
|
|
|
|
write_data_to_disk((p_control.fsci.this_partition_offset_on_disk - SPACE_VBR_RECORD), SPACE_VBR_RECORD, vbr); // Write this to the first sector of the disk. |
|
|
|
printf("Sector index for vbr: %d - %d\n", (p_control.fsci.this_partition_offset_on_disk - SPACE_VBR_RECORD), st.st_size); |
|
|
|
write_data_to_disk((p_control.fsci.this_partition_offset_on_disk - SPACE_VBR_RECORD), SPACE_VBR_RECORD, vbr_buffer); // Write this to the first sector of the disk. |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|