forked from Bananymous/banan-os
LibC: implement setenv, unsetenv, putenv
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user