Skip to content

Commit e2820ea

Browse files
committed
Sync with upstream syscall library
1 parent eba374f commit e2820ea

File tree

4 files changed

+146
-12
lines changed

4 files changed

+146
-12
lines changed

src/libstd/sys/redox/syscall/call.rs

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@
99
// except according to those terms.
1010

1111
use super::arch::*;
12-
use super::data::{Stat, StatVfs, TimeSpec};
12+
use super::data::{SigAction, Stat, StatVfs, TimeSpec};
1313
use super::error::Result;
1414
use super::number::*;
1515

16-
use core::mem;
16+
use core::{mem, ptr};
17+
18+
// Signal restorer
19+
extern "C" fn restorer() -> ! {
20+
sigreturn().unwrap();
21+
unreachable!();
22+
}
1723

1824
/// Set the end of the process's heap
1925
///
@@ -43,12 +49,12 @@ pub unsafe fn brk(addr: usize) -> Result<usize> {
4349
/// * `EIO` - an I/O error occurred
4450
/// * `ENOENT` - `path` does not exit
4551
/// * `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()) }
4854
}
4955

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) }
5258
}
5359

5460
/// 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> {
132138
unsafe { syscall2(SYS_FTRUNCATE, fd, len) }
133139
}
134140

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+
135146
/// Fast userspace mutex
136147
pub unsafe fn futex(addr: *mut i32, op: usize, val: i32, val2: usize, addr2: *mut i32)
137148
-> Result<usize> {
@@ -173,6 +184,16 @@ pub fn getpid() -> Result<usize> {
173184
unsafe { syscall0(SYS_GETPID) }
174185
}
175186

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+
176197
/// Get the current user ID
177198
pub fn getuid() -> Result<usize> {
178199
unsafe { syscall0(SYS_GETUID) }
@@ -210,8 +231,8 @@ pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result<usize> {
210231
}
211232

212233
/// 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) }
215236
}
216237

217238
/// Allocate pages, linearly in physical memory
@@ -245,8 +266,13 @@ pub fn read(fd: usize, buf: &mut [u8]) -> Result<usize> {
245266
}
246267

247268
/// 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) }
250276
}
251277

252278
/// Set the current process group IDs
@@ -264,9 +290,22 @@ pub fn setreuid(ruid: usize, euid: usize) -> Result<usize> {
264290
unsafe { syscall2(SYS_SETREUID, ruid, euid) }
265291
}
266292

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+
267306
/// 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()) }
270309
}
271310

272311
/// Convert a virtual address to a physical one

src/libstd/sys/redox/syscall/data.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,78 @@
1111
use core::ops::{Deref, DerefMut};
1212
use core::{mem, slice};
1313

