boxxy/ffi/
linux.rs

1use crate::errors::*;
2use libc::{gid_t, uid_t};
3
4/// Get the real uid, effective uid and saved uid.
5///
6/// ```
7/// let (ruid, euid, suid) = boxxy::ffi::getresuid().unwrap();
8/// println!("ruid={}, euid={}, suid={}", ruid, euid, suid);
9/// ```
10pub fn getresuid() -> Result<(uid_t, uid_t, uid_t)> {
11    let mut ruid: uid_t = 0;
12    let mut euid: uid_t = 0;
13    let mut suid: uid_t = 0;
14
15    let ret = unsafe { libc::getresuid(&mut ruid, &mut euid, &mut suid) };
16
17    if ret != 0 {
18        Err(errno())
19    } else {
20        Ok((ruid, euid, suid))
21    }
22}
23
24/// Get the real gid, effective gid and saved gid.
25///
26/// ```
27/// let (rgid, egid, sgid) = boxxy::ffi::getresgid().unwrap();
28/// println!("rgid={}, egid={}, sgid={}", rgid, egid, sgid);
29/// ```
30pub fn getresgid() -> Result<(gid_t, gid_t, gid_t)> {
31    let mut rgid: gid_t = 0;
32    let mut egid: gid_t = 0;
33    let mut sgid: gid_t = 0;
34
35    let ret = unsafe { libc::getresgid(&mut rgid, &mut egid, &mut sgid) };
36
37    if ret != 0 {
38        Err(errno())
39    } else {
40        Ok((rgid, egid, sgid))
41    }
42}
43
44/// Set the supplemental groups.
45///
46/// ```no_run
47/// boxxy::ffi::setgroups(&[1,2,3]).unwrap();
48/// ```
49pub fn setgroups(groups: &[gid_t]) -> Result<()> {
50    let ret = unsafe { libc::setgroups(groups.len(), groups.as_ptr()) };
51
52    if ret < 0 {
53        Err(errno())
54    } else {
55        Ok(())
56    }
57}