forked from Bananymous/banan-os
Kernel/LibC: add SYS_{SET,GET}_PWD and chdir, getpwd
This commit is contained in:
@@ -36,6 +36,8 @@ __BEGIN_DECLS
|
||||
#define SYS_GET_GID 29
|
||||
#define SYS_GET_EUID 30
|
||||
#define SYS_GET_EGID 31
|
||||
#define SYS_GET_PWD 32
|
||||
#define SYS_SET_PWD 33
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
||||
@@ -233,6 +233,19 @@ long syscall(long syscall, ...)
|
||||
ret = Kernel::syscall(SYS_GET_EGID);
|
||||
break;
|
||||
}
|
||||
case SYS_GET_PWD:
|
||||
{
|
||||
char* buffer = va_arg(args, char*);
|
||||
size_t size = va_arg(args, size_t);
|
||||
ret = Kernel::syscall(SYS_GET_PWD, (uintptr_t)buffer, size);
|
||||
break;
|
||||
}
|
||||
case SYS_SET_PWD:
|
||||
{
|
||||
const char* path = va_arg(args, const char*);
|
||||
ret = Kernel::syscall(SYS_SET_PWD, (uintptr_t)path);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
puts("LibC: Unhandeled syscall");
|
||||
ret = -ENOSYS;
|
||||
@@ -342,6 +355,26 @@ unsigned int sleep(unsigned int seconds)
|
||||
return syscall(SYS_SLEEP, seconds);
|
||||
}
|
||||
|
||||
char* getcwd(char* buf, size_t size)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if ((char*)syscall(SYS_GET_PWD, buf, size) == nullptr)
|
||||
return nullptr;
|
||||
|
||||
setenv("PWD", buf, 1);
|
||||
return buf;
|
||||
}
|
||||
|
||||
int chdir(const char* path)
|
||||
{
|
||||
return syscall(SYS_SET_PWD, path);
|
||||
}
|
||||
|
||||
uid_t getuid(void)
|
||||
{
|
||||
return syscall(SYS_GET_UID);
|
||||
|
||||
Reference in New Issue
Block a user