From 3c33d36759a316b8c118b77b3eed040425db8e0a Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Wed, 22 Oct 2014 22:55:02 +0200 Subject: working on ext2 and readdir syscall --- fs/ext2.c | 144 +++++++++++++++----------------------------------------------- 1 file changed, 34 insertions(+), 110 deletions(-) (limited to 'fs/ext2.c') diff --git a/fs/ext2.c b/fs/ext2.c index bdfb80b..c59f864 100644 --- a/fs/ext2.c +++ b/fs/ext2.c @@ -5,6 +5,7 @@ #include "lib/int/stdint.h" #include "lib/logger/log.h" +#include "fs.h" typedef struct ext2_superblock_struct { @@ -194,142 +195,65 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max) } // if(block>=12)panic(FOOLOS_MODULE_NAME,"such big files unsupported yet"); - - } - - -int ext2_read_root_dir(uint8_t *ram) +int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max) { - - ext2_inode inode=ext2_get_inode(ram,2); + + 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]; //use other pointers in future! + uint8_t *ptr=ram+block_size*inode.direct_pointer[0]; //TODO: use other pointers in future! int pos=0; + int c=0; + while(pos=1) - { - printf("getting extended fields...\n\n"); - fread(&super_ext,sizeof(super_ext),1,stdin); - - printf("first (non reserved) inode: %i\n",super_ext.first_inode); - printf("inode size: %i\n\n",super_ext.size_inode); - - printf("opt_features: %i\n",super_ext.features_opt); - printf("req_features: %i\n",super_ext.features_req); - printf("write_features: %i\n\n",super_ext.features_write); - - printf("volume name: %s\n",super_ext.vol_name); - printf("mount path: %s\n\n",super_ext.last_path); - - } - - ext2_blockgroup_desc desc; - printf("getting block group descriptors...\n\n"); - //TODO: only correct for 1024bytes/block. read more than one!!! - int block_size=1024; - int descriptor_start_block=2; - fseek(stdin,block_size*descriptor_start_block,SEEK_SET); - - fread(&desc,sizeof(desc),1,stdin); - printf("block usage bitmap: 0x%x\n",desc.addr_block_bitmap); - printf("inode usage bitmap: 0x%x\n",desc.addr_inode_bitmap); - printf("inode table: 0x%x\n\n",desc.addr_inode_table); - printf("unalloc blocks: %i\n",desc.unalloc_blocks_count); - printf("unalloc inodes: %i\n",desc.unalloc_inodes_count); - printf("directories: %i\n\n",desc.dir_count); - - //TODO: check for version >1 - int inode_size=128; - ext2_inode inode; - printf("reading inode 2 (root dir)...\n\n"); - fseek(stdin,block_size*desc.addr_inode_table,SEEK_SET); - fread(&inode,sizeof(inode),1,stdin); + if(inode_current.permissions&0x4000) + { + dirs[c].type=FS_FILE_TYPE_DIR; + } + else + { + dirs[c].type=FS_FILE_TYPE_FILE; + } - fread(&inode,sizeof(inode),1,stdin); + int i=0; + do{ + dirs[c].name[i]=buf[i]; + i++; + }while(buf[i-1]!=0); - printf("---------- root ---------\n"); - printf("uid/gid: %i/%i\n",inode.user_id,inode.group_id); - printf("hardlinks: %i\n",inode.hardlink_count); - printf("size low/high: %i/%i\n",inode.size_low,inode.size_high); - printf("direct block pointer 0: %i\n\n",inode.direct_pointer[0]); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"name: %s\n",dirs[c].name); - // read dir - char buf[256]; - fseek(stdin,block_size*inode.direct_pointer[0],SEEK_SET); + c++; - int pos=0; - while(pos