// ext2 minidriver // based on osdev wiki article: http://wiki.osdev.org/Ext2 #define FOOLOS_MODULE_NAME "ext2" #include "lib/int/stdint.h" #include "lib/logger/log.h" #include "fs.h" typedef struct ext2_superblock_struct { uint32_t inodes_count; uint32_t blocks_count; uint32_t blocks_reserved_count; uint32_t inodes_unalloc_count; uint32_t blocks_unalloc_count; uint32_t superblock_number; uint32_t block_size; uint32_t fragment_size; uint32_t blocks_per_group; uint32_t fragments_per_group; uint32_t inodes_per_group; uint8_t skip[12]; // maybe we will look at these fields later... uint16_t ext2_sig; // 0xef5 uint16_t fs_state; uint16_t error_handle; uint16_t version_minor; uint8_t skip2[8]; // maybe we will look at these fields later... uint32_t os_id; uint32_t version_major; uint16_t uid_reserved; uint16_t gid_reserved; }ext2_superblock; typedef struct ext2_superblock_ext_struct { uint32_t first_inode; uint16_t size_inode; uint16_t blockgroup; uint32_t features_opt; uint32_t features_req; uint32_t features_write; uint32_t blkid[4]; char vol_name[16]; char last_path[64]; uint32_t compression; uint8_t prealloc_files; uint8_t prealloc_dirs; uint8_t unused[2]; uint32_t journalid[4]; uint32_t journal_inode; uint32_t journal_device; uint32_t orpan_head; }ext2_superblock_ext; typedef struct ext2_blockgroup_desc_struct { uint32_t addr_block_bitmap; uint32_t addr_inode_bitmap;; uint32_t addr_inode_table; uint16_t unalloc_blocks_count; uint16_t unalloc_inodes_count; uint16_t dir_count; uint8_t unused[14]; }ext2_blockgroup_desc; typedef struct ext2_dir_struct { uint32_t inode; uint16_t size; uint8_t name_length_low; uint8_t name_length_high; // name follows }ext2_dir; typedef struct ext2_inode_struct { uint16_t permissions; uint16_t user_id; uint32_t size_low; uint32_t skip[4]; uint16_t group_id; uint16_t hardlink_count; uint32_t disk_sectors; uint32_t flags; uint32_t os_specific; uint32_t direct_pointer[12]; uint32_t indirect1; uint32_t indirect2; uint32_t indirect3; uint32_t gen_num; uint32_t later1; // will be implemented later by the fooldriver uint32_t size_high; uint32_t frag; uint32_t os_spec2[3]; }ext2_inode; void ram_read(char *in,char *out,int size, int count) { for(int i=0;i=block_size) { block++; if(block>=12) { int indirect_block=block-12; uint32_t *indirect_ptr=ram+block_size*inode.indirect1; ptr=ram+block_size*indirect_ptr[indirect_block]; } else { ptr=ram+block_size*inode.direct_pointer[block]; } block_counter=0; } } // if(block>=12)panic(FOOLOS_MODULE_NAME,"such big files unsupported yet"); } int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read_dir : max: %d",max); ext2_inode inode=ext2_get_inode(ram,inode_nr); char buf[256]; int block_size=1024; uint8_t *ptr=ram+block_size*inode.direct_pointer[0]; //TODO: use other pointers in future! int pos=0; int c=0; while(pos