You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
6.1 KiB
169 lines
6.1 KiB
#include "lsfs.h"
|
|
/* #include "../std_singos/string.h" */
|
|
extern FSCI fsci;
|
|
|
|
int lsfs_disk_getattr(find_file, path)
|
|
lsfs_file* find_file;
|
|
char* path;
|
|
{
|
|
int i;
|
|
String_Array *split_path = string_split_c(path, '/', false);
|
|
Length_String *filename = split_path->strings[split_path->length-1];
|
|
|
|
/* Start from the master table*/
|
|
Directory_Table *dir_table = lsfs_find_directory(path, true);
|
|
|
|
for (i = 0; i < DEFAULT_TABLE_SIZE; ++i)
|
|
{
|
|
if(strcmp( filename->chars, dir_table->entries[i].filename ) == 0) {
|
|
find_file->file_id[0] = dir_table->entries[i].file_id;
|
|
find_file->entry_kind = dir_table->entries[i].entry_kind;
|
|
find_file->table_entry_pointer[0] = i;
|
|
find_file->filename = dir_table->entries[i].filename;
|
|
find_file->table_entry_sector_index[0] = dir_table->entries[i].table_entry_sector_index;
|
|
find_file->owner_id = 1;
|
|
find_file->size[0] = dir_table->entries[i].file_size; /* dir_table->entries[i].data_pointer[0]; ;*/
|
|
find_file->creation_date[0] = 0;
|
|
find_file->access_time[0] = 0;
|
|
find_file->modification_time[0] = 0;
|
|
memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, NUM_DATA_POINTERS * 8);
|
|
find_file->number_sector = 1; /* TODO: should be loaded from disk.*/
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
Directory_Table* lsfs_find_directory(path, drop_filename)
|
|
char *path;
|
|
short drop_filename;
|
|
{
|
|
int number_of_traversal;
|
|
int i, j;
|
|
String_Array *split_path;
|
|
Directory_Table *dir_table = calloc(1, sizeof(Directory_Table));
|
|
/* printf("Table index: %lu \n",fsci.master_table_index ); */
|
|
disk_service_read_data_from_disk(fsci.master_table_index[0], DEFAULT_TABLE_SIZE, dir_table, 0x50);
|
|
split_path = string_split_c(path, '/', false);
|
|
|
|
number_of_traversal = split_path->length;
|
|
|
|
if (drop_filename)
|
|
{
|
|
number_of_traversal -= 1;
|
|
}
|
|
|
|
/* Start from the master table */
|
|
for (i = 0; i < number_of_traversal; ++i)
|
|
{
|
|
for (j = 0; j < DEFAULT_TABLE_SIZE; ++j)
|
|
{
|
|
if (strcmp(dir_table->entries[j].filename, split_path->strings[i]->chars) == 0)
|
|
{
|
|
int index_sector = dir_table->entries[j].data_pointer[0];
|
|
/* printf("Table index: %lu \n",index_sector ); */
|
|
disk_service_read_data_from_disk(index_sector, DEFAULT_TABLE_SIZE, dir_table);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return dir_table;
|
|
}
|
|
|
|
int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry, data_segment)
|
|
lsfs_file *file;
|
|
int buffer_size;
|
|
char *data;
|
|
long offset_to_next_entry;
|
|
unsigned int data_segment;
|
|
{
|
|
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, 0x50);
|
|
/* print_newline(); */
|
|
/* print_newline(); */
|
|
memcpy((data + amount_read), data_segment, tmp_buffer, 0x50, amount_to_read);
|
|
data_length -= amount_to_read;
|
|
amount_read += amount_to_read;
|
|
data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/
|
|
/* 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, 0x50);
|
|
|
|
memcpy(data, data_segment, (tmp_buffer + remaining_offset), 0x50, amount_to_read);
|
|
data_length -= amount_to_read;
|
|
amount_read += amount_to_read;
|
|
remaining_offset -= amount_to_read;
|
|
|
|
data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/
|
|
/* 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;
|
|
|
|
}
|
|
|