diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-10-22 22:55:02 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-10-22 22:55:02 +0200 |
| commit | 3c33d36759a316b8c118b77b3eed040425db8e0a (patch) | |
| tree | 07d5a05ceccf7de043f41ea49e34824e235b0cd9 /fs | |
| parent | 9fafc0e4937b039d67031e09843af12e9049cd73 (diff) | |
working on ext2 and readdir syscall
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ext2.c | 144 | ||||
| -rw-r--r-- | fs/fs.c | 17 |
2 files changed, 36 insertions, 125 deletions
@@ -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<inode.size_low) // use size high? { + if(c==max)break; + // read dir data ext2_dir dir; ram_read(ptr,&dir,sizeof(dir),1); - ptr+=sizeof(dir); - - /* - printf("inode: %i\n",dir.inode); - printf("total size: %i\n",dir.size); - printf("length low/high: %i/%i\n\n",dir.name_length_low,dir.name_length_high); - */ -// int l=fread(buf,sizeof(char),dir.name_length_low,stdin); - ram_read(ptr,&buf,sizeof(char),dir.name_length_low); + // read name + ptr+=sizeof(dir); + ram_read(ptr,&buf,sizeof(char),dir.name_length_low); ptr+=dir.name_length_low; - buf[dir.name_length_low]=0; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d %s",dir.inode,buf); + + // increment memory pointer and position ptr+=dir.size-8-dir.name_length_low; pos+=dir.size; - } - -} - -/* -int main() -{ - ext2_superblock super; - ext2_superblock_ext super_ext; - - printf("ext2 fools driver\n"); - printf("reading superblock...\n\n"); - - fseek(stdin,1024,SEEK_SET); - fread(&super,sizeof(super),1,stdin); + // copy data over to dirs + dirs[c].inode=dir.inode; - printf("block size: %i\n",1024<<super.block_size); - printf("block count: %i\n",super.blocks_count); - printf("inode count: %i\n\n",super.inodes_count); + ext2_inode inode_current=ext2_get_inode(ram,dir.inode); - printf("blocks/group: %i\n",super.blocks_per_group); - printf("inodes/group: %i\n\n",super.inodes_per_group); - - printf("signature: 0x%x\n",super.ext2_sig); - printf("fs state: %i\n",super.fs_state); - printf("version: %i.%i\n\n",super.version_major,super.version_minor); - - if(super.version_major>=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<inode.size_low) - { - ext2_dir dir; - fread(&dir,sizeof(dir),1,stdin); - printf("inode: %i\n",dir.inode); - printf("total size: %i\n",dir.size); - printf("length low/high: %i/%i\n\n",dir.name_length_low,dir.name_length_high); - int l=fread(buf,sizeof(char),dir.name_length_low,stdin); - buf[l]=0; - printf("name: %s\n\n",buf); - fseek(stdin,dir.size-8-dir.name_length_low,SEEK_CUR); - pos+=dir.size; } - - puts(""); - puts(""); + return c; } -*/ - - @@ -4,23 +4,10 @@ // // returns number of entries in the directory specified by name. // fills 0-max into *dirs + int fs_readdir(const char *name,fs_dirent *dirs,int max) { - int testdata=5; - - int inodes[]={13,14,15,16,17}; - char names[][256]={"dupa","test","drei","vier","funf"}; - char type[]={2,2,1,2,1}; - - for(int i=0;i<5;i++) - { - dirs[i].inode=inodes[i]; - for(int j=0;j<256;j++) - dirs[i].name[j]=names[i][j]; - dirs[i].type=type[i]; - } - - return 5; + return ext2_read_dir(0x80800, 2,dirs,max); // TODO: hardcoded, fix this } |
