diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs index 63328414ad..24ec1e185d 100644 --- a/platform/src/linux/mod.rs +++ b/platform/src/linux/mod.rs @@ -80,6 +80,48 @@ pub fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char { } } +pub fn getegid() -> gid_t { + unsafe { + syscall!(GETEGID) + } +} + +pub fn geteuid() -> uid_t { + unsafe { + syscall!(GETEUID) + } +} + +pub fn getgid() -> gid_t { + unsafe { + syscall!(GETGID) + } +} + +pub fn getpgid(pid: pid_t) -> pid_t { + unsafe { + syscall!(GETPGID, pid) + } +} + +pub fn getpid() -> pid_t { + unsafe { + syscall!(GETPID) + } +} + +pub fn getppid() -> pid_t { + unsafe { + syscall!(GETPPID) + } +} + +pub fn getuid() -> uid_t { + unsafe { + syscall!(GETUID) + } +} + #[cfg(target_arch = "x86_64")] pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int { unsafe { diff --git a/platform/src/redox/mod.rs b/platform/src/redox/mod.rs index 4391daa03b..e02d3636d6 100644 --- a/platform/src/redox/mod.rs +++ b/platform/src/redox/mod.rs @@ -64,6 +64,34 @@ pub fn getcwd(buf: *mut c_char, size: size_t) -> { } } +pub fn getegid() -> gid_t { + syscall::getegid()? as gid_t +} + +pub fn geteuid() -> uid_t { + syscall::geteuid()? as uid_t +} + +pub fn getgid() -> gid_t { + syscall::getgid()? as gid_t +} + +pub fn getpgid(pid: pid_t) -> pid_t { + syscall::getpgid(pid as usize)? as pid_t +} + +pub fn getpid() -> pid_t { + syscall::getpid()? as pid_t +} + +pub fn getppid() -> pid_t { + syscall::getppid()? as pid_t +} + +pub fn getuid() -> uid_t { + syscall::getuid()? as pid_t +} + pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int { let path = unsafe { c_str(path) }; syscall::open(path, (oflag as usize) | (mode as usize)).unwrap() as c_int diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index bc57fb4116..9d61b384bd 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -166,17 +166,17 @@ pub extern "C" fn getdtablesize() -> c_int { #[no_mangle] pub extern "C" fn getegid() -> gid_t { - unimplemented!(); + platform::getegid() } #[no_mangle] pub extern "C" fn geteuid() -> uid_t { - unimplemented!(); + platform::geteuid() } #[no_mangle] pub extern "C" fn getgid() -> gid_t { - unimplemented!(); + platform::getgid() } #[no_mangle] @@ -216,7 +216,7 @@ pub extern "C" fn getpass(prompt: *const c_char) -> *mut c_char { #[no_mangle] pub extern "C" fn getpgid(pid: pid_t) -> pid_t { - unimplemented!(); + platform::getpgid(pid) } #[no_mangle] @@ -226,12 +226,12 @@ pub extern "C" fn getpgrp() -> pid_t { #[no_mangle] pub extern "C" fn getpid() -> pid_t { - unimplemented!(); + platform::getpid() } #[no_mangle] pub extern "C" fn getppid() -> pid_t { - unimplemented!(); + platform::getppid() } #[no_mangle] @@ -241,7 +241,7 @@ pub extern "C" fn getsid(pid: pid_t) -> pid_t { #[no_mangle] pub extern "C" fn getuid() -> uid_t { - unimplemented!(); + platform::getuid() } #[no_mangle] diff --git a/tests/.gitignore b/tests/.gitignore index 37331d4e0d..b5ccff1d0f 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -10,6 +10,7 @@ /fsync /ftruncate /ftruncate.out +/getid /math /printf /write diff --git a/tests/Makefile b/tests/Makefile index 91f0aa222c..f872b2b6f8 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -8,6 +8,7 @@ BINS=\ fchdir \ fsync \ ftruncate \ + getid \ math \ printf \ write diff --git a/tests/getid.c b/tests/getid.c new file mode 100644 index 0000000000..f461884d39 --- /dev/null +++ b/tests/getid.c @@ -0,0 +1,14 @@ +#include +#include + +int main(int argc, char** argv) { + gid_t egid = getegid(); + uid_t euid = geteuid(); + gid_t gid = getgid(); + pid_t pgid = getpgid(0); + pid_t pid = getpid(); + pid_t ppid = getppid(); + uid_t uid = getuid(); + printf("egid: %d, euid: %d, gid: %d, pgid: %d, pid: %d, ppid %d, uid %d\n", + egid, euid, gid, pgid, pid, ppid, uid); +}