diff --git a/kernel/include/scheduler.hpp b/kernel/include/scheduler.hpp index 2e17f0cd..7e646fff 100644 --- a/kernel/include/scheduler.hpp +++ b/kernel/include/scheduler.hpp @@ -41,6 +41,9 @@ bool has_handle(size_t fd); void release_handle(size_t fd); const std::string& get_handle(size_t fd); +const std::vector& get_working_directory(); +void set_working_directory(const std::vector& directory); + } //end of namespace scheduler #endif diff --git a/kernel/src/scheduler.cpp b/kernel/src/scheduler.cpp index 21119523..229c35fb 100644 --- a/kernel/src/scheduler.cpp +++ b/kernel/src/scheduler.cpp @@ -41,6 +41,7 @@ struct process_control_t { size_t rounds; size_t sleep_timeout; std::vector handles; + std::vector working_directory; }; //The Process Control Block @@ -861,6 +862,14 @@ const std::string& scheduler::get_handle(size_t fd){ return pcb[current_pid].handles[fd]; } +const std::vector& scheduler::get_working_directory(){ + return pcb[current_pid].working_directory; +} + +void scheduler::set_working_directory(const std::vector& directory){ + pcb[current_pid].working_directory = directory; +} + //Provided for task_switch.s extern "C" { diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 410218d7..1610e3a9 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -130,6 +130,32 @@ void sc_read(interrupt::syscall_regs* regs){ regs->rax = vfs::read(fd, buffer, max); } +void sc_pwd(interrupt::syscall_regs* regs){ + auto wd = scheduler::get_working_directory(); + + std::string path; + path += '/'; + + for(auto& part : wd){ + path += part; + path += '/'; + } + + auto buffer = reinterpret_cast(regs->rbx); + for(int i = 0; i < path.size(); ++i){ + buffer[i] = path[i]; + } + buffer[path.size()] = '\0'; +} + +void sc_cwd(interrupt::syscall_regs* regs){ + auto p = reinterpret_cast(regs->rbx); + std::string path(p); + + auto cwd = std::split(path, '/'); + scheduler::set_working_directory(cwd); +} + } //End of anonymous namespace void system_call_entry(interrupt::syscall_regs* regs){ @@ -208,6 +234,14 @@ void system_call_entry(interrupt::syscall_regs* regs){ sc_read(regs); break; + case 304: + sc_pwd(regs); + break; + + case 305: + sc_cwd(regs); + break; + case 0x666: //TODO Do something with return code scheduler::kill_current_process();