refining vfs

This commit is contained in:
2026-07-10 07:46:46 -05:00
parent 4d98d73f5e
commit 032a35206a
13 changed files with 304 additions and 277 deletions

View File

@@ -26,12 +26,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/vfs.c.o", "obj/kernel/kbd.c.o",
"kernel/vfs.c" "kernel/kbd.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/vfs.c", "file": "/home/slinky/source/RockOS/kernel/kbd.c",
"output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -43,12 +43,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/kmain.c.o", "obj/kernel/gdt.c.o",
"kernel/kmain.c" "kernel/gdt.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/kmain.c", "file": "/home/slinky/source/RockOS/kernel/gdt.c",
"output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -67,74 +67,6 @@
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.c.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -179,12 +111,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.c.o", "obj/kernel/drivers/ide/ide.c.o",
"kernel/gdt.c" "kernel/drivers/ide/ide.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.c", "file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -196,12 +128,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm.c.o", "obj/kernel/drivers/vga/vga.c.o",
"kernel/memory/mm.c" "kernel/drivers/vga/vga.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.c", "file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -213,12 +145,63 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/kbd.c.o", "obj/kernel/drivers/cpio/cpio.c.o",
"kernel/kbd.c" "kernel/drivers/cpio/cpio.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/kbd.c", "file": "/home/slinky/source/RockOS/kernel/drivers/cpio/cpio.c",
"output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o" "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": [ "arguments": [
@@ -254,23 +237,6 @@
"file": "/home/slinky/source/RockOS/kernel/interrupts.c", "file": "/home/slinky/source/RockOS/kernel/interrupts.c",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.c.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -298,63 +264,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/lib/stream.c.o", "obj/kernel/kmain.c.o",
"kernel/lib/stream.c" "kernel/kmain.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/stream.c", "file": "/home/slinky/source/RockOS/kernel/kmain.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o" "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/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"
}, },
{ {
"arguments": [ "arguments": [
@@ -373,6 +288,40 @@
"file": "/home/slinky/source/RockOS/kernel/lib/tasks.c", "file": "/home/slinky/source/RockOS/kernel/lib/tasks.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/tasks.c.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -400,12 +349,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/scheduler.c.o", "obj/kernel/lib/print.c.o",
"kernel/scheduler.c" "kernel/lib/print.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/scheduler.c", "file": "/home/slinky/source/RockOS/kernel/lib/print.c",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -417,12 +366,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/syscall.S.o", "obj/kernel/lib/memory.c.o",
"kernel/syscall.S" "kernel/lib/memory.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/syscall.S", "file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -434,12 +383,29 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/common.S.o", "obj/kernel/vfs.c.o",
"kernel/common.S" "kernel/vfs.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/common.S", "file": "/home/slinky/source/RockOS/kernel/vfs.c",
"output": "/home/slinky/source/RockOS/obj/kernel/common.S.o" "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": [ "arguments": [
@@ -458,23 +424,6 @@
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -502,12 +451,46 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm.S.o", "obj/kernel/drivers/pit/pit.S.o",
"kernel/memory/mm.S" "kernel/drivers/pit/pit.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o" "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": [ "arguments": [
@@ -526,6 +509,23 @@
"file": "/home/slinky/source/RockOS/kernel/boot/boot.S", "file": "/home/slinky/source/RockOS/kernel/boot/boot.S",
"output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -553,12 +553,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.S.o", "obj/kernel/memory/mm.S.o",
"kernel/gdt.S" "kernel/memory/mm.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.S", "file": "/home/slinky/source/RockOS/kernel/memory/mm.S",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -570,11 +570,11 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/interrupts.S.o", "obj/kernel/gdt.S.o",
"kernel/interrupts.S" "kernel/gdt.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/interrupts.S", "file": "/home/slinky/source/RockOS/kernel/gdt.S",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o"
} }
] ]

View File

@@ -3,6 +3,8 @@
#include <lib/stream.h> #include <lib/stream.h>
#include "vga.h"
#define VGA_WIDTH 80 #define VGA_WIDTH 80
#define VGA_HEIGHT 25 #define VGA_HEIGHT 25
#define VGA_MEMORY (0xB8000 + 0xC0000000) #define VGA_MEMORY (0xB8000 + 0xC0000000)

View File

@@ -1,7 +1,11 @@
#ifndef DVGA_H #ifndef DVGA_H
#define DVGA_H #define DVGA_H
#include <vfs.h>
void vga_init(); void vga_init();
void vga_putchar(char c); void vga_putchar(char c);
uint32_t vga_write(vfs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buf);
#endif #endif

View File

@@ -5,7 +5,7 @@
#include <lib/memory.h> #include <lib/memory.h>
uint32_t load_elf_program(const char* prgm) { uint32_t load_elf_program(const char* prgm) {
int fd = open(prgm, 0); int fd = vfs_open(prgm, 0);
if (fd == -1) { if (fd == -1) {
return -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)); elf_header_t* e_hdr = kalloc(sizeof(elf_header_t));
memset((void*)e_hdr, 0, 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) { if (bytes_rd <= 0) {
return -1; return -1;
} }
@@ -23,9 +23,9 @@ uint32_t load_elf_program(const char* prgm) {
uint32_t heap_start = 0; uint32_t heap_start = 0;
for (uint32_t i = 0; i < e_hdr->e_phnum; i++) { 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)); 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) { if (ph->p_type == PT_LOAD) {
uint32_t vstart = ph->p_vaddr; 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; uint32_t data_ptr = ph->p_offset;
fseek(fd, data_ptr); vfs_seek(fd, data_ptr);
read(fd, (void*)vstart, ph->p_filesz); vfs_read(fd, (void*)vstart, ph->p_filesz);
// 0 out bss // 0 out bss
if (ph->p_memsz > ph->p_filesz) { if (ph->p_memsz > ph->p_filesz) {

View File

@@ -119,7 +119,7 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
kprintf("failed to load initrd\n"); kprintf("failed to load initrd\n");
} }
mount(vfs_root, initrd_root); vfs_mount(vfs_root, initrd_root);
kprintf("initrd read, mounted @ /\n"); kprintf("initrd read, mounted @ /\n");
disable_interrupts(); disable_interrupts();

View File

@@ -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++) { for (size_t i = 0; i < sz; i++) {
((uint8_t*)dst)[i] = val; ((uint8_t*)dst)[i] = val;
} }

View File

@@ -5,7 +5,7 @@
#include <stddef.h> #include <stddef.h>
void memcpy(const void* src, void* dst, size_t sz); 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 strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n); int strncmp(const char *s1, const char *s2, size_t n);

View File

@@ -1,6 +1,6 @@
#ifndef KSTRING_H #ifndef KSTRING_H
#define 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 #endif

View File

@@ -2,48 +2,63 @@
#include <stddef.h> #include <stddef.h>
static int is_delim(char c, const char* delim) { char* strtok_r(char *s, const char *delim, char **saveptr) {
while (*delim) { char *token;
if (c == *delim) {
return 1; 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++; if (!is_delim) {
} break;
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;
} }
next_token++; s++;
} }
*saveptr = next_token; if (*s == '\0') {
return token_start; *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;
} }

View File

@@ -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) { 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) { static int32_t sys_close(int fd) {

View File

@@ -3,6 +3,8 @@
#include <scheduler.h> #include <scheduler.h>
#include <lib/memory.h> #include <lib/memory.h>
#include <lib/string.h>
#include <lib/print.h>
vfs_node_t* root = NULL; vfs_node_t* root = NULL;
@@ -19,19 +21,30 @@ vfs_node_t* vfs_create_root() {
return 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; if (!_fs || !_mnt || !(_mnt->flags & VFS_DIRECTORY)) return;
_mnt->mnt = _fs; _mnt->mnt = _fs;
} }
static vfs_node_t* lookup(const char* path) { vfs_node_t* vfs_find(const char* path) {
if (path[0] != '/') return NULL; if (path[0] != '/') return NULL;
vfs_node_t* current = root; vfs_node_t* current = root;
if (current->mnt) { char* sav;
current = current->mnt;
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; const char* cmp = path + 1;
if (*cmp == '\0') return current; if (*cmp == '\0') return current;
@@ -42,8 +55,12 @@ static vfs_node_t* lookup(const char* path) {
return NULL; return NULL;
} }
int open(const char* _path, int flags) { vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name) {
vfs_node_t* file = lookup(_path); 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; if (!file) return -1;
file_t* f = (file_t*)kalloc(sizeof(file_t)); file_t* f = (file_t*)kalloc(sizeof(file_t));
@@ -54,7 +71,7 @@ int open(const char* _path, int flags) {
return alloc_fd(f); 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(); process_t* curr_p = current_task();
if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) { if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) {
return -1; return -1;
@@ -70,18 +87,7 @@ int read(int fd, void* buf, size_t sz) {
return bytes_read; return bytes_read;
} }
int fstat(int fd, file_t* dst) { 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;
}
file_t* src = curr_p->fd_table[fd];
memcpy(src, dst, sizeof(file_t));
return 1;
}
int fseek(int fd, size_t offset) {
process_t* curr_p = current_task(); process_t* curr_p = current_task();
if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) { if (fd < 0 || fd >= MAX_PROCESS_FDS || !curr_p->fd_table[fd]->node) {
return 0; return 0;

View File

@@ -36,13 +36,13 @@ typedef struct {
} file_t; } file_t;
vfs_node_t* vfs_create_root(); 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); void vfs_mount(vfs_node_t* _mnt, vfs_node_t* _fs);
int open(const char* path, int flags); int vfs_open(const char* path, int flags);
int read(int fd, void* buf, size_t sz); int vfs_read(int fd, void* buf, size_t sz);
int fstat(int fd, file_t* _f); int vfs_seek(int fd, size_t offset);
int fseek(int fd, size_t offset);
int alloc_fd(file_t* f); int alloc_fd(file_t* f);

Binary file not shown.