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 e43cc2c..0ce4371 100644 Binary files a/programs/lib/rlibc.a and b/programs/lib/rlibc.a differ