diff --git a/compile_commands.json b/compile_commands.json index a8d3d87..cc99d35 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -26,12 +26,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/kbd.c.o", - "kernel/kbd.c" + "obj/kernel/vfs.c.o", + "kernel/vfs.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/kbd.c", - "output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o" + "file": "/home/slinky/source/RockOS/kernel/vfs.c", + "output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o" }, { "arguments": [ @@ -43,12 +43,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/gdt.c.o", - "kernel/gdt.c" + "obj/kernel/kmain.c.o", + "kernel/kmain.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/gdt.c", - "output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o" + "file": "/home/slinky/source/RockOS/kernel/kmain.c", + "output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" }, { "arguments": [ @@ -67,74 +67,6 @@ "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c", "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.c.o" }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/ps2/ps2.c.o", - "kernel/drivers/ps2/ps2.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/ps2/ps2.c", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ps2/ps2.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/iso/iso.c.o", - "kernel/drivers/iso/iso.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/iso/iso.c", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/iso/iso.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/ide/ide.c.o", - "kernel/drivers/ide/ide.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/vga/vga.c.o", - "kernel/drivers/vga/vga.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o" - }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -179,12 +111,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/scheduler.c.o", - "kernel/scheduler.c" + "obj/kernel/drivers/vga/vga.c.o", + "kernel/drivers/vga/vga.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/scheduler.c", - "output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o" + "file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o" }, { "arguments": [ @@ -196,12 +128,97 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/elf.c.o", - "kernel/elf.c" + "obj/kernel/drivers/ide/ide.c.o", + "kernel/drivers/ide/ide.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/elf.c", - "output": "/home/slinky/source/RockOS/obj/kernel/elf.c.o" + "file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/drivers/ps2/ps2.c.o", + "kernel/drivers/ps2/ps2.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/drivers/ps2/ps2.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ps2/ps2.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/drivers/iso/iso.c.o", + "kernel/drivers/iso/iso.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/drivers/iso/iso.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/iso/iso.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/gdt.c.o", + "kernel/gdt.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/gdt.c", + "output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/memory/mm.c.o", + "kernel/memory/mm.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/memory/mm.c", + "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/kbd.c.o", + "kernel/kbd.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/kbd.c", + "output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o" }, { "arguments": [ @@ -237,6 +254,23 @@ "file": "/home/slinky/source/RockOS/kernel/interrupts.c", "output": "/home/slinky/source/RockOS/obj/kernel/interrupts.c.o" }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/elf.c.o", + "kernel/elf.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/elf.c", + "output": "/home/slinky/source/RockOS/obj/kernel/elf.c.o" + }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -254,57 +288,6 @@ "file": "/home/slinky/source/RockOS/kernel/syscall.c", "output": "/home/slinky/source/RockOS/obj/kernel/syscall.c.o" }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/kmain.c.o", - "kernel/kmain.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/kmain.c", - "output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/lib/tasks.c.o", - "kernel/lib/tasks.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/lib/tasks.c", - "output": "/home/slinky/source/RockOS/obj/kernel/lib/tasks.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/lib/ringbuf.c.o", - "kernel/lib/ringbuf.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/lib/ringbuf.c", - "output": "/home/slinky/source/RockOS/obj/kernel/lib/ringbuf.c.o" - }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -332,12 +315,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/lib/strtok.c.o", - "kernel/lib/strtok.c" + "obj/kernel/lib/memory.c.o", + "kernel/lib/memory.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/lib/strtok.c", - "output": "/home/slinky/source/RockOS/obj/kernel/lib/strtok.c.o" + "file": "/home/slinky/source/RockOS/kernel/lib/memory.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o" }, { "arguments": [ @@ -366,12 +349,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/lib/memory.c.o", - "kernel/lib/memory.c" + "obj/kernel/lib/ringbuf.c.o", + "kernel/lib/ringbuf.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/lib/memory.c", - "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o" + "file": "/home/slinky/source/RockOS/kernel/lib/ringbuf.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/ringbuf.c.o" }, { "arguments": [ @@ -383,12 +366,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/vfs.c.o", - "kernel/vfs.c" + "obj/kernel/lib/tasks.c.o", + "kernel/lib/tasks.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/vfs.c", - "output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o" + "file": "/home/slinky/source/RockOS/kernel/lib/tasks.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/tasks.c.o" }, { "arguments": [ @@ -400,12 +383,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/memory/mm.c.o", - "kernel/memory/mm.c" + "obj/kernel/lib/strtok.c.o", + "kernel/lib/strtok.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/memory/mm.c", - "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o" + "file": "/home/slinky/source/RockOS/kernel/lib/strtok.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/strtok.c.o" }, { "arguments": [ @@ -417,46 +400,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/drivers/pic/pic.S.o", - "kernel/drivers/pic/pic.S" + "obj/kernel/scheduler.c.o", + "kernel/scheduler.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/ps2/ps2.S.o", - "kernel/drivers/ps2/ps2.S" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/ps2/ps2.S", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ps2/ps2.S.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/pit/pit.S.o", - "kernel/drivers/pit/pit.S" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pit/pit.S.o" + "file": "/home/slinky/source/RockOS/kernel/scheduler.c", + "output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o" }, { "arguments": [ @@ -475,40 +424,6 @@ "file": "/home/slinky/source/RockOS/kernel/syscall.S", "output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o" }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/interrupts.S.o", - "kernel/interrupts.S" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/interrupts.S", - "output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/boot/boot.S.o", - "kernel/boot/boot.S" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/boot/boot.S", - "output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o" - }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -536,12 +451,46 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/scheduler.S.o", - "kernel/scheduler.S" + "obj/kernel/drivers/pic/pic.S.o", + "kernel/drivers/pic/pic.S" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/scheduler.S", - "output": "/home/slinky/source/RockOS/obj/kernel/scheduler.S.o" + "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/drivers/pit/pit.S.o", + "kernel/drivers/pit/pit.S" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pit/pit.S.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/drivers/ps2/ps2.S.o", + "kernel/drivers/ps2/ps2.S" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/drivers/ps2/ps2.S", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ps2/ps2.S.o" }, { "arguments": [ @@ -560,6 +509,40 @@ "file": "/home/slinky/source/RockOS/kernel/memory/mm.S", "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o" }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/boot/boot.S.o", + "kernel/boot/boot.S" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/boot/boot.S", + "output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/scheduler.S.o", + "kernel/scheduler.S" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/scheduler.S", + "output": "/home/slinky/source/RockOS/obj/kernel/scheduler.S.o" + }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -576,5 +559,22 @@ "directory": "/home/slinky/source/RockOS", "file": "/home/slinky/source/RockOS/kernel/gdt.S", "output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/interrupts.S.o", + "kernel/interrupts.S" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/interrupts.S", + "output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o" } ] diff --git a/kernel/drivers/cpio/cpio.c b/kernel/drivers/cpio/cpio.c index f5a15ba..0e21fe3 100644 --- a/kernel/drivers/cpio/cpio.c +++ b/kernel/drivers/cpio/cpio.c @@ -1,10 +1,9 @@ #include #include +#include #define MAX_INITRD_FILES 64 -static vfs_node_t cpio_nodes[MAX_INITRD_FILES]; -static uint32_t cpio_node_count = 0; static uint32_t parse_hex_ascii(const char *str, int len) { uint32_t result = 0; @@ -20,13 +19,15 @@ static uint32_t parse_hex_ascii(const char *str, int len) { static vfs_node_t* cpio_find(vfs_node_t* _dir, const char* name) { if (!(_dir->flags & VFS_DIRECTORY)) return NULL; - for (uint32_t i = 0; i < cpio_node_count; i++) { - if (strcmp(cpio_nodes[i].name, name) == 0) { - return &cpio_nodes[i]; + vfs_node_t* child = _dir->first_child; + while (child != NULL) { + if (strcmp(child->name, name) == 0) { + return child; } + child = child->next_sibling; } - return NULL; // File not found + return NULL; } static uint32_t cpio_read(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer) { @@ -38,18 +39,47 @@ static uint32_t cpio_read(struct vfs_node* node, uint32_t offset, uint32_t size, return size; } +static vfs_node_t* cpio_get_or_create(vfs_node_t* root_node, const char* path) { + vfs_node_t* current = root_node; + + char path_cpy[256]; + strcpy(path_cpy, path); + + char* sav = NULL; + char* tkn = strtok_r(path_cpy, "/", &sav); + + while (tkn != NULL) { + char* next_tkn = strtok_r(NULL, "/", &sav); + + vfs_node_t* next_node = cpio_find(current, tkn); + if (!next_node) { + next_node = kalloc(sizeof(vfs_node_t)); + memset((void*)next_node, 0, sizeof(vfs_node_t)); + + strcpy(next_node->name, tkn); + next_node->flags = VFS_DIRECTORY; + next_node->find = cpio_find; + + next_node->next_sibling = current->first_child; + current->first_child = next_node; + } + + current = next_node; + tkn = next_tkn; + } + + return current; +} + vfs_node_t* cpio_read_fs(uint32_t _vaddr) { cpio_header_t* header = (cpio_header_t*)_vaddr; vfs_node_t* cpio_root = kalloc(sizeof(vfs_node_t)); memset((uint8_t*)cpio_root, 0, sizeof(vfs_node_t)); - strcpy(cpio_root->name, "cpio_root"); + cpio_root->flags = VFS_DIRECTORY; + cpio_root->find = cpio_find; - cpio_root->flags |= VFS_DIRECTORY; - cpio_root->finddir = cpio_find; - - uint32_t cnt = 0; while (1) { if (strncmp(header->c_magic, "070701", 6) != 0 && strncmp(header->c_magic, "070702", 6) != 0) { @@ -59,34 +89,50 @@ vfs_node_t* cpio_read_fs(uint32_t _vaddr) { uint32_t namesize = parse_hex_ascii(header->c_namesize, 8); uint32_t filesize = parse_hex_ascii(header->c_filesize, 8); uint32_t mode = parse_hex_ascii(header->c_mode, 8); - - char* filename = (char*)header + sizeof(cpio_header_t); + char* filename = (char*)header + sizeof(cpio_header_t); if (strcmp(filename, "TRAILER!!!") == 0) { break; } - uint32_t file_data_offset = sizeof(cpio_header_t) + namesize; - file_data_offset = (file_data_offset + 3) & ~3; // align to 4 bytes - + uint32_t file_data_offset = (sizeof(cpio_header_t) + namesize + 3) & ~3; uint8_t* file_data = (uint8_t*)header + file_data_offset; - if (strcmp(".", filename) != 0 && cnt < MAX_INITRD_FILES) { - vfs_node_t* current = &cpio_nodes[cpio_node_count++]; - memset((uint8_t*)current, 0, sizeof(vfs_node_t)); + if (strcmp(".", filename) != 0) { + vfs_node_t* parent = cpio_get_or_create(cpio_root, filename); - strcpy(current->name, filename); - current->size = filesize; + char* base_name = filename; + for (int i = strlen(filename) - 1; i >= 0; i--) { + if (filename[i] == '/') { + base_name = &filename[i + 1]; + break; + } + } - current->flags = VFS_FILE; - current->read = cpio_read; - current->data = file_data; + vfs_node_t* current = cpio_find(parent, base_name); + if (!current) { + current = kalloc(sizeof(vfs_node_t)); + memset((void*)current, 0, sizeof(vfs_node_t)); + strcpy(current->name, base_name); + + current->next_sibling = parent->first_child; + parent->first_child = current; + } + + if ((mode & 0xF000) == 0x4000) { + current->flags = VFS_DIRECTORY; + current->find = cpio_find; + } else { + current->flags = VFS_FILE; + current->size = filesize; + current->data = file_data; + current->read = cpio_read; + } } - uint32_t next_header_offset = file_data_offset + filesize; - next_header_offset = (next_header_offset + 3) & ~3; + uint32_t next_header_offset = (file_data_offset + filesize + 3) & ~3; header = (cpio_header_t*)((uint8_t*)header + next_header_offset); } - + return cpio_root; } \ No newline at end of file diff --git a/kernel/lib/strtok.c b/kernel/lib/strtok.c index 0ae1a07..5269f8f 100644 --- a/kernel/lib/strtok.c +++ b/kernel/lib/strtok.c @@ -2,63 +2,64 @@ #include -char* strtok_r(char *s, const char *delim, char **saveptr) { +static size_t kernel_strspn(const char *s, const char *accept) { + const char *p; + const char *a; + size_t count = 0; + + for (p = s; *p != '\0'; ++p) { + for (a = accept; *a != '\0'; ++a) { + if (*p == *a) + break; + } + if (*a == '\0') + return count; + ++count; + } + return count; +} + +static char *kernel_strpbrk(const char *s, const char *accept) { + while (*s != '\0') { + const char *a = accept; + while (*a != '\0') { + if (*s == *a) { + return (char *)s; + } + a++; + } + s++; + } + return NULL; +} + +char *strtok_r(char *str, const char *delim, char **saveptr) { char *token; - if (!saveptr) { + if (str == NULL) { + str = *saveptr; + } + + if (str == NULL || *str == '\0') { + *saveptr = NULL; return NULL; } - if (!s) { - s = *saveptr; - } - - if (!s || *s == '\0') { - *saveptr = s; + str += kernel_strspn(str, delim); + if (*str == '\0') { + *saveptr = NULL; return NULL; } - while (*s != '\0') { - const char *d = delim; - int is_delim = 0; - while (*d != '\0') { - if (*s == *d) { - is_delim = 1; - break; - } - d++; - } - if (!is_delim) { - break; - } - s++; + token = str; + str = kernel_strpbrk(token, delim); + + if (str == NULL) { + *saveptr = NULL; + } else { + *str = '\0'; + *saveptr = str + 1; } - if (*s == '\0') { - *saveptr = s; - return NULL; - } - - token = s; - - while (*s != '\0') { - const char *d = delim; - int is_delim = 0; - while (*d != '\0') { - if (*s == *d) { - is_delim = 1; - break; - } - d++; - } - if (is_delim) { - *s = '\0'; - *saveptr = s + 1; - return token; - } - s++; - } - - *saveptr = s; return token; } \ No newline at end of file diff --git a/kernel/syscall.c b/kernel/syscall.c index 613c6a4..d10acfe 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -102,7 +102,7 @@ static int32_t sys_pty(int* slave_fd) { master->size = 0; master->read = pty_master_read; master->write = pty_master_write; - master->finddir = NULL; + master->find = NULL; master->data = pty; vfs_node_t* slave =(vfs_node_t*)kalloc(sizeof(vfs_node_t)); @@ -110,7 +110,7 @@ static int32_t sys_pty(int* slave_fd) { slave->size = 0; slave->read = pty_slave_read; slave->write = pty_slave_write; - slave->finddir = NULL; + slave->find = NULL; slave->data = pty; file_t* fmaster = (file_t*)kalloc(sizeof(file_t)); diff --git a/kernel/vfs.c b/kernel/vfs.c index 883fff2..634dc0e 100644 --- a/kernel/vfs.c +++ b/kernel/vfs.c @@ -16,7 +16,7 @@ vfs_node_t* vfs_create_root() { root->flags |= VFS_DIRECTORY; root->size = 0; - root->finddir = NULL; + root->find = NULL; return root; } @@ -27,10 +27,9 @@ void vfs_mount(vfs_node_t* _mnt, vfs_node_t* _fs) { } vfs_node_t* vfs_find(const char* path) { - if (path[0] != '/') return NULL; vfs_node_t* current = root; - char* sav; + char* sav = NULL; size_t path_sz = strlen(path) + 1; char* path_cpy = kalloc(path_sz); @@ -38,25 +37,36 @@ vfs_node_t* vfs_find(const char* path) { memcpy(path, path_cpy, path_sz); char* tkn = strtok_r(path_cpy, "/", &sav); - while (tkn != NULL) { - kprintf("Found tkn: %s\n"); + if (!current || !current->find) { + current = NULL; + break; + } + + current = current->find(current, tkn); + + if (current == NULL) { + break; + } + + tkn = strtok_r(NULL, "/", &sav); } kfree(path_cpy); - const char* cmp = path + 1; - if (*cmp == '\0') return current; - - if (current->finddir) { - return current->finddir(current, cmp); - } - return NULL; } vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name) { - vfs_node_t* node = kalloc(sizeof(vfs_node_t)); + if (!parent || !name) { + return NULL; + } + + if (strlen(name) == 0) { + return NULL; + } + + return parent->mkdir(parent, name); } int vfs_open(const char* _path, int flags) { diff --git a/kernel/vfs.h b/kernel/vfs.h index 95d318b..3eb9dc9 100644 --- a/kernel/vfs.h +++ b/kernel/vfs.h @@ -15,15 +15,20 @@ struct vfs_node; typedef uint32_t (*read_type_t)(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer); typedef uint32_t (*write_type_t)(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer); typedef struct vfs_node* (*finddir_type_t)(struct vfs_node* node, const char* name); +typedef struct vfs_node* (*mkdir_type_t)(struct vfs_node* node, const char* name); typedef struct vfs_node { char name[128]; uint32_t flags; // File, directory, device, etc. uint32_t size; // Size of file in bytes + + struct vfs_node* first_child; + struct vfs_node* next_sibling; read_type_t read; write_type_t write; - finddir_type_t finddir; + finddir_type_t find; + mkdir_type_t mkdir; struct vfs_node* mnt; void* data; diff --git a/make_img.sh b/make_img.sh index f72fd01..d2b854a 100755 --- a/make_img.sh +++ b/make_img.sh @@ -6,6 +6,7 @@ rm -f initrd/*.elf cp programs/bin/* initrd cd initrd +mkdir -p dev mkdir -p output find . -depth -print | cpio -o -H newc > output/initrd.img cd .. diff --git a/programs/lib/rlibc.a b/programs/lib/rlibc.a index 0ce4371..a9203f7 100644 Binary files a/programs/lib/rlibc.a and b/programs/lib/rlibc.a differ