diff --git a/src/kernel/drivers/pci.c b/src/kernel/drivers/pci.c index 9fd1426..ddef5e0 100644 --- a/src/kernel/drivers/pci.c +++ b/src/kernel/drivers/pci.c @@ -89,7 +89,7 @@ void pci_make_file(uint32_t class, uint8_t bus, uint8_t slot, uint8_t func){ // file->write = pci_write_file; // if(file == 0) break; if(!file){ - mlog(MODULE_NAME, "Failed to make file for PCI device!\n", MLOG_PRINT); + mlog(MODULE_NAME, "Failed to make file for PCI device %s!\n", MLOG_PRINT, cpy); return; } // printf("ASSERT file == null: %d\n", file == 0); diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index c9cf5e9..c987535 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -58,10 +58,10 @@ extern void kmain(kernel_info_t *kernel_info){ pic_setmask(0x0, PIC1_DATA); pic_setmask(0x0, PIC2_DATA); vfs_init(); - fcreate("/dev", FS_FILE_IS_DIR); - fcreate("/dev/disk", FS_FILE_IS_DIR); fcreate("/tmp", FS_FILE_IS_DIR); + fcreate("/dev", FS_FILE_IS_DIR); fcreate("/boot", FS_FILE_IS_DIR); + fcreate("/dev/disk", FS_FILE_IS_DIR); mlog("KERNEL", "Initializing Scheduler & starting PID 1\n", MLOG_PRINT); boot_info = kernel_info; scheduler_init(); diff --git a/src/kernel/system/ramfs.c b/src/kernel/system/ramfs.c index 91e6a3d..4750e11 100644 --- a/src/kernel/system/ramfs.c +++ b/src/kernel/system/ramfs.c @@ -20,15 +20,19 @@ vfile_t root_dir = {"/", FS_FILE_IS_DIR | FS_FILE_SYSTEM, &ramfs_ops}; void ramfs_init(){ mlog(MODULE_NAME, "Initializing VFS\n", MLOG_PRINT); - root_dir.private = kmalloc(1); - root_dir.size = PAGE_SIZE_BYTES; + root_dir.private = 0; + root_dir.size = 0; // printf("Sizeof VFILE_T: %d", sizeof(vfile_t)); } vfile_t *search_dir(char *subname, vfile_t *directory){ + if(!directory) return 0; vfile_t **children = (vfile_t **)directory->private; + if(!children){ + return 0; + } for(int i = 0; i < directory->size / sizeof(vfile_t *); i++){ - if(!strcmp(children[i], subname)){ + if(children[i] && !strcmp(children[i]->name, subname)){ return children[i]; } } @@ -69,7 +73,6 @@ vfile_t *resolve_path(char *pathname, vfile_t *start, uint32_t get_last_child){ for(int i = 0; i < pathname_entries - !get_last_child; i++){ entry = search_dir(path_tokens[i], entry); current_path += strlen(path_tokens[i]) + 1; - if(!entry){ break; } @@ -78,7 +81,8 @@ vfile_t *resolve_path(char *pathname, vfile_t *start, uint32_t get_last_child){ entry = 0; break; } - entry->fileops->rfopen(current_path, entry); + entry = entry->fileops->rfopen(current_path, entry); + break; } } kfree(path); @@ -88,28 +92,76 @@ vfile_t *resolve_path(char *pathname, vfile_t *start, uint32_t get_last_child){ char *get_filename(char *path){ char *filename = path + strlen(path) - 1;//get last character in pathname - while(*filename != '/' || filename == path) filename--; + while(*filename != path[0] && (*filename != '/' || filename == path)) filename--; filename += filename != path;//if the new filename is at the beginning of the path, don't adjust for '/' character return filename; } -void ramfs_resize(vfile_t *file, uint32_t new_size_bytes){ - if(new_size_bytes == file->size) return; +int ramfs_resize(vfile_t *file, uint32_t new_size_bytes){ + if(new_size_bytes == file->size) return new_size_bytes; uint32_t new_size_pages = (new_size_bytes + PAGE_SIZE_BYTES - 1)/PAGE_SIZE_BYTES; - printf("New page count: %d from %d\n", new_size_pages, new_size_bytes); + uint32_t old_size_pages = (file->size + PAGE_SIZE_BYTES - 1)/PAGE_SIZE_BYTES; + do{ + if(old_size_pages == new_size_pages){ + break; + } + void *new_ptr = kmalloc(new_size_pages); + if(!new_ptr){ + mlog(MODULE_NAME, "Failed to allocate memory for virtual file!\n", MLOG_PRINT); + return 0; + } + if(file->private){ + memcpy((uint32_t *)file->private, (uint32_t*)new_ptr, file->size); + kfree(file->private); + } + file->private = new_ptr; + }while(0); + file->size = new_size_bytes; + return new_size_bytes; } -vfile_t *ramfs_create(char *path, FS_FILE_FLAGS flags){ +vfile_t *ramfs_create(vfile_t *root, char *path, FS_FILE_FLAGS flags){ if(!path){ return 0; } - vfile_t *parent = resolve_path(path, &root_dir, false); - if(!parent){ + if(path[0] == '/') path++; + vfile_t *parent = resolve_path(path, root, false); + if(!parent || !parent->flags & FS_FILE_IS_DIR){ mlog(MODULE_NAME, "Could not locate parent directory for %s\n", MLOG_PRINT, path); + path--; + return 0; } - get_filename(path); - ramfs_resize(parent, 8191); - return 0; + char *new_name = get_filename(path); + // printf("%d\n", parent->size); + vfile_t **dirents = (vfile_t **)parent->private; + uint32_t insert_index = 0; + for(uint32_t i = 0; i < parent->size/sizeof(vfile_t *); i++){ + if(dirents[i]){ + continue; + } + //Empty dirent, can insert + vfile_t *new_file = kmalloc(1); + *new_file = (vfile_t){0}; + // new_file->name = new_name; + strcpy(new_name, new_file->name); + new_file->flags = flags; + dirents[i] = new_file; + new_file->fileops = &ramfs_ops; + path--; + return new_file; + } + //no empty dirents, must resize + if( !ramfs_resize(parent, parent->size + 4)) return 0; + dirents = parent->private; + vfile_t *new_file = kmalloc(1); + if(!new_file) return 0; + *new_file = (vfile_t){0}; + strcpy(new_name, new_file->name); + new_file->flags = flags; + dirents[parent->size/(sizeof(vfile_t*)) - 1] = new_file; + new_file->fileops = &ramfs_ops; + path--; + return new_file; } int ramfs_delete(vfile_t *file){ @@ -130,7 +182,9 @@ void ramfs_close(vfile_t *file){ return; } vfile_t *ramfs_rfopen(char *name, vfile_t *parent){ - return 0; + vfile_t *returnable = resolve_path(name, parent, true); + // for(;;); + return returnable; } vfile_t *get_root_dir(){ diff --git a/src/kernel/system/ramfs.h b/src/kernel/system/ramfs.h index e012558..7d8b05d 100644 --- a/src/kernel/system/ramfs.h +++ b/src/kernel/system/ramfs.h @@ -2,7 +2,7 @@ #include void ramfs_init(); -vfile_t *ramfs_create(char *path, FS_FILE_FLAGS flags); +vfile_t *ramfs_create(vfile_t *parent, char *path, FS_FILE_FLAGS flags); //Will never create a new reference vfile_t *get_root_dir(); diff --git a/src/kernel/system/vfs.c b/src/kernel/system/vfs.c index 322a197..9ae4db5 100644 --- a/src/kernel/system/vfs.c +++ b/src/kernel/system/vfs.c @@ -25,10 +25,11 @@ vfile_t *fcreate(char *path, FS_FILE_FLAGS flags){ spinlock_acquire(vfs_lock); vfile_t *returnable = vfcreate(get_root_dir(), path, flags); spinlock_release(vfs_lock); - return 0; + return returnable; } vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){ + // printf("%s\n", relpath); if(!relpath){ return 0; } @@ -37,6 +38,7 @@ vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){ strcpy(relpath, name); if(name[0] == '/') name++;//first slash just indicates that it's an absolute path, we don't want to include that into the filename. uint32_t name_length = strlen(name); + if(name[name_length-1] == '/') name[name_length - 1] = 0; uint32_t name_index = 0; uint32_t subpath_start = 0; @@ -51,21 +53,23 @@ vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){ if(name_index >= name_length){//if there is no other directory // printf("Creating file; name: %s\n", name + subpath_start); - new_file = parent_dir->fileops->create(name, flags); + new_file = parent_dir->fileops->create(parent_dir, name, flags); } else{ vfile_t *new_parent = rfopen(name, parent_dir); if(!new_parent){ - // printf("No new parent found!\n"); + printf("No new parent found from name: %s!\n", name); kfree(name); return 0; } - // printf("Recursed\n"); + // printf("%s", new_parent->name); new_file = vfcreate(new_parent, name+name_index+1, flags); - fclose(new_parent); + // fclose(new_parent); } kfree(name); + // printf("Returning new file!\n"); return new_file; + // return 0; } int fdelete(vfile_t *file_entry){ diff --git a/src/kernel/system/vfs.h b/src/kernel/system/vfs.h index b2c7ba7..3e6d358 100644 --- a/src/kernel/system/vfs.h +++ b/src/kernel/system/vfs.h @@ -13,7 +13,7 @@ typedef enum fs_flags{ }FS_FILE_FLAGS; typedef struct fileops{ - struct virtual_file *(*create)(char *path, FS_FILE_FLAGS flags); + struct virtual_file *(*create)(struct virtual_file *parent, char *path, FS_FILE_FLAGS flags); int (*delete)(struct virtual_file *file_entry); int (*write)(struct virtual_file *file_entry, void *data, uint32_t offset, uint32_t count); int (*read)(struct virtual_file *file_entry, void *data, uint32_t offset, uint32_t count);