From 032a35206acc5e3139313183d354c5b988d4df3e Mon Sep 17 00:00:00 2001 From: slinky55 Date: Fri, 10 Jul 2026 07:46:46 -0500 Subject: [PATCH] refining vfs --- compile_commands.json | 402 +++++++++++++++++++-------------------- kernel/drivers/vga/vga.c | 2 + kernel/drivers/vga/vga.h | 4 + kernel/elf.c | 12 +- kernel/kmain.c | 2 +- kernel/lib/memory.c | 2 +- kernel/lib/memory.h | 2 +- kernel/lib/string.h | 2 +- kernel/lib/strtok.c | 95 +++++---- kernel/syscall.c | 2 +- kernel/vfs.c | 46 +++-- kernel/vfs.h | 10 +- programs/lib/rlibc.a | Bin 4408 -> 4412 bytes 13 files changed, 304 insertions(+), 277 deletions(-) diff --git a/compile_commands.json b/compile_commands.json index cc99d35..a8d3d87 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -26,12 +26,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/vfs.c.o", - "kernel/vfs.c" + "obj/kernel/kbd.c.o", + "kernel/kbd.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/kbd.c", + "output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o" }, { "arguments": [ @@ -43,12 +43,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/kmain.c.o", - "kernel/kmain.c" + "obj/kernel/gdt.c.o", + "kernel/gdt.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/kmain.c", - "output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" + "file": "/home/slinky/source/RockOS/kernel/gdt.c", + "output": "/home/slinky/source/RockOS/obj/kernel/gdt.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/cpio/cpio.c.o", - "kernel/drivers/cpio/cpio.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/cpio/cpio.c", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/cpio/cpio.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/drivers/pty/pty.c.o", - "kernel/drivers/pty/pty.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/drivers/pty/pty.c", - "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pty/pty.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", - "-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", @@ -179,12 +111,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/gdt.c.o", - "kernel/gdt.c" + "obj/kernel/drivers/ide/ide.c.o", + "kernel/drivers/ide/ide.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/drivers/ide/ide.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o" }, { "arguments": [ @@ -196,12 +128,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/memory/mm.c.o", - "kernel/memory/mm.c" + "obj/kernel/drivers/vga/vga.c.o", + "kernel/drivers/vga/vga.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/drivers/vga/vga.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o" }, { "arguments": [ @@ -213,12 +145,63 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/kbd.c.o", - "kernel/kbd.c" + "obj/kernel/drivers/cpio/cpio.c.o", + "kernel/drivers/cpio/cpio.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/drivers/cpio/cpio.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/cpio/cpio.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/drivers/pty/pty.c.o", + "kernel/drivers/pty/pty.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/drivers/pty/pty.c", + "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pty/pty.c.o" + }, + { + "arguments": [ + "/home/slinky/opt/cross/bin/i686-elf-gcc", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/scheduler.c.o", + "kernel/scheduler.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/scheduler.c", + "output": "/home/slinky/source/RockOS/obj/kernel/scheduler.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": [ @@ -254,23 +237,6 @@ "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", @@ -298,63 +264,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/lib/stream.c.o", - "kernel/lib/stream.c" + "obj/kernel/kmain.c.o", + "kernel/kmain.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/lib/stream.c", - "output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/lib/memory.c.o", - "kernel/lib/memory.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" - }, - { - "arguments": [ - "/home/slinky/opt/cross/bin/i686-elf-gcc", - "-c", - "-ffreestanding", - "-O2", - "-Wall", - "-Wextra", - "-Ikernel", - "-o", - "obj/kernel/lib/print.c.o", - "kernel/lib/print.c" - ], - "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/lib/print.c", - "output": "/home/slinky/source/RockOS/obj/kernel/lib/print.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" + "file": "/home/slinky/source/RockOS/kernel/kmain.c", + "output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" }, { "arguments": [ @@ -373,6 +288,40 @@ "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", + "-c", + "-ffreestanding", + "-O2", + "-Wall", + "-Wextra", + "-Ikernel", + "-o", + "obj/kernel/lib/stream.c.o", + "kernel/lib/stream.c" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/lib/stream.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o" + }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -400,12 +349,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/scheduler.c.o", - "kernel/scheduler.c" + "obj/kernel/lib/print.c.o", + "kernel/lib/print.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/lib/print.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o" }, { "arguments": [ @@ -417,12 +366,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/syscall.S.o", - "kernel/syscall.S" + "obj/kernel/lib/memory.c.o", + "kernel/lib/memory.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/syscall.S", - "output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o" + "file": "/home/slinky/source/RockOS/kernel/lib/memory.c", + "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o" }, { "arguments": [ @@ -434,12 +383,29 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/common.S.o", - "kernel/common.S" + "obj/kernel/vfs.c.o", + "kernel/vfs.c" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/common.S", - "output": "/home/slinky/source/RockOS/obj/kernel/common.S.o" + "file": "/home/slinky/source/RockOS/kernel/vfs.c", + "output": "/home/slinky/source/RockOS/obj/kernel/vfs.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": [ @@ -458,23 +424,6 @@ "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", @@ -502,12 +451,46 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/memory/mm.S.o", - "kernel/memory/mm.S" + "obj/kernel/drivers/pit/pit.S.o", + "kernel/drivers/pit/pit.S" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/memory/mm.S", - "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o" + "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/syscall.S.o", + "kernel/syscall.S" + ], + "directory": "/home/slinky/source/RockOS", + "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": [ @@ -526,6 +509,23 @@ "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/common.S.o", + "kernel/common.S" + ], + "directory": "/home/slinky/source/RockOS", + "file": "/home/slinky/source/RockOS/kernel/common.S", + "output": "/home/slinky/source/RockOS/obj/kernel/common.S.o" + }, { "arguments": [ "/home/slinky/opt/cross/bin/i686-elf-gcc", @@ -553,12 +553,12 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/gdt.S.o", - "kernel/gdt.S" + "obj/kernel/memory/mm.S.o", + "kernel/memory/mm.S" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/gdt.S", - "output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" + "file": "/home/slinky/source/RockOS/kernel/memory/mm.S", + "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o" }, { "arguments": [ @@ -570,11 +570,11 @@ "-Wextra", "-Ikernel", "-o", - "obj/kernel/interrupts.S.o", - "kernel/interrupts.S" + "obj/kernel/gdt.S.o", + "kernel/gdt.S" ], "directory": "/home/slinky/source/RockOS", - "file": "/home/slinky/source/RockOS/kernel/interrupts.S", - "output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o" + "file": "/home/slinky/source/RockOS/kernel/gdt.S", + "output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" } ] diff --git a/kernel/drivers/vga/vga.c b/kernel/drivers/vga/vga.c index c3cb02d..8c90b01 100644 --- a/kernel/drivers/vga/vga.c +++ b/kernel/drivers/vga/vga.c @@ -3,6 +3,8 @@ #include +#include "vga.h" + #define VGA_WIDTH 80 #define VGA_HEIGHT 25 #define VGA_MEMORY (0xB8000 + 0xC0000000) diff --git a/kernel/drivers/vga/vga.h b/kernel/drivers/vga/vga.h index ca57185..240c836 100644 --- a/kernel/drivers/vga/vga.h +++ b/kernel/drivers/vga/vga.h @@ -1,7 +1,11 @@ #ifndef DVGA_H #define DVGA_H +#include + void vga_init(); void vga_putchar(char c); +uint32_t vga_write(vfs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buf); + #endif \ No newline at end of file diff --git a/kernel/elf.c b/kernel/elf.c index a0496e2..1048b2b 100644 --- a/kernel/elf.c +++ b/kernel/elf.c @@ -5,7 +5,7 @@ #include uint32_t load_elf_program(const char* prgm) { - int fd = open(prgm, 0); + int fd = vfs_open(prgm, 0); if (fd == -1) { return -1; } @@ -13,7 +13,7 @@ uint32_t load_elf_program(const char* prgm) { elf_header_t* e_hdr = kalloc(sizeof(elf_header_t)); memset((void*)e_hdr, 0, sizeof(elf_header_t)); - uint32_t bytes_rd = read(fd, e_hdr, sizeof(elf_header_t)); + uint32_t bytes_rd = vfs_read(fd, e_hdr, sizeof(elf_header_t)); if (bytes_rd <= 0) { return -1; } @@ -23,9 +23,9 @@ uint32_t load_elf_program(const char* prgm) { uint32_t heap_start = 0; for (uint32_t i = 0; i < e_hdr->e_phnum; i++) { - fseek(fd, ph_table_ptr); + vfs_seek(fd, ph_table_ptr); memset((void*)ph, 0, sizeof(elf_program_header_t)); - read(fd, ph, sizeof(elf_program_header_t)); + vfs_read(fd, ph, sizeof(elf_program_header_t)); if (ph->p_type == PT_LOAD) { uint32_t vstart = ph->p_vaddr; @@ -44,8 +44,8 @@ uint32_t load_elf_program(const char* prgm) { } uint32_t data_ptr = ph->p_offset; - fseek(fd, data_ptr); - read(fd, (void*)vstart, ph->p_filesz); + vfs_seek(fd, data_ptr); + vfs_read(fd, (void*)vstart, ph->p_filesz); // 0 out bss if (ph->p_memsz > ph->p_filesz) { diff --git a/kernel/kmain.c b/kernel/kmain.c index f904f9e..8dca6c2 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -119,7 +119,7 @@ void kmain(uint32_t magic, multiboot_info* mbi) { kprintf("failed to load initrd\n"); } - mount(vfs_root, initrd_root); + vfs_mount(vfs_root, initrd_root); kprintf("initrd read, mounted @ /\n"); disable_interrupts(); diff --git a/kernel/lib/memory.c b/kernel/lib/memory.c index 698e0eb..8a19e4c 100644 --- a/kernel/lib/memory.c +++ b/kernel/lib/memory.c @@ -15,7 +15,7 @@ void memcpy(const void* src, void* dst, size_t sz) { } } -void memset(const uint8_t* dst, uint8_t val, size_t sz) { +void memset(uint8_t* dst, uint8_t val, size_t sz) { for (size_t i = 0; i < sz; i++) { ((uint8_t*)dst)[i] = val; } diff --git a/kernel/lib/memory.h b/kernel/lib/memory.h index 3e98ae8..14bc51b 100644 --- a/kernel/lib/memory.h +++ b/kernel/lib/memory.h @@ -5,7 +5,7 @@ #include void memcpy(const void* src, void* dst, size_t sz); -void memset(const uint8_t* dst, uint8_t val, size_t sz); +void memset(uint8_t* dst, uint8_t val, size_t sz); int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); diff --git a/kernel/lib/string.h b/kernel/lib/string.h index 70dcf7d..b9ac67c 100644 --- a/kernel/lib/string.h +++ b/kernel/lib/string.h @@ -1,6 +1,6 @@ #ifndef KSTRING_H #define KSTRING_H -char* strtok_r(char* str, const char* delim, char** saveptr); +char* strtok_r(char *s, const char *delim, char **saveptr); #endif \ No newline at end of file diff --git a/kernel/lib/strtok.c b/kernel/lib/strtok.c index 31aa210..0ae1a07 100644 --- a/kernel/lib/strtok.c +++ b/kernel/lib/strtok.c @@ -2,48 +2,63 @@ #include -static int is_delim(char c, const char* delim) { - while (*delim) { - if (c == *delim) { - return 1; +char* strtok_r(char *s, const char *delim, char **saveptr) { + char *token; + + if (!saveptr) { + return NULL; + } + + if (!s) { + s = *saveptr; + } + + if (!s || *s == '\0') { + *saveptr = s; + return NULL; + } + + while (*s != '\0') { + const char *d = delim; + int is_delim = 0; + while (*d != '\0') { + if (*s == *d) { + is_delim = 1; + break; + } + d++; } - delim++; - } - return 0; -} - -char* strtok_r(char* str, const char* delim, char** saveptr) { - if (saveptr == NULL) { - return NULL; - } - - char* next_token = (str != NULL) ? str : *saveptr; - - if (next_token == NULL || *next_token == '\0') { - *saveptr = NULL; - return NULL; - } - - while (*next_token && is_delim(*next_token, delim)) { - next_token++; - } - - if (*next_token == '\0') { - *saveptr = next_token; - return NULL; - } - - char* token_start = next_token; - - while (*next_token) { - if (is_delim(*next_token, delim)) { - *next_token = '\0'; // Destructively null-terminate the token - *saveptr = next_token + 1; // Save the position right after the null-terminator - return token_start; + if (!is_delim) { + break; } - next_token++; + s++; } - *saveptr = next_token; - return token_start; + 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 dffa0e9..613c6a4 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -56,7 +56,7 @@ static int32_t sys_read(int fd, void* buf, size_t count) { } static int32_t sys_open(const char* filename, int flags) { - return open(filename, flags); + return vfs_open(filename, flags); } static int32_t sys_close(int fd) { diff --git a/kernel/vfs.c b/kernel/vfs.c index 9884707..883fff2 100644 --- a/kernel/vfs.c +++ b/kernel/vfs.c @@ -3,6 +3,8 @@ #include #include +#include +#include vfs_node_t* root = NULL; @@ -19,18 +21,29 @@ vfs_node_t* vfs_create_root() { return root; } -void mount(vfs_node_t* _mnt, vfs_node_t* _fs) { +void vfs_mount(vfs_node_t* _mnt, vfs_node_t* _fs) { if (!_fs || !_mnt || !(_mnt->flags & VFS_DIRECTORY)) return; _mnt->mnt = _fs; } -static vfs_node_t* lookup(const char* path) { +vfs_node_t* vfs_find(const char* path) { if (path[0] != '/') return NULL; vfs_node_t* current = root; - if (current->mnt) { - current = current->mnt; + char* sav; + + size_t path_sz = strlen(path) + 1; + char* path_cpy = kalloc(path_sz); + memset((uint8_t*)path_cpy, 0, path_sz); + memcpy(path, path_cpy, path_sz); + + char* tkn = strtok_r(path_cpy, "/", &sav); + + while (tkn != NULL) { + kprintf("Found tkn: %s\n"); } + + kfree(path_cpy); const char* cmp = path + 1; if (*cmp == '\0') return current; @@ -42,8 +55,12 @@ static vfs_node_t* lookup(const char* path) { return NULL; } -int open(const char* _path, int flags) { - vfs_node_t* file = lookup(_path); +vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name) { + vfs_node_t* node = kalloc(sizeof(vfs_node_t)); +} + +int vfs_open(const char* _path, int flags) { + vfs_node_t* file = vfs_find(_path); if (!file) return -1; file_t* f = (file_t*)kalloc(sizeof(file_t)); @@ -54,7 +71,7 @@ int open(const char* _path, int flags) { return alloc_fd(f); } -int read(int fd, void* buf, size_t sz) { +int vfs_read(int fd, void* buf, size_t sz) { process_t* curr_p = current_task(); if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) { return -1; @@ -70,18 +87,7 @@ int read(int fd, void* buf, size_t sz) { return bytes_read; } -int fstat(int fd, file_t* dst) { - process_t* curr_p = current_task(); - if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) { - return 0; - } - - file_t* src = curr_p->fd_table[fd]; - memcpy(src, dst, sizeof(file_t)); - return 1; -} - -int fseek(int fd, size_t offset) { +int vfs_seek(int fd, size_t offset) { process_t* curr_p = current_task(); if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) { return 0; @@ -90,7 +96,7 @@ int fseek(int fd, size_t offset) { file_t* file = curr_p->fd_table[fd]; file->offset = offset; return 1; -} +} int alloc_fd(file_t* f) { process_t* curr_p = current_task(); diff --git a/kernel/vfs.h b/kernel/vfs.h index f9f91fc..95d318b 100644 --- a/kernel/vfs.h +++ b/kernel/vfs.h @@ -36,13 +36,13 @@ typedef struct { } file_t; vfs_node_t* vfs_create_root(); +vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name); -void mount(vfs_node_t* _mnt, vfs_node_t* _fs); -int open(const char* path, int flags); -int read(int fd, void* buf, size_t sz); +void vfs_mount(vfs_node_t* _mnt, vfs_node_t* _fs); +int vfs_open(const char* path, int flags); +int vfs_read(int fd, void* buf, size_t sz); -int fstat(int fd, file_t* _f); -int fseek(int fd, size_t offset); +int vfs_seek(int fd, size_t offset); int alloc_fd(file_t* f); diff --git a/programs/lib/rlibc.a b/programs/lib/rlibc.a index e43cc2cc55d3a4fe9c47b93d5ba7743544dc2190..0ce43718569d1e586b56b422feeaef1b1f4152bd 100644 GIT binary patch delta 1417 zcmah|YiL__6#t(z?}zu+*tO!UX{&iKn&q-KTiPfaan8<0_At#{%{D)@;BZ(l`Qj`_ zZU(tzmt~$0B1}-!Pd?~aDeIV$+EG&6qsxYriL-uiEVf`j%ofL7JU6{*uQ2By{{M4- z=Y7sS=WOfw*8F;7aMPAhAat^Io9_@~hX1*iUdAlFCy&4T)QXwQB?JNi%^M7MC}=aD zu=rpRcY_m$V4Za^@0Um2j1K1i4M!lTl`cZ-etAq$tQo|l-}-VXJ{Pm^%_YpTz4_Qu z(j#4#W_>rsTae`C2xOh1V$!Jw$ns)Am)%tf6;pSl+5Q8G$u)oYrf!p?dET$#e6DME ztCkdrLfCUrGdJeUl#&~Tf?rO$YnkA(t_wQR?{MS3x)tJ&#nJ}j7&UBgJ*=srjt&>*EnXO^ zc6HA1j8&5xXYA9$w~XsNYf=_F+dv6XdBRVZ(z(RFX>CuwGCr;~y<&8)RC#8-X$u&X zg3S23z74|FBEr=o!b%Z_T~z1@f}srB>!gvI&r=?GP)81pha zvoZPw@jhW`uQVwxc%|r!6uUUzKJQzdp4w3S7nLT3k~Aw$!E$OwekUOBjEi?I+zVIa zS30j{t=);4w|~wJUz8Kqq`#i7{#$NLC;krN1Z1~WLN`*2Q~J$Jyx{FWaFFIE>BhMA z4QDMFHx>c;C}aw$FYpIz^Y(5ke`nzbAeeZr`g^D&hrx{sRo!d@z8AY~G&ms^txGBos7;<)fsZi;hY~ zaYCQtrReCf5|{am)Y4rP>GZ1pL^`Zvc-8h8{DQY^F8B^j_LinowrSdmqDomH-#9LcpdEkz))GsZnT~ZuMcgqKr zD2g3^Xcq>RooJ#vM-1(K5Kk*#{eFP$C&XhrB9ShacgM>ypG#2I@i{n-M;sdrd6MnK zj~!3I9F99)>bXuBXvP+Z>P(Cckg-BfsI-BWPr*Tz?j{O)#`dZBBNhK~Ci+MOs+(=9 zBVX#-il1_gkj8P&1Ks$m`Zl7A=LrkE2cE}Q>7Bv%d5`W?9bPuOVFa)8v^NxGV|DG* I*izs44{3d%!TG%x8qelhODO#Gx-VzQ;;GPcK`U`aNqbGl|Tesa3XVwfUi8(PnM6zGR#zU1C> z&%NjT&i(z~x#w%gYg3P#n|+PXw6vV4ZTGxF2>(CBHb97N04|tzo%pKTy_V{B%U-Xy zWcD>R>E5$Gh}-Jv5_Hpw5Gnb>>}GFIG9n~n*0CGWnq<(y{-o0l>RC|_8cw;=Rz;)A z6isv%{JGd7TkIc}9}NSM?B^=G16hEoYa(YVBm1%D>C#B!z8)HDonjeO;Th^tfF9_xA`xXe{q zBw1@vqaysp?WK*-V0vR~J67LDC}}|ZCMD!~IBoiZZ$s}a9I)1*8t<1$##{wjnSiVB z(6_=}oD)#POLPL~Dj4FoKU7|Sv(IhF`<^bZ9r4#cnCHdvH7Sj|75Ls#_lUVt+B_xU z@kcO`-RzNXT#hFrt8*JVBj1ze$4XN#nni=9c*bFAp|lNxR*7~Pg!FlhP=`*4A3*9~ z!arqo)B#SLM1uyYkZt=D5A7L$GmP3iqZ+?PrpYk%#6e048o#%XUF+>pZtrGY*)c5| zVc`s$mX{YSI%R^(D=f!imy}t$63eQ`y=rHla?j@4H=i8ICPK~M`|lsSo*c;}!T3kCT~d?Z7n+hk3Bn_y?hTP=i5#r~#0 zD!0oH^}SAStriLeWky)|aHG4PvU_L*4%_Q@gf zO(O6t0(T$U1kPWB>vlIy!+m>A!$%0Hs}$RJ&Wo9N)nSw`pTTWIh4GEuU?%?@bULcV zx%?pBFomJ)Uj7|D-*{%~t4s27KU*|}!DsM^LmnPN8L$1Uq`O@x=6kJ97tmU9;$$MaVB)LBh6m~b9EFoQnDCi)32XCb5u0dzZB zv^=-wi$&XxmX;CHQS@2SpFh*RB|trG2=g0mt$#vsQH|Dyqpj#4g$b9$NhbKiTnVc# zflA;MBwjLM7))9#AS4LX3lTx0=V45cxP%EVSViYa3^;`tddHaIj