14+
#[derive(Copy, Clone, Debug, Default)]
15+
pub struct Event {
16+
pub id: usize,
17+
pub flags: usize,
18+
pub data: usize
19+
}
20+
21+
impl Deref for Event {
22+
type Target = [u8];
23+
fn deref(&self) -> &[u8] {
24+
unsafe {
25+
slice::from_raw_parts(self as *const Event as *const u8, mem::size_of::<Event>()) as &[u8]
26+
}
27+
}
28+
}
29+
30+
impl DerefMut for Event {
31+
fn deref_mut(&mut self) -> &mut [u8] {
32+
unsafe {
33+
slice::from_raw_parts_mut(self as *mut Event as *mut u8, mem::size_of::<Event>()) as &mut [u8]
34+
}
35+
}
36+
}
37+
38+
#[derive(Copy, Clone, Debug, Default)]
39+
#[repr(C)]
40+
pub struct Packet {
41+
pub id: u64,
42+
pub pid: usize,
43+
pub uid: u32,
44+
pub gid: u32,
45+
pub a: usize,
46+
pub b: usize,
47+
pub c: usize,
48+
pub d: usize
49+
}
50+
51+
impl Deref for Packet {
52+
type Target = [u8];
53+
fn deref(&self) -> &[u8] {
54+
unsafe {
55+
slice::from_raw_parts(self as *const Packet as *const u8, mem::size_of::<Packet>()) as &[u8]
56+
}
57+
}
58+
}
59+
60+
impl DerefMut for Packet {
61+
fn deref_mut(&mut self) -> &mut [u8] {
62+
unsafe {
63+
slice::from_raw_parts_mut(self as *mut Packet as *mut u8, mem::size_of::<Packet>()) as &mut [u8]
64+
}
65+
}
66+
}
67+
68+
#[derive(Copy, Clone, Debug)]
69+
#[repr(C)]
70+
pub struct SigAction {
71+
pub sa_handler: extern "C" fn(usize),
72+
pub sa_mask: [u64; 2],
73+
pub sa_flags: usize,
74+
}
75+
76+
impl Default for SigAction {
77+
fn default() -> Self {
78+
Self {
79+
sa_handler: unsafe { mem::transmute(0usize) },
80+
sa_mask: [0; 2],
81+
sa_flags: 0,
82+
}
83+
}
84+
}
85+
1486
#[derive(Copy, Clone, Debug, Default)]
1587
#[repr(C)]
1688
pub struct Stat {

src/libstd/sys/redox/syscall/flag.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
pub const CLONE_VM: usize = 0x100;
1212
pub const CLONE_FS: usize = 0x200;
1313
pub const CLONE_FILES: usize = 0x400;
14+
pub const CLONE_SIGHAND: usize = 0x800;
1415
pub const CLONE_VFORK: usize = 0x4000;
16+
pub const CLONE_THREAD: usize = 0x10000;
1517

1618
pub const CLOCK_REALTIME: usize = 1;
1719
pub const CLOCK_MONOTONIC: usize = 4;
@@ -20,6 +22,7 @@ pub const EVENT_NONE: usize = 0;
2022
pub const EVENT_READ: usize = 1;
2123
pub const EVENT_WRITE: usize = 2;
2224

25+
pub const F_DUPFD: usize = 0;
2326
pub const F_GETFD: usize = 1;
2427
pub const F_SETFD: usize = 2;
2528
pub const F_GETFL: usize = 3;
@@ -36,6 +39,8 @@ pub const MODE_TYPE: u16 = 0xF000;
3639
pub const MODE_DIR: u16 = 0x4000;
3740
pub const MODE_FILE: u16 = 0x8000;
3841
pub const MODE_SYMLINK: u16 = 0xA000;
42+
pub const MODE_FIFO: u16 = 0x1000;
43+
pub const MODE_CHR: u16 = 0x2000;
3944

4045
pub const MODE_PERM: u16 = 0x0FFF;
4146
pub const MODE_SETUID: u16 = 0o4000;
@@ -96,4 +101,16 @@ pub const SIGIO: usize = 29;
96101
pub const SIGPWR: usize = 30;
97102
pub const SIGSYS: usize = 31;
98103

104+
pub const SIG_DFL: usize = 0;
105+
pub const SIG_IGN: usize = 1;
106+
107+
pub const SA_NOCLDSTOP: usize = 0x00000001;
108+
pub const SA_NOCLDWAIT: usize = 0x00000002;
109+
pub const SA_SIGINFO: usize = 0x00000004;
110+
pub const SA_RESTORER: usize = 0x04000000;
111+
pub const SA_ONSTACK: usize = 0x08000000;
112+
pub const SA_RESTART: usize = 0x10000000;
113+
pub const SA_NODEFER: usize = 0x40000000;
114+
pub const SA_RESETHAND: usize = 0x80000000;
115+
99116
pub const WNOHANG: usize = 1;

src/libstd/sys/redox/syscall/number.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28;
4141
pub const SYS_FSTATVFS: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 100;
4242
pub const SYS_FSYNC: usize = SYS_CLASS_FILE | 118;
4343
pub const SYS_FTRUNCATE: usize =SYS_CLASS_FILE | 93;
44+
pub const SYS_FUTIMENS: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 320;
4445

4546
pub const SYS_BRK: usize = 45;
4647
pub const SYS_CHDIR: usize = 12;
@@ -56,6 +57,8 @@ pub const SYS_GETEUID: usize = 201;
5657
pub const SYS_GETGID: usize = 200;
5758
pub const SYS_GETNS: usize = 950;
5859
pub const SYS_GETPID: usize = 20;
60+
pub const SYS_GETPGID: usize = 132;
61+
pub const SYS_GETPPID: usize = 64;
5962
pub const SYS_GETUID: usize = 199;
6063
pub const SYS_IOPL: usize = 110;
6164
pub const SYS_KILL: usize = 37;
@@ -67,8 +70,11 @@ pub const SYS_PHYSMAP: usize = 947;
6770
pub const SYS_PHYSUNMAP: usize =948;
6871
pub const SYS_VIRTTOPHYS: usize=949;
6972
pub const SYS_PIPE2: usize = 331;
73+
pub const SYS_SETPGID: usize = 57;
7074
pub const SYS_SETREGID: usize = 204;
7175
pub const SYS_SETRENS: usize = 952;
7276
pub const SYS_SETREUID: usize = 203;
77+
pub const SYS_SIGACTION: usize =67;
78+
pub const SYS_SIGRETURN: usize =119;
7379
pub const SYS_WAITPID: usize = 7;
7480
pub const SYS_YIELD: usize = 158;

0 commit comments

Comments
 (0)