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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#[test]
fn brk() {
unsafe {
let start = dbg!(crate::brk(0)).unwrap();
let end = start + 4 * 1024 * 1024;
assert_eq!(dbg!(crate::brk(end)), Ok(end));
}
}
#[test]
fn chdir() {
//TODO: Verify CWD
assert_eq!(dbg!(crate::chdir("file:/")), Ok(0));
assert_eq!(dbg!(crate::chdir("file:/root")), Ok(0));
}
//TODO: chmod
#[test]
fn clone() {
let expected_status = 42;
let pid_res = unsafe { crate::clone(0) };
if pid_res == Ok(0) {
crate::exit(expected_status).unwrap();
panic!("failed to exit");
} else {
let pid = dbg!(pid_res).unwrap();
let mut status = 0;
assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid));
assert_eq!(dbg!(crate::wifexited(status)), true);
assert_eq!(dbg!(crate::wexitstatus(status)), expected_status);
}
}
//TODO: close
#[test]
fn clock_gettime() {
let mut tp = crate::TimeSpec::default();
assert_eq!(dbg!(
crate::clock_gettime(crate::CLOCK_MONOTONIC, &mut tp)
), Ok(0));
assert_ne!(dbg!(tp), crate::TimeSpec::default());
tp = crate::TimeSpec::default();
assert_eq!(dbg!(
crate::clock_gettime(crate::CLOCK_REALTIME, &mut tp)
), Ok(0));
assert_ne!(dbg!(tp), crate::TimeSpec::default());
}
//TODO: dup
//TODO: dup2
//TODO: exit (handled by clone?)
//TODO: fchmod
//TODO: fcntl
#[test]
fn fexec() {
let name = "/bin/ls";
let fd = dbg!(
crate::open(name, crate::O_RDONLY | crate::O_CLOEXEC)
).unwrap();
let args = &[
[name.as_ptr() as usize, name.len()]
];
let vars = &[];
let pid_res = unsafe { crate::clone(0) };
if pid_res == Ok(0) {
crate::fexec(fd, args, vars).unwrap();
panic!("failed to fexec");
} else {
assert_eq!(dbg!(crate::close(fd)), Ok(0));
let pid = dbg!(pid_res).unwrap();
let mut status = 0;
assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid));
assert_eq!(dbg!(crate::wifexited(status)), true);
assert_eq!(dbg!(crate::wexitstatus(status)), 0);
}
}
#[test]
fn fmap() {
use std::slice;
let fd = dbg!(
crate::open(
"/tmp/syscall-tests-fmap",
crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC
)
).unwrap();
let map = unsafe {
slice::from_raw_parts_mut(
dbg!(
crate::fmap(fd, &crate::Map {
offset: 0,
size: 128,
flags: crate::PROT_READ | crate::PROT_WRITE
})
).unwrap() as *mut u8,
128
)
};
// Maps should be available after closing
assert_eq!(dbg!(crate::close(fd)), Ok(0));
for i in 0..128 {
map[i as usize] = i;
assert_eq!(map[i as usize], i);
}
//TODO: add msync
unsafe {
assert_eq!(dbg!(
crate::funmap(map.as_mut_ptr() as usize)
), Ok(0));
}
}
|