#include "ELF.h" #include "Log.h" #include "fs/VFS.h" #include "memory/MemoryManager.h" #include "sys/Syscall.h" #include "thread/Scheduler.h" #include "thread/ThreadImage.h" #include #include #include Result sys_exec(Registers* regs, SyscallArgs args) { auto path = TRY(MemoryManager::strdup_from_user(args[0])); auto inode = TRY(VFS::resolve_path(path.chars())); // Not executable if ((inode->mode() & S_IXUSR) != S_IXUSR) return err(EACCES); kinfoln("exec: attempting to replace current image with %s", path.chars()); auto current = Scheduler::current(); auto image = TRY(ThreadImage::try_load_from_elf(inode)); // From now on, nothing should fail. kinfoln("exec: image load ok, will now replace existing process image"); // FIXME: Close only O_CLOEXEC file descriptors. for (int i = 0; i < FD_MAX; i++) { current->fd_table[i] = {}; } MMU::delete_userspace_page_directory(current->directory); image->apply(current); MMU::switch_page_directory(current->directory); memcpy(regs, ¤t->regs, sizeof(*regs)); kinfoln("exec: done"); return 0; }