From 7d939c001bd9b3f265ce57574e355faaa0014ec3 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 5 May 2023 19:40:01 +0300 Subject: [PATCH] Add process cwd --- Execute/Elf/BaseLoad.cpp | 1 + SystemCalls/Native.cpp | 6 +++--- include/task.hpp | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Execute/Elf/BaseLoad.cpp b/Execute/Elf/BaseLoad.cpp index aaf1595..398be11 100644 --- a/Execute/Elf/BaseLoad.cpp +++ b/Execute/Elf/BaseLoad.cpp @@ -212,6 +212,7 @@ namespace Execute /* ------------------------------------------------------------------------------------------------------------------------------ */ PCB *Process = TaskManager->CreateProcess(TaskManager->GetCurrentProcess(), BaseName, TaskTrustLevel::User, ElfFile); + Process->SetWorkingDirectory(vfs->GetNodeFromPath(Path)->Parent); Memory::Virtual pV = Memory::Virtual(Process->PageTable); for (size_t i = 0; i < TO_PAGES(ExFileSize); i++) pV.Remap((void *)((uintptr_t)ElfFile + (i * PAGE_SIZE)), (void *)((uintptr_t)ElfFile + (i * PAGE_SIZE)), Memory::PTFlag::RW | Memory::PTFlag::US); diff --git a/SystemCalls/Native.cpp b/SystemCalls/Native.cpp index 03fa5e6..edb0131 100644 --- a/SystemCalls/Native.cpp +++ b/SystemCalls/Native.cpp @@ -250,7 +250,7 @@ static int sys_ipc(SyscallsFrame *Frame, enum IPCCommand Command, enum IPCType T static uint64_t sys_file_open(SyscallsFrame *Frame, const char *Path, uint64_t Flags) { debug("(Path: %s, Flags: %#lx)", Path, Flags); - VirtualFileSystem::File KPObj = vfs->Open(Path); + VirtualFileSystem::File KPObj = vfs->Open(Path, TaskManager->GetCurrentProcess()->CurrentWorkingDirectory); if (!KPObj.IsOK()) { debug("Failed to open file %s (%d)", Path, KPObj.Status); @@ -307,13 +307,13 @@ static uint64_t sys_file_seek(SyscallsFrame *Frame, void *KernelPrivate, uint64_ if (KernelPrivate == nullptr) return 0; - debug("(KernelPrivate: %#lx, Offset: %#lx, Whence: %#lx)", KernelPrivate, Offset, Whence); + debug("(KernelPrivate: %#lx, Offset: %#lx, Whence: %d)", KernelPrivate, Offset, Whence); VirtualFileSystem::File *KPObj = (VirtualFileSystem::File *)KernelPrivate; if (KPObj->node->Operator->Seek == nullptr) return SYSCALL_INTERNAL_ERROR; - return KPObj->node->Operator->Seek(KPObj->node, Offset, Whence); + return KPObj->node->Operator->Seek(KPObj->node, Offset, (uint8_t)Whence); UNUSED(Frame); } diff --git a/include/task.hpp b/include/task.hpp index caddb09..7635056 100644 --- a/include/task.hpp +++ b/include/task.hpp @@ -190,8 +190,16 @@ namespace Tasking InterProcessCommunication::IPC *IPC; Memory::PageTable *PageTable; SymbolResolver::Symbols *ELFSymbolTable; + VirtualFileSystem::Node *CurrentWorkingDirectory; VirtualFileSystem::Node *ProcessDirectory; VirtualFileSystem::Node *memDirectory; + + void SetWorkingDirectory(VirtualFileSystem::Node *node) + { + CriticalSection cs; + trace("Setting working directory of process %s to %#lx (%s)", Name, node, node->Name); + CurrentWorkingDirectory = node; + } }; /** @brief Token Trust Level */