From f697fab390e80bf41b0e0470c17be9952793a0c7 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Tue, 23 Sep 2025 19:38:14 +0300 Subject: [PATCH] vfs: add follow_path function --- Makefile | 7 ++--- include/vfs.h | 1 + src/fs/vfs.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/kernel/kernel.c | 14 ++++++++++ 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 9c914c1..69fa935 100644 --- a/Makefile +++ b/Makefile @@ -52,10 +52,11 @@ image: sudo losetup -D iso: - mkdir tmp - mkdir katauos + mkdir -p tmp + mkdir -p katauos sudo mount rootfs.iso9660 tmp/ - cp -R tmp/* katauos/ + sudo cp -R tmp/* katauos/ + sudo chown -R kali:kali katauos/ cp katauos.bin grubshit/boot cp katauos.bin katauos/boot/ cp grubshit/boot/grub/grub.cfg katauos/boot/grub/grub.cfg diff --git a/include/vfs.h b/include/vfs.h index aa98a9c..cbf3548 100644 --- a/include/vfs.h +++ b/include/vfs.h @@ -20,5 +20,6 @@ size_t vfs_read_file_length(l9660_file *file, uint8_t* buffer, size_t length); void test_iso9660(); int vsf_read_file_by_path(const char* path, uint8_t** buffer, l9660_dir* dir); +void follow_path(const char* path, l9660_file* file, l9660_dir* dir); #endif \ No newline at end of file diff --git a/src/fs/vfs.c b/src/fs/vfs.c index f2dc902..bc6b88f 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -221,4 +221,70 @@ int vsf_read_file_by_path(const char* path, uint8_t** buffer, l9660_dir* dir) debug_log("bytes read: 0x%X\n", read); return 0; +} + +void follow_path(const char* path, l9660_file* file, l9660_dir* dir) +{ + int pos = 0; + int start_from_root = 0; + char buf[32]; + int bufpos = 0; + + int isdir = 0; + + memset(buf, 0, sizeof(buf)); + + if (path[pos] == '/') + { + start_from_root = 1; + pos++; + l9660_fs_open_root(dir, global_fs); + debug_log("start_from_root\n"); + debug_log("/"); + } + + //printf("start_from_root: %X\n\n", start_from_root); + l9660_status status; + + while(path[pos] != '\0') + { + while (path[pos] != '/' && path[pos] != '\0') + { + buf[bufpos] = path[pos]; + pos++; + bufpos++; + } + buf[bufpos] = '\0'; // Null-terminate the string + bufpos = 0; + + if(path[pos] != '\0') + { + isdir = 1; + debug_log("%s->", buf);//this is a directory + l9660_dir dir2; + status = l9660_opendirat(&dir2, dir, buf); + if(status != L9660_OK) + { + debug_log("FUCKFUCKFUCKFUCK BLYAAAT!!!!!\n"); + return; + } + *dir = dir2; + } + else + { + isdir = 0; + debug_log("%s", buf);//this is a file + status = l9660_openat(file, dir, buf); + if(status != L9660_OK) + { + debug_log("PIZDAPIZDA BLYAAAT!!!!!\n"); + return; + } + return; + } + pos++; + } + debug_log("\n"); + //printf("buf: %s\n", buf); + debug_log("isdir: %X\n", isdir); } \ No newline at end of file diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 60b3841..fcd0047 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -131,6 +131,20 @@ void kmain(unsigned int magic, unsigned int info) mount_fs(); + l9660_dir* dir = (l9660_dir*)malloc(sizeof(l9660_dir)); + l9660_file* file = (l9660_file*)malloc(sizeof(l9660_file)); + + follow_path("/bin/bash.", file, dir); + + ////////////// + l9660_seek(file, L9660_SEEK_END, 0); + uint32_t file_size = l9660_tell(file); + debug_log("file_size: %X\n", file_size); + l9660_seek(file, L9660_SEEK_SET, 0); + free(file); + free(dir); + ////////////// + exec_from_file("caller.", "."); while(1)