summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-10-22 22:55:02 +0200
committerMichal Idziorek <m.i@gmx.at>2014-10-22 22:55:02 +0200
commit3c33d36759a316b8c118b77b3eed040425db8e0a (patch)
tree07d5a05ceccf7de043f41ea49e34824e235b0cd9 /fs
parent9fafc0e4937b039d67031e09843af12e9049cd73 (diff)
working on ext2 and readdir syscall
Diffstat (limited to 'fs')
-rw-r--r--fs/ext2.c144
-rw-r--r--fs/fs.c17
2 files changed, 36 insertions, 125 deletions
diff --git a/fs/ext2.c b/fs/ext2.c
index bdfb80b..c59f864 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -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;
}
-*/
-
-
diff --git a/fs/fs.c b/fs/fs.c
index e22c715..606e05c 100644
--- a/fs/fs.c
+++ b/fs/fs.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
}