Skip to content

Commit 6c25ad9

Browse files
committed
select: add pselect syscall
1 parent 9876979 commit 6c25ad9

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

src/sys/select.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
use std::ptr::null_mut;
1+
use std::ptr::{null, null_mut};
22
use std::os::unix::io::RawFd;
3-
use libc::c_int;
4-
use {Errno, Result};
3+
use libc::{c_int, timespec};
4+
use {Error, Errno, Result};
55
use sys::time::TimeVal;
6+
use sys::signal::sigset_t;
67

78
pub const FD_SETSIZE: RawFd = 1024;
89

@@ -54,8 +55,9 @@ impl FdSet {
5455
}
5556

5657
mod ffi {
57-
use libc::c_int;
58+
use libc::{c_int, timespec};
5859
use sys::time::TimeVal;
60+
use sys::signal::sigset_t;
5961
use super::FdSet;
6062

6163
extern {
@@ -64,6 +66,13 @@ mod ffi {
6466
writefds: *mut FdSet,
6567
errorfds: *mut FdSet,
6668
timeout: *mut TimeVal) -> c_int;
69+
70+
pub fn pselect(nfds: c_int,
71+
readfds: *mut FdSet,
72+
writefds: *mut FdSet,
73+
errorfds: *mut FdSet,
74+
timeout: *const timespec,
75+
sigmask: *const sigset_t) -> c_int;
6776
}
6877
}
6978

@@ -83,3 +92,22 @@ pub fn select(nfds: c_int,
8392

8493
Errno::result(res)
8594
}
95+
96+
pub fn pselect(nfds: c_int,
97+
readfds: Option<&mut FdSet>,
98+
writefds: Option<&mut FdSet>,
99+
errorfds: Option<&mut FdSet>,
100+
timeout: Option<&timespec>,
101+
sigmask: Option<&sigset_t>) -> Result<c_int> {
102+
let readfds = readfds.map(|set| set as *mut FdSet).unwrap_or(null_mut());
103+
let writefds = writefds.map(|set| set as *mut FdSet).unwrap_or(null_mut());
104+
let errorfds = errorfds.map(|set| set as *mut FdSet).unwrap_or(null_mut());
105+
let timeout = timeout.map(|ts| ts as *const timespec).unwrap_or(null());
106+
let sigmask = sigmask.map(|sm| sm as *const sigset_t).unwrap_or(null());
107+
108+
let res = unsafe {
109+
ffi::pselect(nfds, readfds, writefds, errorfds, timeout, sigmask)
110+
};
111+
112+
Errno::result(res)
113+
}

0 commit comments

Comments
 (0)