diff --git a/kernel/include/fs/VFS.h b/kernel/include/fs/VFS.h index 43eecf2d..140b052d 100644 --- a/kernel/include/fs/VFS.h +++ b/kernel/include/fs/VFS.h @@ -35,7 +35,8 @@ namespace VFS ssize_t read(Node* node, size_t offset, size_t length, char* buffer); ssize_t write(Node* node, size_t offset, size_t length, const char* buffer); - int mkdir(const char* path, const char* name); // FIXME: Support deducing this via a single path. + int mkdir(const char* path, const char* name); + int mkdir(const char* pathname); void mount_root(Node* root); diff --git a/kernel/src/fs/VFS.cpp b/kernel/src/fs/VFS.cpp index 9eff4a24..4a9a4509 100644 --- a/kernel/src/fs/VFS.cpp +++ b/kernel/src/fs/VFS.cpp @@ -3,6 +3,7 @@ #include "fs/VFS.h" #include "errno.h" #include "log/Log.h" +#include "std/libgen.h" #include "std/stdlib.h" #include "std/string.h" @@ -141,6 +142,24 @@ int VFS::mkdir(const char* path, const char* name) return node->mkdir_func(node, name); } +int VFS::mkdir(const char* pathname) +{ + char* bstr = strdup(pathname); + char* dstr = strdup(pathname); + + char* base = basename(bstr); + char* dir = dirname(dstr); + + kdbgln("mkdir(): creating %s in directory %s", base, dir); + + int result = mkdir(dir, base); + + kfree(bstr); + kfree(dstr); + + return result; +} + void VFS::mount(Node* mountpoint, Node* mounted) { if (!mountpoint || !mounted) return; diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp index f0b36b63..78a7a28f 100644 --- a/kernel/src/main.cpp +++ b/kernel/src/main.cpp @@ -77,7 +77,7 @@ extern "C" void _start() kinfoln("Prepared scheduler tasks"); - ASSERT(VFS::mkdir("/", "dev") == 0); + ASSERT(VFS::mkdir("/dev") == 0); VFS::mount("/dev", DeviceFS::get()); Init::finish_kernel_boot();