@ -46,6 +46,7 @@ int save_modified_file_information(lsfs_file* file);
# define SECTOR_SIZE 512
# define NUMBER_OF_MBR_PARTITIONS 4
# define DEFAULT_FILE_SIZE 4 / / This is in sectors
# define DEFAULT_MASTER_TABLE_SIZE 64
# define DEFAULT_TAG_TABLE_SIZE 64 / / correspond to 262144 bytes in sectors - 16384 files pr. default. (minus one, the last is a pointer to a table more )
@ -62,6 +63,23 @@ typedef struct struct_partition_control{
table_entry * master_table ;
} __attribute__ ( ( packed ) ) partition_control ;
typedef struct Partition_Entry
{
uint8_t active_falg ; / / This has value 0x80 if it is a bootable partition / it is an active partition .
uint8_t CHS_start_addr [ 3 ] ; / / [ 0 ] = H , [ 1 ] = S , [ 2 ] = C
uint8_t partition_type ; / / This has a value such that one can idenfity which file system the partition is .
uint8_t CHS_last_addr [ 3 ] ; / / [ 0 ] = H , [ 1 ] = S , [ 2 ] = C
uint32_t LBA_abs_first_sector ;
uint32_t number_of_sectors ;
} __attribute__ ( ( packed ) ) Partition_Entry ;
typedef struct Master_Boot_record {
uint8_t offset_on_disk [ 446 ] ; / / The code for the bootloader
Partition_Entry partitions [ 4 ] ;
uint8_t master_tag_records [ 2 ] ; / / Signature
} __attribute__ ( ( packed ) ) Master_Boot_record ;
typedef struct File_System_Control_Information {
uint64_t offset_on_disk ;
uint64_t next_partition ;
@ -82,7 +100,7 @@ typedef struct struct_table_entry {
struct {
uint32_t is_filename : 1 ;
} control_bits ;
lsfs_sector_offset data_pointer [ NUM_DATA_POINTERS ]
lsfs_sector_offset data_pointer [ NUM_DATA_POINTERS ] ;
} __attribute__ ( ( packed ) ) table_entry ;
@ -237,7 +255,6 @@ time_t lsfs_disk_truncate_file(lsfs_file *file, off_t offset) {
/ / read_data_from_disk ( file_id , & file_mif ) ;
time_t result = lsfs_disk_update_timestamps ( file ) ;
file - > size = ( int ) offset ; / / p_control . master_table [ i ] . data_pointer [ 0 ] ; / / ;
save_modified_file_information ( file ) ;
@ -515,16 +532,26 @@ int create_file_system() {
}
int lsfs_disk_load_disk ( ) {
/ / First we find the Mater Table .
fseek ( disk , 24 * SECTOR_SIZE , SEEK_SET ) ;
fread ( p_control . master_table , 1 , sizeof ( table_entry ) * DEFAULT_MASTER_TABLE_SIZE , disk ) ;
/ / Now we can finde the FSCI data
/ / fseek ( disk , 0 , SEEK_SET ) ;
/ / fread ( p_control . fsci , 1 , sizeof ( FSCI ) , disk ) ;
return 1 ;
/ / Find the partition talbe :
/ / This makes is BIOS dependent .
/ / UEFI is not supported .
Master_Boot_record mbr ;
fseek ( disk , 0 * SECTOR_SIZE , SEEK_SET ) ;
fread ( & mbr , 1 , sizeof ( mbr ) , disk ) ;
for ( int i = 0 ; i < NUMBER_OF_MBR_PARTITIONS ; + + i )
{
/ / TODO ( Jørn ) We maybe wnat to optimize , such that we can detect if we have more than one partition opn the system .
if ( mbr . partitions [ i ] . partition_type = = 0x18 )
{
printf ( " %d \n " , mbr . partitions [ i ] . LBA_abs_first_sector ) ;
/ / First we find the Mater Table .
fseek ( disk , mbr . partitions [ i ] . LBA_abs_first_sector * SECTOR_SIZE , SEEK_SET ) ;
fread ( p_control . master_table , 1 , sizeof ( table_entry ) * DEFAULT_MASTER_TABLE_SIZE , disk ) ;
return 1 ;
}
}
return 0 ;
}