mirror of
https://github.com/ish-app/ish.git
synced 2026-01-18 13:57:29 +00:00
141 lines
3.4 KiB
C
141 lines
3.4 KiB
C
#include "kernel/calls.h"
|
|
|
|
dword_t sys_getpid() {
|
|
STRACE("getpid()");
|
|
return current->tgid;
|
|
}
|
|
dword_t sys_gettid() {
|
|
STRACE("gettid()");
|
|
return current->pid;
|
|
}
|
|
dword_t sys_getppid() {
|
|
STRACE("getppid()");
|
|
pid_t_ ppid;
|
|
lock(&pids_lock);
|
|
if (current->parent != NULL)
|
|
ppid = current->parent->pid;
|
|
else
|
|
ppid = 0;
|
|
unlock(&pids_lock);
|
|
return ppid;
|
|
}
|
|
|
|
dword_t sys_getuid32() {
|
|
STRACE("getuid32()");
|
|
return current->uid;
|
|
}
|
|
dword_t sys_getuid() {
|
|
STRACE("getuid()");
|
|
return current->uid & 0xffff;
|
|
}
|
|
|
|
dword_t sys_geteuid32() {
|
|
STRACE("geteuid32()");
|
|
return current->euid;
|
|
}
|
|
dword_t sys_geteuid() {
|
|
STRACE("geteuid()");
|
|
return current->euid & 0xffff;
|
|
}
|
|
|
|
int_t sys_setuid(uid_t_ uid) {
|
|
STRACE("setuid(%d)", uid);
|
|
if (superuser()) {
|
|
current->uid = current->suid = uid;
|
|
} else {
|
|
if (uid != current->uid && uid != current->suid)
|
|
return _EPERM;
|
|
}
|
|
current->euid = uid;
|
|
return 0;
|
|
}
|
|
|
|
dword_t sys_setresuid(uid_t_ ruid, uid_t_ euid, uid_t_ suid) {
|
|
STRACE("setresuid(%d, %d, %d)", ruid, euid, suid);
|
|
if (!superuser()) {
|
|
if (ruid != -1 && ruid != current->uid && ruid != current->euid && ruid != current->suid)
|
|
return _EPERM;
|
|
if (euid != -1 && euid != current->uid && euid != current->euid && euid != current->suid)
|
|
return _EPERM;
|
|
if (suid != -1 && suid != current->uid && suid != current->euid && suid != current->suid)
|
|
return _EPERM;
|
|
}
|
|
|
|
if (ruid != -1)
|
|
current->uid = ruid;
|
|
if (euid != -1)
|
|
current->euid = euid;
|
|
if (suid != -1)
|
|
current->suid = suid;
|
|
return 0;
|
|
}
|
|
|
|
dword_t sys_getgid32() {
|
|
STRACE("getgid32()");
|
|
return current->gid;
|
|
}
|
|
dword_t sys_getgid() {
|
|
STRACE("getgid()");
|
|
return current->gid & 0xffff;
|
|
}
|
|
|
|
dword_t sys_getegid32() {
|
|
STRACE("getegid32()");
|
|
return current->egid;
|
|
}
|
|
dword_t sys_getegid() {
|
|
STRACE("getegid()");
|
|
return current->egid & 0xffff;
|
|
}
|
|
|
|
int_t sys_setgid(uid_t_ gid) {
|
|
STRACE("setgid(%d)", gid);
|
|
if (superuser()) {
|
|
current->gid = current->sgid = gid;
|
|
} else {
|
|
if (gid != current->gid && gid != current->sgid)
|
|
return _EPERM;
|
|
}
|
|
current->egid = gid;
|
|
return 0;
|
|
}
|
|
|
|
dword_t sys_setresgid(uid_t_ rgid, uid_t_ egid, uid_t_ sgid) {
|
|
STRACE("setresgid(%d, %d, %d)", rgid, egid, sgid);
|
|
if (!superuser()) {
|
|
if (rgid != -1 && rgid != current->gid && rgid != current->egid && rgid != current->sgid)
|
|
return _EPERM;
|
|
if (egid != -1 && egid != current->gid && egid != current->egid && egid != current->sgid)
|
|
return _EPERM;
|
|
if (sgid != -1 && sgid != current->gid && sgid != current->egid && sgid != current->sgid)
|
|
return _EPERM;
|
|
}
|
|
|
|
if (rgid != -1)
|
|
current->gid = rgid;
|
|
if (egid != -1)
|
|
current->egid = egid;
|
|
if (sgid != -1)
|
|
current->sgid = sgid;
|
|
return 0;
|
|
}
|
|
|
|
int_t sys_getgroups(dword_t size, addr_t list) {
|
|
if (size == 0)
|
|
return current->ngroups;
|
|
if (size < current->ngroups)
|
|
return _EINVAL;
|
|
if (user_write(list, current->groups, size * sizeof(uid_t_)))
|
|
return _EFAULT;
|
|
return 0;
|
|
}
|
|
|
|
int_t sys_setgroups(dword_t size, addr_t list) {
|
|
if (size > MAX_GROUPS)
|
|
return _EINVAL;
|
|
if (user_read(list, current->groups, size * sizeof(uid_t_)))
|
|
return _EFAULT;
|
|
current->ngroups = size;
|
|
return 0;
|
|
}
|