still working on a more robust vfs

This commit is contained in:
2026-07-11 10:33:08 -05:00
parent 032a35206a
commit 92748fd258
8 changed files with 381 additions and 318 deletions

View File

@@ -26,12 +26,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/kbd.c.o", "obj/kernel/vfs.c.o",
"kernel/kbd.c" "kernel/vfs.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/vfs.c",
"output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -43,12 +43,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.c.o", "obj/kernel/kmain.c.o",
"kernel/gdt.c" "kernel/kmain.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/kmain.c",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/kmain.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/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": [ "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/scheduler.c.o", "obj/kernel/drivers/vga/vga.c.o",
"kernel/scheduler.c" "kernel/drivers/vga/vga.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/drivers/vga/vga.c",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -196,12 +128,97 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/elf.c.o", "obj/kernel/drivers/ide/ide.c.o",
"kernel/elf.c" "kernel/drivers/ide/ide.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/elf.c", "file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
"output": "/home/slinky/source/RockOS/obj/kernel/elf.c.o" "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": [ "arguments": [
@@ -237,6 +254,23 @@
"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",
@@ -254,57 +288,6 @@
"file": "/home/slinky/source/RockOS/kernel/syscall.c", "file": "/home/slinky/source/RockOS/kernel/syscall.c",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.c.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -332,12 +315,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/lib/strtok.c.o", "obj/kernel/lib/memory.c.o",
"kernel/lib/strtok.c" "kernel/lib/memory.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/strtok.c", "file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/strtok.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -366,12 +349,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/lib/memory.c.o", "obj/kernel/lib/ringbuf.c.o",
"kernel/lib/memory.c" "kernel/lib/ringbuf.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/memory.c", "file": "/home/slinky/source/RockOS/kernel/lib/ringbuf.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/ringbuf.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -383,12 +366,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/vfs.c.o", "obj/kernel/lib/tasks.c.o",
"kernel/vfs.c" "kernel/lib/tasks.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/lib/tasks.c",
"output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/tasks.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -400,12 +383,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm.c.o", "obj/kernel/lib/strtok.c.o",
"kernel/memory/mm.c" "kernel/lib/strtok.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/lib/strtok.c",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/strtok.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -417,46 +400,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/drivers/pic/pic.S.o", "obj/kernel/scheduler.c.o",
"kernel/drivers/pic/pic.S" "kernel/scheduler.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S", "file": "/home/slinky/source/RockOS/kernel/scheduler.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o" "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/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"
}, },
{ {
"arguments": [ "arguments": [
@@ -475,40 +424,6 @@
"file": "/home/slinky/source/RockOS/kernel/syscall.S", "file": "/home/slinky/source/RockOS/kernel/syscall.S",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -536,12 +451,46 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/scheduler.S.o", "obj/kernel/drivers/pic/pic.S.o",
"kernel/scheduler.S" "kernel/drivers/pic/pic.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/scheduler.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.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": [
"/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": [ "arguments": [
@@ -560,6 +509,40 @@
"file": "/home/slinky/source/RockOS/kernel/memory/mm.S", "file": "/home/slinky/source/RockOS/kernel/memory/mm.S",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o" "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": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -576,5 +559,22 @@
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.S", "file": "/home/slinky/source/RockOS/kernel/gdt.S",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" "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"
} }
] ]

View File

@@ -1,10 +1,9 @@
#include <drivers/cpio/cpio.h> #include <drivers/cpio/cpio.h>
#include <lib/memory.h> #include <lib/memory.h>
#include <lib/string.h>
#define MAX_INITRD_FILES 64 #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) { static uint32_t parse_hex_ascii(const char *str, int len) {
uint32_t result = 0; 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) { static vfs_node_t* cpio_find(vfs_node_t* _dir, const char* name) {
if (!(_dir->flags & VFS_DIRECTORY)) return NULL; if (!(_dir->flags & VFS_DIRECTORY)) return NULL;
for (uint32_t i = 0; i < cpio_node_count; i++) { vfs_node_t* child = _dir->first_child;
if (strcmp(cpio_nodes[i].name, name) == 0) { while (child != NULL) {
return &cpio_nodes[i]; 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) { 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; 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) { vfs_node_t* cpio_read_fs(uint32_t _vaddr) {
cpio_header_t* header = (cpio_header_t*)_vaddr; cpio_header_t* header = (cpio_header_t*)_vaddr;
vfs_node_t* cpio_root = kalloc(sizeof(vfs_node_t)); vfs_node_t* cpio_root = kalloc(sizeof(vfs_node_t));
memset((uint8_t*)cpio_root, 0, sizeof(vfs_node_t)); memset((uint8_t*)cpio_root, 0, sizeof(vfs_node_t));
strcpy(cpio_root->name, "cpio_root"); 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) { while (1) {
if (strncmp(header->c_magic, "070701", 6) != 0 && if (strncmp(header->c_magic, "070701", 6) != 0 &&
strncmp(header->c_magic, "070702", 6) != 0) { strncmp(header->c_magic, "070702", 6) != 0) {
@@ -59,32 +89,48 @@ vfs_node_t* cpio_read_fs(uint32_t _vaddr) {
uint32_t namesize = parse_hex_ascii(header->c_namesize, 8); uint32_t namesize = parse_hex_ascii(header->c_namesize, 8);
uint32_t filesize = parse_hex_ascii(header->c_filesize, 8); uint32_t filesize = parse_hex_ascii(header->c_filesize, 8);
uint32_t mode = parse_hex_ascii(header->c_mode, 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) { if (strcmp(filename, "TRAILER!!!") == 0) {
break; break;
} }
uint32_t file_data_offset = sizeof(cpio_header_t) + namesize; uint32_t file_data_offset = (sizeof(cpio_header_t) + namesize + 3) & ~3;
file_data_offset = (file_data_offset + 3) & ~3; // align to 4 bytes
uint8_t* file_data = (uint8_t*)header + file_data_offset; uint8_t* file_data = (uint8_t*)header + file_data_offset;
if (strcmp(".", filename) != 0 && cnt < MAX_INITRD_FILES) { if (strcmp(".", filename) != 0) {
vfs_node_t* current = &cpio_nodes[cpio_node_count++]; vfs_node_t* parent = cpio_get_or_create(cpio_root, filename);
memset((uint8_t*)current, 0, sizeof(vfs_node_t));
strcpy(current->name, filename); char* base_name = filename;
current->size = filesize; for (int i = strlen(filename) - 1; i >= 0; i--) {
if (filename[i] == '/') {
current->flags = VFS_FILE; base_name = &filename[i + 1];
current->read = cpio_read; break;
current->data = file_data; }
} }
uint32_t next_header_offset = file_data_offset + filesize; vfs_node_t* current = cpio_find(parent, base_name);
next_header_offset = (next_header_offset + 3) & ~3; 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 + 3) & ~3;
header = (cpio_header_t*)((uint8_t*)header + next_header_offset); header = (cpio_header_t*)((uint8_t*)header + next_header_offset);
} }

View File

@@ -2,63 +2,64 @@
#include <stddef.h> #include <stddef.h>
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; char *token;
if (!saveptr) { if (str == NULL) {
str = *saveptr;
}
if (str == NULL || *str == '\0') {
*saveptr = NULL;
return NULL; return NULL;
} }
if (!s) { str += kernel_strspn(str, delim);
s = *saveptr; if (*str == '\0') {
} *saveptr = NULL;
if (!s || *s == '\0') {
*saveptr = s;
return NULL; return NULL;
} }
while (*s != '\0') { token = str;
const char *d = delim; str = kernel_strpbrk(token, delim);
int is_delim = 0;
while (*d != '\0') { if (str == NULL) {
if (*s == *d) { *saveptr = NULL;
is_delim = 1; } else {
break; *str = '\0';
} *saveptr = str + 1;
d++;
}
if (!is_delim) {
break;
}
s++;
} }
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; return token;
} }

View File

@@ -102,7 +102,7 @@ static int32_t sys_pty(int* slave_fd) {
master->size = 0; master->size = 0;
master->read = pty_master_read; master->read = pty_master_read;
master->write = pty_master_write; master->write = pty_master_write;
master->finddir = NULL; master->find = NULL;
master->data = pty; master->data = pty;
vfs_node_t* slave =(vfs_node_t*)kalloc(sizeof(vfs_node_t)); 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->size = 0;
slave->read = pty_slave_read; slave->read = pty_slave_read;
slave->write = pty_slave_write; slave->write = pty_slave_write;
slave->finddir = NULL; slave->find = NULL;
slave->data = pty; slave->data = pty;
file_t* fmaster = (file_t*)kalloc(sizeof(file_t)); file_t* fmaster = (file_t*)kalloc(sizeof(file_t));

View File

@@ -16,7 +16,7 @@ vfs_node_t* vfs_create_root() {
root->flags |= VFS_DIRECTORY; root->flags |= VFS_DIRECTORY;
root->size = 0; root->size = 0;
root->finddir = NULL; root->find = NULL;
return root; 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) { vfs_node_t* vfs_find(const char* path) {
if (path[0] != '/') return NULL;
vfs_node_t* current = root; vfs_node_t* current = root;
char* sav; char* sav = NULL;
size_t path_sz = strlen(path) + 1; size_t path_sz = strlen(path) + 1;
char* path_cpy = kalloc(path_sz); char* path_cpy = kalloc(path_sz);
@@ -38,25 +37,36 @@ vfs_node_t* vfs_find(const char* path) {
memcpy(path, path_cpy, path_sz); memcpy(path, path_cpy, path_sz);
char* tkn = strtok_r(path_cpy, "/", &sav); char* tkn = strtok_r(path_cpy, "/", &sav);
while (tkn != NULL) { 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); kfree(path_cpy);
const char* cmp = path + 1;
if (*cmp == '\0') return current;
if (current->finddir) {
return current->finddir(current, cmp);
}
return NULL; return NULL;
} }
vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name) { 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) { int vfs_open(const char* _path, int flags) {

View File

@@ -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 (*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 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* (*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 { typedef struct vfs_node {
char name[128]; char name[128];
uint32_t flags; // File, directory, device, etc. uint32_t flags; // File, directory, device, etc.
uint32_t size; // Size of file in bytes uint32_t size; // Size of file in bytes
struct vfs_node* first_child;
struct vfs_node* next_sibling;
read_type_t read; read_type_t read;
write_type_t write; write_type_t write;
finddir_type_t finddir; finddir_type_t find;
mkdir_type_t mkdir;
struct vfs_node* mnt; struct vfs_node* mnt;
void* data; void* data;

View File

@@ -6,6 +6,7 @@ rm -f initrd/*.elf
cp programs/bin/* initrd cp programs/bin/* initrd
cd initrd cd initrd
mkdir -p dev
mkdir -p output mkdir -p output
find . -depth -print | cpio -o -H newc > output/initrd.img find . -depth -print | cpio -o -H newc > output/initrd.img
cd .. cd ..

Binary file not shown.