From c324d46885c018e1b8d92b03e74d709c62ef66db Mon Sep 17 00:00:00 2001 From: pjht Date: Sat, 29 Jun 2019 09:55:02 -0500 Subject: [PATCH] Add fopen and fd limits to the VFS and test it --- init/main.c | 85 ++++++++++++++++++++++--------------- sysroot/usr/include/stdio.h | 23 +++------- vfs/main.c | 80 ++++++++++++++++++++++------------ 3 files changed, 111 insertions(+), 77 deletions(-) diff --git a/init/main.c b/init/main.c index 0cc3c9b..edaf1de 100644 --- a/init/main.c +++ b/init/main.c @@ -29,6 +29,36 @@ uint32_t getsize(const char *in) { return size; } +void display_msg(vfs_message* vfs_msg) { + vga_write_string("Message of type "); + char str[256]; + str[0]='\0'; + int_to_ascii(vfs_msg->type,str); + vga_write_string(str); + vga_write_string("\n"); + vga_write_string("ID "); + str[0]='\0'; + int_to_ascii(vfs_msg->id,str); + vga_write_string(str); + vga_write_string("\n"); + vga_write_string("Mode "); + vga_write_string(&vfs_msg->mode[0]); + vga_write_string("\n"); + vga_write_string("FD "); + str[0]='\0'; + int_to_ascii(vfs_msg->fd,str); + vga_write_string(str); + vga_write_string("\n"); + vga_write_string("Path "); + vga_write_string(&vfs_msg->path[0]); + vga_write_string("\n"); + vga_write_string("Flags "); + str[0]='\0'; + hex_to_ascii(vfs_msg->flags,str); + vga_write_string(str); + vga_write_string("\n"); +} + int main(char* initrd, uint32_t initrd_sz) { text_fb_info info; info.address=map_phys((void*)0xB8000,10); @@ -48,11 +78,9 @@ int main(char* initrd, uint32_t initrd_sz) { uint32_t size=getsize(tar_hdr.size); pos+=512; if (strcmp(tar_hdr.filename,"vfs")==0) { - vga_write_string("VFS found, loading\n"); datapos=pos; break; } else { - vga_write_string("VFS not found\n"); // for(;;); } pos+=size; @@ -90,13 +118,10 @@ int main(char* initrd, uint32_t initrd_sz) { } copy_data(cr3,ptr,pheader.memsz,(void*)pheader.vaddr); } - vga_write_string("Loaded VFS into memory, creating task\n"); createTaskCr3((void*)header.entry,cr3); - vga_write_string("Created VFS task, creating mailbox\n"); uint32_t box=mailbox_new(16); - vga_write_string("Created mailbox, yielding to VFS so it can create it's mailbox.\n"); yield(); - vga_write_string("VFS yielded back, sending test message\n"); + vga_write_string("Sending first test message\n"); vfs_message* msg_data=malloc(sizeof(vfs_message)); msg_data->type=VFS_OPEN; msg_data->id=1; @@ -108,39 +133,29 @@ int main(char* initrd, uint32_t initrd_sz) { msg.msg=msg_data; msg.size=sizeof(vfs_message); mailbox_send_msg(&msg); - vga_write_string("Sent test message, yielding to task\n"); yield(); - vga_write_string("Yielded and got control, getting message\n"); + vga_write_string("Getting message\n"); msg.msg=malloc(sizeof(vfs_message)); mailbox_get_msg(box,&msg,sizeof(vfs_message)); vfs_message* vfs_msg=(vfs_message*)msg.msg; - vga_write_string("Message of type "); - char str[256]; - str[0]='\0'; - int_to_ascii(vfs_msg->type,str); - vga_write_string(str); - vga_write_string("\n"); - vga_write_string("ID "); - str[0]='\0'; - int_to_ascii(vfs_msg->id,str); - vga_write_string(str); - vga_write_string("\n"); - vga_write_string("Mode "); - vga_write_string(&vfs_msg->mode[0]); - vga_write_string("\n"); - vga_write_string("FD "); - str[0]='\0'; - int_to_ascii(vfs_msg->fd,str); - vga_write_string(str); - vga_write_string("\n"); - vga_write_string("Path "); - vga_write_string(&vfs_msg->path[0]); - vga_write_string("\n"); - vga_write_string("Flags "); - str[0]='\0'; - hex_to_ascii(vfs_msg->flags,str); - vga_write_string(str); - vga_write_string("\n"); + display_msg(vfs_msg); + vga_write_string("Sending second test message\n"); + msg_data=malloc(sizeof(vfs_message)); + msg_data->type=VFS_OPEN; + msg_data->id=2; + strcpy(&msg_data->mode[0],"r"); + strcpy(&msg_data->path[0],"/dev/sdb"); + msg.from=box; + msg.to=1; + msg.msg=msg_data; + msg.size=sizeof(vfs_message); + mailbox_send_msg(&msg); + yield(); + vga_write_string("Getting message\n"); + msg.msg=malloc(sizeof(vfs_message)); + mailbox_get_msg(box,&msg,sizeof(vfs_message)); + vfs_msg=(vfs_message*)msg.msg; + display_msg(vfs_msg); } for(;;); } diff --git a/sysroot/usr/include/stdio.h b/sysroot/usr/include/stdio.h index 844e7cd..b41f1a4 100644 --- a/sysroot/usr/include/stdio.h +++ b/sysroot/usr/include/stdio.h @@ -5,26 +5,17 @@ #include #include -typedef struct { - char* mntpnt; - const char* path; - int wr; - int rd; - uint32_t type; - unsigned long pos; - int eof; - int error; - void* data; -} FILE; +#define FILE uint32_t #define SEEK_CUR 1 #define SEEK_END 2 #define SEEK_SET 3 #define EOF -1 -extern FILE* stdin; -extern FILE* stdout; -extern FILE* stderr; +#define stdin 0 +#define stdout 1 +#define stderr 2 + FILE* fopen(const char* filename,const char* mode); int fgetc(FILE* stream); @@ -42,7 +33,7 @@ int printf(const char* format,...); int fseek(FILE* stream,long offset,int origin); long ftell(FILE* stream); int fclose(FILE* file); -int feof(FILE *stream); -int ferror(FILE *stream); +int feof(FILE* stream); +int ferror(FILE* stream); #endif diff --git a/vfs/main.c b/vfs/main.c index cfc5ec8..4b4e319 100644 --- a/vfs/main.c +++ b/vfs/main.c @@ -3,18 +3,29 @@ #include #include +#define PROC_FD_LIMIT 1024 + typedef struct _vfs_mapping_struct { char* mntpnt; uint32_t type; struct _vfs_mapping_struct* next; } vfs_mapping; +typedef struct { + char* mntpnt; + char* path; + uint32_t pos; + char error; +} vfs_file; + static const char** drv_names; static uint32_t* drvs; static uint32_t max_drvs; static uint32_t next_drv_indx; static vfs_mapping* head_mapping; static vfs_mapping* tail_mapping; +uint32_t* fd_tables[32768]; +uint16_t open_fds[32768]; vfs_message* get_message(Message* msg,uint32_t box) { msg->msg=malloc(sizeof(vfs_message)); @@ -55,36 +66,53 @@ uint32_t register_fs(uint32_t drv,const char* type) { return next_drv_indx-1; } +char fopen(vfs_message* vfs_msg,uint32_t from) { + if (fd_tables[from]==NULL) { + fd_tables[from]=malloc(PROC_FD_LIMIT*sizeof(vfs_file)); + open_fds[from]=0; + } else { + if (open_fds[from]==PROC_FD_LIMIT) { + return 4; + } + } + uint16_t fd=open_fds[from]; + open_fds[from]++; + vfs_msg->fd=fd; + return 0; +} + int main() { init_vfs(); uint32_t box=mailbox_new(16); yield(); - Message msg; - vfs_message* vfs_msg=get_message(&msg,box); - switch (vfs_msg->type) { - case VFS_OPEN: - vfs_msg->flags=1; - break; - case VFS_PUTC: - vfs_msg->flags=1; - break; - case VFS_GETC: - vfs_msg->flags=1; - break; - case VFS_CLOSE: - vfs_msg->flags=1; - break; - case VFS_MOUNT: - vfs_msg->flags=1; - break; - case VFS_UMOUNT: - vfs_msg->flags=1; - break; - default: - vfs_msg->flags=2; - break; + while (1) { + Message msg; + vfs_message* vfs_msg=get_message(&msg,box); + switch (vfs_msg->type) { + case VFS_OPEN: + vfs_msg->flags=fopen(vfs_msg,msg.from); + break; + case VFS_PUTC: + vfs_msg->flags=1; + break; + case VFS_GETC: + vfs_msg->flags=1; + break; + case VFS_CLOSE: + vfs_msg->flags=1; + break; + case VFS_MOUNT: + vfs_msg->flags=1; + break; + case VFS_UMOUNT: + vfs_msg->flags=1; + break; + default: + vfs_msg->flags=2; + break; + } + mailbox_send_msg(&msg); + yield(); } - mailbox_send_msg(&msg); - yield(); for (;;); }