summaryrefslogtreecommitdiff
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
parent9fafc0e4937b039d67031e09843af12e9049cd73 (diff)
working on ext2 and readdir syscall
-rw-r--r--fs/ext2.c144
-rw-r--r--fs/fs.c17
-rw-r--r--kernel/config.h1
-rw-r--r--kernel/kernel.c1
-rw-r--r--kernel/syscalls.c1
-rw-r--r--lib/logger/log.c3
-rw-r--r--release/FoolOS.imgbin1474560 -> 1474560 bytes
-rw-r--r--userspace/foolshell.c10
-rw-r--r--userspace/syscalls.c2
9 files changed, 47 insertions, 132 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
}
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
index 53e64bd..88ef1d6 100644
--- a/release/FoolOS.img
+++ b/release/FoolOS.img
Binary files differ
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;
}
//