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",
"-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"
}
]

View File

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

View File

@@ -1,7 +1,11 @@
#ifndef DVGA_H
#define DVGA_H
#include <vfs.h>
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

View File

@@ -5,7 +5,7 @@
#include <lib/memory.h>
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) {

View File

@@ -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();

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

View File

@@ -5,7 +5,7 @@
#include <stddef.h>
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);

View File

@@ -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

View File

@@ -2,48 +2,63 @@
#include <stddef.h>
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;
}

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) {
return open(filename, flags);
return vfs_open(filename, flags);
}
static int32_t sys_close(int fd) {

View File

@@ -3,6 +3,8 @@
#include <scheduler.h>
#include <lib/memory.h>
#include <lib/string.h>
#include <lib/print.h>
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();

View File

@@ -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);

Binary file not shown.