@@ -2,9 +2,9 @@ use std::ptr::{null, null_mut};
22use std:: os:: unix:: io:: RawFd ;
33use std:: mem;
44use libc;
5- use libc:: { fd_set, c_int, timeval} ;
5+ use libc:: { fd_set, c_int, timespec , timeval, sigset_t } ;
66use { Errno , Result } ;
7- use sys:: time:: TimeVal ;
7+ use sys:: time:: { TimeVal , TimeSpec } ;
88use sys:: signal:: SigSet ;
99
1010pub 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