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 | |
| parent | 9fafc0e4937b039d67031e09843af12e9049cd73 (diff) | |
working on ext2 and readdir syscall
| -rw-r--r-- | fs/ext2.c | 144 | ||||
| -rw-r--r-- | fs/fs.c | 17 | ||||
| -rw-r--r-- | kernel/config.h | 1 | ||||
| -rw-r--r-- | kernel/kernel.c | 1 | ||||
| -rw-r--r-- | kernel/syscalls.c | 1 | ||||
| -rw-r--r-- | lib/logger/log.c | 3 | ||||
| -rw-r--r-- | release/FoolOS.img | bin | 1474560 -> 1474560 bytes | |||
| -rw-r--r-- | userspace/foolshell.c | 10 | ||||
| -rw-r--r-- | userspace/syscalls.c | 2 |
9 files changed, 47 insertions, 132 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 } diff --git a/kernel/config.h b/kernel/config.h index 3870673..019ef34 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -1,3 +1,4 @@ //#define FOOLOS_COMPILE_FLOPPY #define FOOLOS_CONSOLE_AUTOBREAK //add newline automatically at end of line +#define FOOLOS_LOG_OFF // do not log anythong diff --git a/kernel/kernel.c b/kernel/kernel.c index 4539c90..701d33f 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -195,7 +195,6 @@ void kernel_main(uint32_t initial_stack, int mp) //vesa_init_doublebuff(); ext2_check(0x80800); - ext2_read_root_dir(0x80800); ext2_inode_content(0x80800,15,0x100000,0x100000); // autorun "user-space" prog diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 5ddd4c8..0fe1542 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -33,7 +33,6 @@ int syscall_read(int file, char *buf, int len) // if(ret) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read kb buffer: %d",c); } - } int syscall_readdir(const char *name,fs_dirent *dirs,int max) diff --git a/lib/logger/log.c b/lib/logger/log.c index 93245bd..391fbcf 100644 --- a/lib/logger/log.c +++ b/lib/logger/log.c @@ -4,6 +4,7 @@ #include <stdarg.h> #include "log.h" +#include "kernel/config.h" #include "lib/int/stdint.h" #include "kernel/time.h" @@ -17,7 +18,9 @@ void PutConsole(char *str, int color); void log(char *module_name, int log_level, char *format_string, ...) { +#ifdef FOOLOS_LOG_OFF return; +#endif if(log_level<FOOLOS_LOG_INFO)return; diff --git a/release/FoolOS.img b/release/FoolOS.img Binary files differindex 53e64bd..88ef1d6 100644 --- a/release/FoolOS.img +++ b/release/FoolOS.img diff --git a/userspace/foolshell.c b/userspace/foolshell.c index 15f26e3..6baeb87 100644 --- a/userspace/foolshell.c +++ b/userspace/foolshell.c @@ -37,7 +37,7 @@ int main(int argc, char **argv) char **tokenize(char *buf) { - + char **token; token=malloc(10*sizeof(char*)); @@ -144,13 +144,15 @@ int process(char *buf) } else if(!strcmp(command,"LS")) { + //fs_dirent dirs[25]; + + fs_dirent *dirs=malloc(sizeof(fs_dirent)*25); - fs_dirent dirs[5]; - int ls=readdir("/dupa",&dirs,5); + int ls=readdir("/dupa",dirs,25); int i; for(i=0;i<ls;i++) { - printf("%i %s%c\n",dirs[i].inode, dirs[i].name, ((dirs[i].type==2)?'/':' ')); + printf("%i %s%c\n",dirs[i].inode, dirs[i].name, ((dirs[i].type==FS_FILE_TYPE_DIR)?'/':' ')); } } diff --git a/userspace/syscalls.c b/userspace/syscalls.c index b514eab..11976bc 100644 --- a/userspace/syscalls.c +++ b/userspace/syscalls.c @@ -13,7 +13,7 @@ easywrite(char *c); void syscalls_init() { preread=0; - alloc=0x500000; + alloc=0x300000; } // |
