Skip to content

Commit c8b7060

Browse files
committed
select: add pselect syscall
1 parent 980ca8d commit c8b7060

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

src/sys/select.rs

+21-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ use std::ptr::{null, null_mut};
22
use std::os::unix::io::RawFd;
33
use std::mem;
44
use libc;
5-
use libc::{fd_set, c_int, timeval};
5+
use libc::{fd_set, c_int, timespec, timeval, sigset_t};
66
use {Errno, Result};
7-
use sys::time::TimeVal;
7+
use sys::time::{TimeVal, TimeSpec};
88
use sys::signal::SigSet;
99

1010
pub struct FdSet {
@@ -74,3 +74,22 @@ pub fn select(nfds: c_int,
7474

7575
Errno::result(res)
7676
}
77+
78+
pub fn pselect(nfds: c_int,
79+
readfds: Option<&mut FdSet>,
80+
writefds: Option<&mut FdSet>,
81+
errorfds: Option<&mut FdSet>,
82+
timeout: Option<&TimeSpec>,
83+
sigmask: Option<&SigSet>) -> Result<c_int> {
84+
let readfds = readfds.map(|set| &mut set.set as *mut fd_set).unwrap_or(null_mut());
85+
let writefds = writefds.map(|set| &mut set.set as *mut fd_set).unwrap_or(null_mut());
86+
let errorfds = errorfds.map(|set| &mut set.set as *mut fd_set).unwrap_or(null_mut());
87+
let timeout = timeout.map(|ts| ts.as_ref() as *const timespec).unwrap_or(null());
88+
let sigmask = sigmask.map(|sm| sm.as_ref() as *const sigset_t).unwrap_or(null());
89+
90+
let res = unsafe {
91+
libc::pselect(nfds, readfds, writefds, errorfds, timeout, sigmask)
92+
};
93+
94+
Errno::result(res)
95+
}

0 commit comments

Comments
 (0)