diff options
Diffstat (limited to 'fs/ext2.c')
| -rw-r--r-- | fs/ext2.c | 48 |
1 files changed, 46 insertions, 2 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) |
