5 changed files with 385 additions and 795 deletions
			
			
		
									
										Binary file not shown.
									
								
							
						@ -1,169 +0,0 @@ | 
				
			|||||||
#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; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue