@@ -2,9 +2,9 @@ use std::ptr::{null, null_mut};
2
2
use std:: os:: unix:: io:: RawFd ;
3
3
use std:: mem;
4
4
use libc;
5
- use libc:: { fd_set, c_int, timeval} ;
5
+ use libc:: { fd_set, c_int, timespec , timeval, sigset_t } ;
6
6
use { Errno , Result } ;
7
- use sys:: time:: TimeVal ;
7
+ use sys:: time:: { TimeVal , TimeSpec } ;
8
8
use sys:: signal:: SigSet ;
9
9
10
10
pub struct FdSet {
@@ -74,3 +74,22 @@ pub fn select(nfds: c_int,
74
74
75
75
Errno :: result ( res)
76
76
}
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