1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#![cfg_attr(not(feature = "use_std"), no_std)]

#[macro_use]

mod nr;
pub mod helper;
pub mod macros;

pub use self::helper::*;
pub use self::nr::SyscallNo::*;

#[cfg(test)]
mod tests {
    use super::*;
    use std::ffi::CString;

    #[test]
    fn test_syscall1_syscall4() {
        let pmaps = CString::new("/proc/self/maps").unwrap();
        let fd_ = unsafe {
            let at_fdcwd = (-100i64) as u64;
            syscall!(SYS_openat, at_fdcwd, pmaps.as_ptr(), 0)
        };
        match fd_ {
            Err(_) => {
                assert_eq!("open /proc/self/maps failed", "");
            }
            Ok(fd) => {
                let mut buffer1: [u8; 64] = unsafe { std::mem::zeroed() };
                let mut buffer2: [u8; 64] = unsafe { std::mem::zeroed() };

                let r1 = unsafe {
                    libc::pread64(fd as i32, buffer1.as_mut_ptr() as _, 64, 16)
                };

                let s1 = unsafe {
                    std::slice::from_raw_parts(
                        buffer1.as_mut_ptr() as *const u8,
                        r1 as usize,
                    )
                };
                let r2 = unsafe {
                    syscall!(
                        SYS_pread64,
                        fd,
                        buffer2.as_mut_ptr() as u64,
                        64,
                        16
                    )
                };
                let s2 = unsafe {
                    std::slice::from_raw_parts(
                        buffer1.as_mut_ptr() as *const u8,
                        r2.unwrap_or(0) as usize,
                    )
                };

                assert_eq!(r2, Ok(r1 as i64));
                assert_eq!(s1, s2);

                let closed = unsafe { syscall!(SYS_close, fd as u64) };
                assert!(closed.is_ok());
            }
        }
    }
}