diff --git a/src/header/sys_resource/mod.rs b/src/header/sys_resource/mod.rs index 03c95702c7ae8abd77b09ade3e21172e67f78b5a..ffe4d2a60806684f579cd8e4e533105df69b6f26 100644 --- a/src/header/sys_resource/mod.rs +++ b/src/header/sys_resource/mod.rs @@ -61,10 +61,23 @@ pub struct rusage { pub ru_nivcsw: c_long, } -// #[no_mangle] -// pub unsafe extern "C" fn getpriority(which: c_int, who: id_t) -> c_int { -// unimplemented!(); -// } +pub const PRIO_PROGRESS: c_int = 0; +pub const PRIO_PGRP: c_int = 1; +pub const PRIO_USER: c_int = 2; + +#[no_mangle] +pub unsafe extern "C" fn getpriority(which: c_int, who: id_t) -> c_int { + let r = Sys::getpriority(which, who); + if r < 0 { + return r + } + 20-r +} + +#[no_mangle] +pub unsafe extern "C" fn setpriority(which: c_int, who: id_t, nice: c_int) -> c_int { + Sys::setpriority(which, who, nice) +} #[no_mangle] pub unsafe extern "C" fn getrlimit(resource: c_int, rlp: *mut rlimit) -> c_int { diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index eb146ac78063157fa5154dd468b5c4c971cb9984..b657be7434e58157ea0e57211619d37d65899c6b 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -259,6 +259,10 @@ impl Pal for Sys { e(unsafe { syscall!(GETPPID) }) as pid_t } + fn getpriority(which: c_int, who: id_t) -> c_int { + e(unsafe { syscall!(GETPRIORITY, which, who) }) as c_int + } + fn getrandom(buf: &mut [u8], flags: c_uint) -> ssize_t { e(unsafe { syscall!(GETRANDOM, buf.as_mut_ptr(), buf.len(), flags) }) as ssize_t } @@ -452,6 +456,10 @@ impl Pal for Sys { e(unsafe { syscall!(SETPGID, pid, pgid) }) as c_int } + fn setpriority(which: c_int, who: id_t, prio: c_int) -> c_int { + e(unsafe { syscall!(SETPRIORITY, which, who, prio) }) as c_int + } + fn setregid(rgid: gid_t, egid: gid_t) -> c_int { e(unsafe { syscall!(SETREGID, rgid, egid) }) as c_int } diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index 485ba0a1a76a94560f1b75741cc595629beb6261..2333370ca30868d8bbca388c8077eb7a1306409c 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -96,6 +96,8 @@ pub trait Pal { fn getppid() -> pid_t; + fn getpriority(which: c_int, who: id_t) -> c_int; + fn getrandom(buf: &mut [u8], flags: c_uint) -> ssize_t; unsafe fn getrlimit(resource: c_int, rlim: *mut rlimit) -> c_int; @@ -163,6 +165,8 @@ pub trait Pal { fn setpgid(pid: pid_t, pgid: pid_t) -> c_int; + fn setpriority(which: c_int, who: id_t, prio: c_int) -> c_int; + fn setregid(rgid: gid_t, egid: gid_t) -> c_int; fn setreuid(ruid: uid_t, euid: uid_t) -> c_int; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 90fa2ff2e62dfe67ee7a1217abaf77fc94e5a179..90e794f13f26d7eb4dc8e29e2434c3720b9de345 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -499,6 +499,12 @@ impl Pal for Sys { e(syscall::getppid()) as pid_t } + fn getpriority(which: c_int, who: id_t) -> c_int { + // TODO + unsafe { errno = ENOSYS }; + -1 + } + fn getrandom(buf: &mut [u8], flags: c_uint) -> ssize_t { //TODO: make this a system call? @@ -785,6 +791,12 @@ impl Pal for Sys { e(syscall::setpgid(pid as usize, pgid as usize)) as c_int } + fn setpriority(which: c_int, who: id_t, prio: c_int) -> c_int { + // TODO + unsafe { errno = ENOSYS }; + -1 + } + fn setregid(rgid: gid_t, egid: gid_t) -> c_int { e(syscall::setregid(rgid as usize, egid as usize)) as c_int }