diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-23 23:26:26 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-23 23:26:26 +0100 |
| commit | ec0ba7bc40854eab6a1cdb41364f41f9c11407e1 (patch) | |
| tree | 88f3896c70ac32bc1b70dcd7ebddbbe595c6608f /fs | |
| parent | 50300fa573bf2bc00f9732e812d54ab77cf03dd7 (diff) | |
foolshell and syscalls improvememets
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ext2.c | 48 | ||||
| -rw-r--r-- | fs/fs.c | 4 | ||||
| -rw-r--r-- | fs/fs.h | 3 |
3 files changed, 51 insertions, 4 deletions
@@ -3,6 +3,8 @@ #define FOOLOS_MODULE_NAME "ext2" +#include <stdbool.h> + #include "lib/int/stdint.h" #include "lib/logger/log.h" #include "fs.h" @@ -240,11 +242,53 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max) } -//TODO!!! -int ext2_filename_to_inode(char *path) +int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start) { + bool final=false; + + // skip leading slashes + while(*path=='/')path++; + char *first=path; + + while(*path!='/'&&*path!=0)path++; + char *last=path; + + if(*path==0)final=true; + else(*path=0); + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"looking for %s '%s' in inode: %d",final?"file":"dir",first,inode_start); + + fs_dirent dirs[15]; + int count= ext2_read_dir(ram, inode_start,dirs,15); // get dir + + for(int i=0;i<count;i++) + { + if(true==strcmp(first,dirs[i].name,0)) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found: %s (%s)",first,dirs[i].type==FS_FILE_TYPE_DIR?"dir":"file"); + if(final)return dirs[i].inode; + return ext2_filename_to_inode_traverse(ram,last+1,dirs[i].inode); + } + //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"no match: %s",dirs[i].name); + } + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"file not found!"); + return -1; + + +} +int ext2_filename_to_inode(uint8_t *ram, char *path) +{ + char buf[256]; + for(int i=0;i<256;i++) + { + buf[i]=path[i]; + if(buf[i]==0)break; + } + + return ext2_filename_to_inode_traverse(ram,buf,2); } int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max) @@ -9,7 +9,9 @@ int fs_readdir(const char *name,fs_dirent *dirs,int max) { - return ext2_read_dir(EXT2_RAM_ADDRESS, name,dirs,max); // TODO: hardcoded, fix this + int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name); + if(inode_nr<1)return -1; + return ext2_read_dir(EXT2_RAM_ADDRESS, inode_nr,dirs,max); // TODO: hardcoded, fix this } @@ -3,7 +3,8 @@ #include <stdint.h> -#define EXT2_RAM_ADDRESS 0x168800 + +#define EXT2_RAM_ADDRESS (0x168800+0x100000) enum FS_FILE_TYPE{ |
