1
- use std:: ptr:: null_mut;
1
+ use std:: ptr:: { null , null_mut} ;
2
2
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 } ;
5
5
use sys:: time:: TimeVal ;
6
+ use sys:: signal:: sigset_t;
6
7
7
8
pub const FD_SETSIZE : RawFd = 1024 ;
8
9
@@ -54,8 +55,9 @@ impl FdSet {
54
55
}
55
56
56
57
mod ffi {
57
- use libc:: c_int;
58
+ use libc:: { c_int, timespec } ;
58
59
use sys:: time:: TimeVal ;
60
+ use sys:: signal:: sigset_t;
59
61
use super :: FdSet ;
60
62
61
63
extern {
@@ -64,6 +66,13 @@ mod ffi {
64
66
writefds : * mut FdSet ,
65
67
errorfds : * mut FdSet ,
66
68
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 ;
67
76
}
68
77
}
69
78
@@ -83,3 +92,22 @@ pub fn select(nfds: c_int,
83
92
84
93
Errno :: result ( res)
85
94
}
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