1use super::{
2 arch::*,
3 data::{Map, Stat, StatVfs, TimeSpec},
4 error::Result,
5 flag::*,
6 number::*,
7};
8
9use core::mem;
10
11pub fn close(fd: usize) -> Result<usize> {
13 unsafe { syscall1(SYS_CLOSE, fd) }
14}
15
16pub fn clock_gettime(clock: usize, tp: &mut TimeSpec) -> Result<usize> {
18 unsafe { syscall2(SYS_CLOCK_GETTIME, clock, tp as *mut TimeSpec as usize) }
19}
20
21pub fn dup(fd: usize, buf: &[u8]) -> Result<usize> {
23 unsafe { syscall3(SYS_DUP, fd, buf.as_ptr() as usize, buf.len()) }
24}
25
26pub fn dup2(fd: usize, newfd: usize, buf: &[u8]) -> Result<usize> {
28 unsafe { syscall4(SYS_DUP2, fd, newfd, buf.as_ptr() as usize, buf.len()) }
29}
30
31pub fn exit(status: usize) -> Result<usize> {
33 unsafe { syscall1(SYS_EXIT, status) }
34}
35
36pub fn fchmod(fd: usize, mode: u16) -> Result<usize> {
38 unsafe { syscall2(SYS_FCHMOD, fd, mode as usize) }
39}
40
41pub fn fchown(fd: usize, uid: u32, gid: u32) -> Result<usize> {
43 unsafe { syscall3(SYS_FCHOWN, fd, uid as usize, gid as usize) }
44}
45
46pub fn fcntl(fd: usize, cmd: usize, arg: usize) -> Result<usize> {
48 unsafe { syscall3(SYS_FCNTL, fd, cmd, arg) }
49}
50
51pub unsafe fn fmap(fd: usize, map: &Map) -> Result<usize> {
62 syscall3(
63 SYS_FMAP,
64 fd,
65 map as *const Map as usize,
66 mem::size_of::<Map>(),
67 )
68}
69
70pub unsafe fn funmap(addr: usize, len: usize) -> Result<usize> {
72 syscall2(SYS_FUNMAP, addr, len)
73}
74
75pub fn fpath(fd: usize, buf: &mut [u8]) -> Result<usize> {
77 unsafe { syscall3(SYS_FPATH, fd, buf.as_mut_ptr() as usize, buf.len()) }
78}
79
80pub fn frename<T: AsRef<str>>(fd: usize, path: T) -> Result<usize> {
82 let path = path.as_ref();
83 unsafe {
84 syscall3(
85 SYS_FRENAME,
86 fd,
87 path.as_ptr() as usize,
88 path.len(),
89 )
90 }
91}
92
93pub fn fstat(fd: usize, stat: &mut Stat) -> Result<usize> {
95 unsafe {
96 syscall3(
97 SYS_FSTAT,
98 fd,
99 stat as *mut Stat as usize,
100 mem::size_of::<Stat>(),
101 )
102 }
103}
104
105pub fn fstatvfs(fd: usize, stat: &mut StatVfs) -> Result<usize> {
107 unsafe {
108 syscall3(
109 SYS_FSTATVFS,
110 fd,
111 stat as *mut StatVfs as usize,
112 mem::size_of::<StatVfs>(),
113 )
114 }
115}
116
117pub fn fsync(fd: usize) -> Result<usize> {
119 unsafe { syscall1(SYS_FSYNC, fd) }
120}
121
122pub fn ftruncate(fd: usize, len: usize) -> Result<usize> {
124 unsafe { syscall2(SYS_FTRUNCATE, fd, len) }
125}
126
127pub fn futimens(fd: usize, times: &[TimeSpec]) -> Result<usize> {
129 unsafe {
130 syscall3(
131 SYS_FUTIMENS,
132 fd,
133 times.as_ptr() as usize,
134 times.len() * mem::size_of::<TimeSpec>(),
135 )
136 }
137}
138
139pub unsafe fn futex(
141 addr: *mut i32,
142 op: usize,
143 val: i32,
144 val2: usize,
145 addr2: *mut i32,
146) -> Result<usize> {
147 syscall5(
148 SYS_FUTEX,
149 addr as usize,
150 op,
151 (val as isize) as usize,
152 val2,
153 addr2 as usize,
154 )
155}
156
157pub fn getegid() -> Result<usize> {
159 unsafe { syscall0(SYS_GETEGID) }
160}
161
162pub fn getens() -> Result<usize> {
164 unsafe { syscall0(SYS_GETENS) }
165}
166
167pub fn geteuid() -> Result<usize> {
169 unsafe { syscall0(SYS_GETEUID) }
170}
171
172pub fn getgid() -> Result<usize> {
174 unsafe { syscall0(SYS_GETGID) }
175}
176
177pub fn getns() -> Result<usize> {
179 unsafe { syscall0(SYS_GETNS) }
180}
181
182pub fn getpid() -> Result<usize> {
184 unsafe { syscall0(SYS_GETPID) }
185}
186
187pub fn getpgid(pid: usize) -> Result<usize> {
189 unsafe { syscall1(SYS_GETPGID, pid) }
190}
191
192pub fn getppid() -> Result<usize> {
194 unsafe { syscall0(SYS_GETPPID) }
195}
196
197pub fn getuid() -> Result<usize> {
199 unsafe { syscall0(SYS_GETUID) }
200}
201
202pub unsafe fn iopl(level: usize) -> Result<usize> {
209 syscall1(SYS_IOPL, level)
210}
211
212pub fn kill(pid: usize, sig: usize) -> Result<usize> {
214 unsafe { syscall2(SYS_KILL, pid, sig) }
215}
216
217pub unsafe fn link(old: *const u8, new: *const u8) -> Result<usize> {
219 syscall2(SYS_LINK, old as usize, new as usize)
220}
221
222pub fn lseek(fd: usize, offset: isize, whence: usize) -> Result<usize> {
224 unsafe { syscall3(SYS_LSEEK, fd, offset as usize, whence) }
225}
226
227pub fn mkns(schemes: &[[usize; 2]]) -> Result<usize> {
229 unsafe { syscall2(SYS_MKNS, schemes.as_ptr() as usize, schemes.len()) }
230}
231
232pub unsafe fn mprotect(addr: usize, size: usize, flags: MapFlags) -> Result<usize> {
234 syscall3(SYS_MPROTECT, addr, size, flags.bits())
235}
236
237pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result<usize> {
239 unsafe {
240 syscall2(
241 SYS_NANOSLEEP,
242 req as *const TimeSpec as usize,
243 rem as *mut TimeSpec as usize,
244 )
245 }
246}
247
248pub fn open<T: AsRef<str>>(path: T, flags: usize) -> Result<usize> {
250 let path = path.as_ref();
251 unsafe {
252 syscall3(
253 SYS_OPEN,
254 path.as_ptr() as usize,
255 path.len(),
256 flags,
257 )
258 }
259}
260
261pub fn openat<T: AsRef<str>>(fd: usize, path: T, flags: usize) -> Result<usize> {
263 let path = path.as_ref();
264 unsafe {
265 syscall4(
266 SYS_OPENAT,
267 fd,
268 path.as_ptr() as usize,
269 path.len(),
270 flags,
271 )
272 }
273}
274
275pub fn read(fd: usize, buf: &mut [u8]) -> Result<usize> {
277 unsafe { syscall3(SYS_READ, fd, buf.as_mut_ptr() as usize, buf.len()) }
278}
279
280pub fn rmdir<T: AsRef<str>>(path: T) -> Result<usize> {
282 let path = path.as_ref();
283 unsafe {
284 syscall2(
285 SYS_RMDIR,
286 path.as_ptr() as usize,
287 path.len(),
288 )
289 }
290}
291
292pub fn setpgid(pid: usize, pgid: usize) -> Result<usize> {
294 unsafe { syscall2(SYS_SETPGID, pid, pgid) }
295}
296
297pub fn setregid(rgid: usize, egid: usize) -> Result<usize> {
299 unsafe { syscall2(SYS_SETREGID, rgid, egid) }
300}
301
302pub fn setrens(rns: usize, ens: usize) -> Result<usize> {
304 unsafe { syscall2(SYS_SETRENS, rns, ens) }
305}
306
307pub fn setreuid(ruid: usize, euid: usize) -> Result<usize> {
309 unsafe { syscall2(SYS_SETREUID, ruid, euid) }
310}
311
312pub fn unlink<T: AsRef<str>>(path: T) -> Result<usize> {
314 let path = path.as_ref();
315 unsafe {
316 syscall2(
317 SYS_UNLINK,
318 path.as_ptr() as usize,
319 path.len(),
320 )
321 }
322}
323
324pub unsafe fn virttophys(virtual_address: usize) -> Result<usize> {
330 syscall1(SYS_VIRTTOPHYS, virtual_address)
331}
332
333pub fn waitpid(pid: usize, status: &mut usize, options: WaitFlags) -> Result<usize> {
335 unsafe {
336 syscall3(
337 SYS_WAITPID,
338 pid,
339 status as *mut usize as usize,
340 options.bits(),
341 )
342 }
343}
344
345pub fn write(fd: usize, buf: &[u8]) -> Result<usize> {
360 unsafe { syscall3(SYS_WRITE, fd, buf.as_ptr() as usize, buf.len()) }
361}
362
363pub fn sched_yield() -> Result<usize> {
367 unsafe { syscall0(SYS_YIELD) }
368}
369
370pub fn sendfd(receiver_socket: usize, fd: usize, flags: usize, arg: u64) -> Result<usize> {
375 #[cfg(target_pointer_width = "32")]
376 unsafe {
377 syscall5(
378 SYS_SENDFD,
379 receiver_socket,
380 fd,
381 flags,
382 arg as u32 as usize,
383 (arg >> 32) as u32 as usize,
384 )
385 }
386
387 #[cfg(target_pointer_width = "64")]
388 unsafe {
389 syscall4(SYS_SENDFD, receiver_socket, fd, flags, arg as usize)
390 }
391}