LibC: implement setenv, unsetenv, putenv

This commit is contained in:
Bananymous
2023-06-05 22:43:26 +03:00
parent 55ea5c5488
commit 24993f6020
6 changed files with 138 additions and 1 deletions

View File

@@ -57,6 +57,8 @@ namespace Kernel
int block_until_exit();
BAN::ErrorOr<pid_t> wait(pid_t pid, int* stat_loc, int options);
BAN::ErrorOr<void> setenvp(char** envp);
BAN::ErrorOr<int> open(BAN::StringView, int);
BAN::ErrorOr<void> close(int fd);
BAN::ErrorOr<size_t> read(int fd, void* buffer, size_t count);

View File

@@ -389,6 +389,13 @@ namespace Kernel
return ret;
}
BAN::ErrorOr<void> Process::setenvp(char** envp)
{
LockGuard _(m_lock);
m_userspace_info.envp = envp;
return {};
}
void Process::load_elf(LibELF::ELF& elf)
{
ASSERT(elf.is_native());

View File

@@ -136,6 +136,14 @@ namespace Kernel
return 0;
}
long sys_setenvp(char** envp)
{
auto ret = Process::current().setenvp(envp);
if (ret.is_error())
return -ret.error().get_error_code();
return 0;
}
extern "C" long sys_fork_trampoline();
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5)
@@ -204,6 +212,9 @@ namespace Kernel
case SYS_STAT:
ret = sys_stat((const char*)arg1, (struct stat*)arg2, (int)arg3);
break;
case SYS_SETENVP:
ret = sys_setenvp((char**)arg1);
break;
default:
Kernel::panic("Unknown syscall {}", syscall);
}