summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-23 23:26:26 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-23 23:26:26 +0100
commitec0ba7bc40854eab6a1cdb41364f41f9c11407e1 (patch)
tree88f3896c70ac32bc1b70dcd7ebddbbe595c6608f /fs
parent50300fa573bf2bc00f9732e812d54ab77cf03dd7 (diff)
foolshell and syscalls improvememets
Diffstat (limited to 'fs')
-rw-r--r--fs/ext2.c48
-rw-r--r--fs/fs.c4
-rw-r--r--fs/fs.h3
3 files changed, 51 insertions, 4 deletions
diff --git a/fs/ext2.c b/fs/ext2.c
index 6920b40..4db858f 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -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)
diff --git a/fs/fs.c b/fs/fs.c
index 5f5ea75..8052d5f 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -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
}
diff --git a/fs/fs.h b/fs/fs.h
index 77b53ad..7ced0a7 100644
--- a/fs/fs.h
+++ b/fs/fs.h
@@ -3,7 +3,8 @@
#include <stdint.h>
-#define EXT2_RAM_ADDRESS 0x168800
+
+#define EXT2_RAM_ADDRESS (0x168800+0x100000)
enum FS_FILE_TYPE{