1 extern crate bytes;
2 #[macro_use]
3 extern crate cfg_if;
4 #[macro_use]
5 extern crate nix;
6 #[macro_use]
7 extern crate lazy_static;
8 extern crate libc;
9 extern crate rand;
10 extern crate tempfile;
11
12 macro_rules! skip_if_not_root {
13 ($name:expr) => {
14 use nix::unistd::Uid;
15 use std;
16 use std::io::Write;
17
18 if !Uid::current().is_root() {
19 let stderr = std::io::stderr();
20 let mut handle = stderr.lock();
21 writeln!(handle, "{} requires root privileges. Skipping test.", $name).unwrap();
22 return;
23 }
24 };
25 }
26
27 mod sys;
28 mod test_dir;
29 mod test_fcntl;
30 #[cfg(any(target_os = "android",
31 target_os = "linux"))]
32 mod test_kmod;
33 #[cfg(any(target_os = "dragonfly",
34 target_os = "freebsd",
35 target_os = "fushsia",
36 target_os = "linux",
37 target_os = "netbsd"))]
38 mod test_mq;
39 mod test_net;
40 mod test_nix_path;
41 mod test_poll;
42 mod test_pty;
43 #[cfg(any(target_os = "android",
44 target_os = "freebsd",
45 target_os = "ios",
46 target_os = "linux",
47 target_os = "macos"))]
48 mod test_sendfile;
49 mod test_stat;
50 mod test_unistd;
51
52 use std::os::unix::io::RawFd;
53 use std::sync::Mutex;
54 use nix::unistd::read;
55
56 /// Helper function analogous to `std::io::Read::read_exact`, but for `RawFD`s
read_exact(f: RawFd, buf: &mut [u8])57 fn read_exact(f: RawFd, buf: &mut [u8]) {
58 let mut len = 0;
59 while len < buf.len() {
60 // get_mut would be better than split_at_mut, but it requires nightly
61 let (_, remaining) = buf.split_at_mut(len);
62 len += read(f, remaining).unwrap();
63 }
64 }
65
66 lazy_static! {
67 /// Any test that changes the process's current working directory must grab
68 /// this mutex
69 pub static ref CWD_MTX: Mutex<()> = Mutex::new(());
70 /// Any test that changes the process's supplementary groups must grab this
71 /// mutex
72 pub static ref GROUPS_MTX: Mutex<()> = Mutex::new(());
73 /// Any test that creates child processes must grab this mutex, regardless
74 /// of what it does with those children.
75 pub static ref FORK_MTX: Mutex<()> = Mutex::new(());
76 /// Any test that calls ptsname(3) must grab this mutex.
77 pub static ref PTSNAME_MTX: Mutex<()> = Mutex::new(());
78 /// Any test that alters signal handling must grab this mutex.
79 pub static ref SIGNAL_MTX: Mutex<()> = Mutex::new(());
80 }
81