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

View File

@@ -1,10 +1,9 @@
#include <drivers/cpio/cpio.h>
#include <lib/memory.h>
#include <lib/string.h>
#define MAX_INITRD_FILES 64
static vfs_node_t cpio_nodes[MAX_INITRD_FILES];
static uint32_t cpio_node_count = 0;
static uint32_t parse_hex_ascii(const char *str, int len) {
uint32_t result = 0;
@@ -20,13 +19,15 @@ static uint32_t parse_hex_ascii(const char *str, int len) {
static vfs_node_t* cpio_find(vfs_node_t* _dir, const char* name) {
if (!(_dir->flags & VFS_DIRECTORY)) return NULL;
for (uint32_t i = 0; i < cpio_node_count; i++) {
if (strcmp(cpio_nodes[i].name, name) == 0) {
return &cpio_nodes[i];
vfs_node_t* child = _dir->first_child;
while (child != NULL) {
if (strcmp(child->name, name) == 0) {
return child;
}
child = child->next_sibling;
}
return NULL; // File not found
return NULL;
}
static uint32_t cpio_read(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer) {
@@ -38,18 +39,47 @@ static uint32_t cpio_read(struct vfs_node* node, uint32_t offset, uint32_t size,
return size;
}
static vfs_node_t* cpio_get_or_create(vfs_node_t* root_node, const char* path) {
vfs_node_t* current = root_node;
char path_cpy[256];
strcpy(path_cpy, path);
char* sav = NULL;
char* tkn = strtok_r(path_cpy, "/", &sav);
while (tkn != NULL) {
char* next_tkn = strtok_r(NULL, "/", &sav);
vfs_node_t* next_node = cpio_find(current, tkn);
if (!next_node) {
next_node = kalloc(sizeof(vfs_node_t));
memset((void*)next_node, 0, sizeof(vfs_node_t));
strcpy(next_node->name, tkn);
next_node->flags = VFS_DIRECTORY;
next_node->find = cpio_find;
next_node->next_sibling = current->first_child;
current->first_child = next_node;
}
current = next_node;
tkn = next_tkn;
}
return current;
}
vfs_node_t* cpio_read_fs(uint32_t _vaddr) {
cpio_header_t* header = (cpio_header_t*)_vaddr;
vfs_node_t* cpio_root = kalloc(sizeof(vfs_node_t));
memset((uint8_t*)cpio_root, 0, sizeof(vfs_node_t));
strcpy(cpio_root->name, "cpio_root");
cpio_root->flags = VFS_DIRECTORY;
cpio_root->find = cpio_find;
cpio_root->flags |= VFS_DIRECTORY;
cpio_root->finddir = cpio_find;
uint32_t cnt = 0;
while (1) {
if (strncmp(header->c_magic, "070701", 6) != 0 &&
strncmp(header->c_magic, "070702", 6) != 0) {
@@ -59,32 +89,48 @@ vfs_node_t* cpio_read_fs(uint32_t _vaddr) {
uint32_t namesize = parse_hex_ascii(header->c_namesize, 8);
uint32_t filesize = parse_hex_ascii(header->c_filesize, 8);
uint32_t mode = parse_hex_ascii(header->c_mode, 8);
char* filename = (char*)header + sizeof(cpio_header_t);
char* filename = (char*)header + sizeof(cpio_header_t);
if (strcmp(filename, "TRAILER!!!") == 0) {
break;
}
uint32_t file_data_offset = sizeof(cpio_header_t) + namesize;
file_data_offset = (file_data_offset + 3) & ~3; // align to 4 bytes
uint32_t file_data_offset = (sizeof(cpio_header_t) + namesize + 3) & ~3;
uint8_t* file_data = (uint8_t*)header + file_data_offset;
if (strcmp(".", filename) != 0 && cnt < MAX_INITRD_FILES) {
vfs_node_t* current = &cpio_nodes[cpio_node_count++];
memset((uint8_t*)current, 0, sizeof(vfs_node_t));
if (strcmp(".", filename) != 0) {
vfs_node_t* parent = cpio_get_or_create(cpio_root, filename);
strcpy(current->name, filename);
current->size = filesize;
char* base_name = filename;
for (int i = strlen(filename) - 1; i >= 0; i--) {
if (filename[i] == '/') {
base_name = &filename[i + 1];
break;
}
}
current->flags = VFS_FILE;
current->read = cpio_read;
current->data = file_data;
vfs_node_t* current = cpio_find(parent, base_name);
if (!current) {
current = kalloc(sizeof(vfs_node_t));
memset((void*)current, 0, sizeof(vfs_node_t));
strcpy(current->name, base_name);
current->next_sibling = parent->first_child;
parent->first_child = current;
}
if ((mode & 0xF000) == 0x4000) {
current->flags = VFS_DIRECTORY;
current->find = cpio_find;
} else {
current->flags = VFS_FILE;
current->size = filesize;
current->data = file_data;
current->read = cpio_read;
}
}
uint32_t next_header_offset = file_data_offset + filesize;
next_header_offset = (next_header_offset + 3) & ~3;
uint32_t next_header_offset = (file_data_offset + filesize + 3) & ~3;
header = (cpio_header_t*)((uint8_t*)header + next_header_offset);
}

View File

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

View File

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

View File

@@ -16,7 +16,7 @@ vfs_node_t* vfs_create_root() {
root->flags |= VFS_DIRECTORY;
root->size = 0;
root->finddir = NULL;
root->find = NULL;
return root;
}
@@ -27,10 +27,9 @@ void vfs_mount(vfs_node_t* _mnt, vfs_node_t* _fs) {
}
vfs_node_t* vfs_find(const char* path) {
if (path[0] != '/') return NULL;
vfs_node_t* current = root;
char* sav;
char* sav = NULL;
size_t path_sz = strlen(path) + 1;
char* path_cpy = kalloc(path_sz);
@@ -38,25 +37,36 @@ vfs_node_t* vfs_find(const char* path) {
memcpy(path, path_cpy, path_sz);
char* tkn = strtok_r(path_cpy, "/", &sav);
while (tkn != NULL) {
kprintf("Found tkn: %s\n");
if (!current || !current->find) {
current = NULL;
break;
}
current = current->find(current, tkn);
if (current == NULL) {
break;
}
tkn = strtok_r(NULL, "/", &sav);
}
kfree(path_cpy);
const char* cmp = path + 1;
if (*cmp == '\0') return current;
if (current->finddir) {
return current->finddir(current, cmp);
}
return NULL;
}
vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name) {
vfs_node_t* node = kalloc(sizeof(vfs_node_t));
if (!parent || !name) {
return NULL;
}
if (strlen(name) == 0) {
return NULL;
}
return parent->mkdir(parent, name);
}
int vfs_open(const char* _path, int flags) {

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

View File

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

Binary file not shown.