9
9
// except according to those terms.
10
10
11
11
use super :: arch:: * ;
12
- use super :: data:: { Stat , StatVfs , TimeSpec } ;
12
+ use super :: data:: { SigAction , Stat , StatVfs , TimeSpec } ;
13
13
use super :: error:: Result ;
14
14
use super :: number:: * ;
15
15
16
- use core:: mem;
16
+ use core:: { mem, ptr} ;
17
+
18
+ // Signal restorer
19
+ extern "C" fn restorer ( ) -> ! {
20
+ sigreturn ( ) . unwrap ( ) ;
21
+ unreachable ! ( ) ;
22
+ }
17
23
18
24
/// Set the end of the process's heap
19
25
///
@@ -43,12 +49,12 @@ pub unsafe fn brk(addr: usize) -> Result<usize> {
43
49
/// * `EIO` - an I/O error occurred
44
50
/// * `ENOENT` - `path` does not exit
45
51
/// * `ENOTDIR` - `path` is not a directory
46
- pub fn chdir ( path : & str ) -> Result < usize > {
47
- unsafe { syscall2 ( SYS_CHDIR , path. as_ptr ( ) as usize , path. len ( ) ) }
52
+ pub fn chdir < T : AsRef < [ u8 ] > > ( path : T ) -> Result < usize > {
53
+ unsafe { syscall2 ( SYS_CHDIR , path. as_ref ( ) . as_ptr ( ) as usize , path. as_ref ( ) . len ( ) ) }
48
54
}
49
55
50
- pub fn chmod ( path : & str , mode : usize ) -> Result < usize > {
51
- unsafe { syscall3 ( SYS_CHMOD , path. as_ptr ( ) as usize , path. len ( ) , mode) }
56
+ pub fn chmod < T : AsRef < [ u8 ] > > ( path : T , mode : usize ) -> Result < usize > {
57
+ unsafe { syscall3 ( SYS_CHMOD , path. as_ref ( ) . as_ptr ( ) as usize , path. as_ref ( ) . len ( ) , mode) }
52
58
}
53
59
54
60
/// Produce a fork of the current process, or a new process thread
@@ -132,6 +138,11 @@ pub fn ftruncate(fd: usize, len: usize) -> Result<usize> {
132
138
unsafe { syscall2 ( SYS_FTRUNCATE , fd, len) }
133
139
}
134
140
141
+ // Change modify and/or access times
142
+ pub fn futimens ( fd : usize , times : & [ TimeSpec ] ) -> Result < usize > {
143
+ unsafe { syscall3 ( SYS_FUTIMENS , fd, times. as_ptr ( ) as usize , times. len ( ) * mem:: size_of :: < TimeSpec > ( ) ) }
144
+ }
145
+
135
146
/// Fast userspace mutex
136
147
pub unsafe fn futex ( addr : * mut i32 , op : usize , val : i32 , val2 : usize , addr2 : * mut i32 )
137
148
-> Result < usize > {
@@ -173,6 +184,16 @@ pub fn getpid() -> Result<usize> {
173
184
unsafe { syscall0 ( SYS_GETPID ) }
174
185
}
175
186
187
+ /// Get the process group ID
188
+ pub fn getpgid ( pid : usize ) -> Result < usize > {
189
+ unsafe { syscall1 ( SYS_GETPGID , pid) }
190
+ }
191
+
192
+ /// Get the parent process ID
193
+ pub fn getppid ( ) -> Result < usize > {
194
+ unsafe { syscall0 ( SYS_GETPPID ) }
195
+ }
196
+
176
197
/// Get the current user ID
177
198
pub fn getuid ( ) -> Result < usize > {
178
199
unsafe { syscall0 ( SYS_GETUID ) }
@@ -210,8 +231,8 @@ pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result<usize> {
210
231
}
211
232
212
233
/// Open a file
213
- pub fn open ( path : & str , flags : usize ) -> Result < usize > {
214
- unsafe { syscall3 ( SYS_OPEN , path. as_ptr ( ) as usize , path. len ( ) , flags) }
234
+ pub fn open < T : AsRef < [ u8 ] > > ( path : T , flags : usize ) -> Result < usize > {
235
+ unsafe { syscall3 ( SYS_OPEN , path. as_ref ( ) . as_ptr ( ) as usize , path. as_ref ( ) . len ( ) , flags) }
215
236
}
216
237
217
238
/// Allocate pages, linearly in physical memory
@@ -245,8 +266,13 @@ pub fn read(fd: usize, buf: &mut [u8]) -> Result<usize> {
245
266
}
246
267
247
268
/// Remove a directory
248
- pub fn rmdir ( path : & str ) -> Result < usize > {
249
- unsafe { syscall2 ( SYS_RMDIR , path. as_ptr ( ) as usize , path. len ( ) ) }
269
+ pub fn rmdir < T : AsRef < [ u8 ] > > ( path : T ) -> Result < usize > {
270
+ unsafe { syscall2 ( SYS_RMDIR , path. as_ref ( ) . as_ptr ( ) as usize , path. as_ref ( ) . len ( ) ) }
271
+ }
272
+
273
+ /// Set the process group ID
274
+ pub fn setpgid ( pid : usize , pgid : usize ) -> Result < usize > {
275
+ unsafe { syscall2 ( SYS_SETPGID , pid, pgid) }
250
276
}
251
277
252
278
/// Set the current process group IDs
@@ -264,9 +290,22 @@ pub fn setreuid(ruid: usize, euid: usize) -> Result<usize> {
264
290
unsafe { syscall2 ( SYS_SETREUID , ruid, euid) }
265
291
}
266
292
293
+ /// Set up a signal handler
294
+ pub fn sigaction ( sig : usize , act : Option < & SigAction > , oldact : Option < & mut SigAction > ) -> Result < usize > {
295
+ unsafe { syscall4 ( SYS_SIGACTION , sig,
296
+ act. map ( |x| x as * const _ ) . unwrap_or_else ( ptr:: null) as usize ,
297
+ oldact. map ( |x| x as * mut _ ) . unwrap_or_else ( ptr:: null_mut) as usize ,
298
+ restorer as usize ) }
299
+ }
300
+
301
+ // Return from signal handler
302
+ pub fn sigreturn ( ) -> Result < usize > {
303
+ unsafe { syscall0 ( SYS_SIGRETURN ) }
304
+ }
305
+
267
306
/// Remove a file
268
- pub fn unlink ( path : & str ) -> Result < usize > {
269
- unsafe { syscall2 ( SYS_UNLINK , path. as_ptr ( ) as usize , path. len ( ) ) }
307
+ pub fn unlink < T : AsRef < [ u8 ] > > ( path : T ) -> Result < usize > {
308
+ unsafe { syscall2 ( SYS_UNLINK , path. as_ref ( ) . as_ptr ( ) as usize , path. as_ref ( ) . len ( ) ) }
270
309
}
271
310
272
311
/// Convert a virtual address to a physical one
0 commit comments