3
3
4
4
use { Error , Result } ;
5
5
use errno:: Errno ;
6
+ #[ cfg( not( target_os = "netbsd" ) ) ]
6
7
use libc:: { timespec, time_t, c_int, c_long, uintptr_t} ;
8
+ #[ cfg( target_os = "netbsd" ) ]
9
+ use libc:: { timespec, time_t, c_long, uintptr_t, size_t} ;
7
10
use std:: os:: unix:: io:: RawFd ;
8
11
use std:: ptr;
9
12
10
13
pub use self :: ffi:: kevent as KEvent ;
11
14
12
15
mod ffi {
13
- pub use libc:: { c_int, c_void, uintptr_t, intptr_t, timespec} ;
16
+ pub use libc:: { c_int, c_void, uintptr_t, intptr_t, timespec, size_t , int64_t } ;
14
17
use super :: { EventFilter , EventFlag , FilterFlag } ;
15
18
19
+ #[ cfg( not( target_os = "netbsd" ) ) ]
16
20
#[ derive( Clone , Copy ) ]
17
21
#[ repr( C ) ]
18
22
pub struct kevent {
@@ -24,22 +28,44 @@ mod ffi {
24
28
pub udata : usize // 8
25
29
}
26
30
31
+ #[ cfg( target_os = "netbsd" ) ]
32
+ #[ derive( Clone , Copy ) ]
33
+ #[ repr( C ) ]
34
+ pub struct kevent {
35
+ pub ident : uintptr_t ,
36
+ pub filter : EventFilter ,
37
+ pub flags : EventFlag ,
38
+ pub fflags : FilterFlag ,
39
+ pub data : int64_t ,
40
+ pub udata : intptr_t
41
+ }
42
+
27
43
// Bug in rustc, cannot determine that kevent is #[repr(C)]
28
44
#[ allow( improper_ctypes) ]
29
45
extern {
30
46
pub fn kqueue ( ) -> c_int ;
31
47
48
+ #[ cfg( not( target_os = "netbsd" ) ) ]
32
49
pub fn kevent (
33
50
kq : c_int ,
34
51
changelist : * const kevent ,
35
52
nchanges : c_int ,
36
53
eventlist : * mut kevent ,
37
54
nevents : c_int ,
38
55
timeout : * const timespec ) -> c_int ;
56
+
57
+ #[ cfg( target_os = "netbsd" ) ]
58
+ pub fn kevent (
59
+ kq : c_int ,
60
+ changelist : * const kevent ,
61
+ nchanges : size_t ,
62
+ eventlist : * mut kevent ,
63
+ nevents : size_t ,
64
+ timeout : * const timespec ) -> c_int ;
39
65
}
40
66
}
41
67
42
- #[ cfg( not( target_os = "dragonfly" ) ) ]
68
+ #[ cfg( not( any ( target_os = "dragonfly" , target_os = "netbsd" ) ) ) ]
43
69
#[ repr( i16 ) ]
44
70
#[ derive( Clone , Copy , Debug , PartialEq ) ]
45
71
pub enum EventFilter {
@@ -73,7 +99,21 @@ pub enum EventFilter {
73
99
EVFILT_USER = -9 ,
74
100
}
75
101
76
- #[ cfg( not( target_os = "dragonfly" ) ) ]
102
+ #[ cfg( target_os = "netbsd" ) ]
103
+ #[ repr( u32 ) ]
104
+ #[ derive( Clone , Copy , Debug , PartialEq ) ]
105
+ pub enum EventFilter {
106
+ EVFILT_READ = 0 ,
107
+ EVFILT_WRITE = 1 ,
108
+ EVFILT_AIO = 2 ,
109
+ EVFILT_VNODE = 3 ,
110
+ EVFILT_PROC = 4 ,
111
+ EVFILT_SIGNAL = 5 ,
112
+ EVFILT_TIMER = 6 ,
113
+ EVFILT_SYSCOUNT = 7
114
+ }
115
+
116
+ #[ cfg( not( any( target_os = "dragonfly" , target_os = "netbsd" ) ) ) ]
77
117
bitflags ! (
78
118
flags EventFlag : u16 {
79
119
const EV_ADD = 0x0001 ,
@@ -110,7 +150,24 @@ bitflags!(
110
150
}
111
151
) ;
112
152
113
- #[ cfg( not( target_os = "dragonfly" ) ) ]
153
+ #[ cfg( target_os = "netbsd" ) ]
154
+ bitflags ! (
155
+ flags EventFlag : u32 {
156
+ const EV_ADD = 0x0001 ,
157
+ const EV_DELETE = 0x0002 ,
158
+ const EV_ENABLE = 0x0004 ,
159
+ const EV_DISABLE = 0x0008 ,
160
+ const EV_ONESHOT = 0x0010 ,
161
+ const EV_CLEAR = 0x0020 ,
162
+ const EV_SYSFLAGS = 0xF000 ,
163
+ const EV_NODATA = 0x1000 ,
164
+ const EV_FLAG1 = 0x2000 ,
165
+ const EV_EOF = 0x8000 ,
166
+ const EV_ERROR = 0x4000
167
+ }
168
+ ) ;
169
+
170
+ #[ cfg( not( any( target_os = "dragonfly" , target_os="netbsd" ) ) ) ]
114
171
bitflags ! (
115
172
flags FilterFlag : u32 {
116
173
const NOTE_TRIGGER = 0x01000000 ,
@@ -188,10 +245,33 @@ bitflags!(
188
245
}
189
246
) ;
190
247
191
- #[ cfg( not( target_os = "dragonfly" ) ) ]
248
+ #[ cfg( target_os = "netbsd" ) ]
249
+ bitflags ! (
250
+ flags FilterFlag : u32 {
251
+ const NOTE_LOWAT = 0x00000001 ,
252
+ const NOTE_DELETE = 0x00000001 ,
253
+ const NOTE_WRITE = 0x00000002 ,
254
+ const NOTE_EXTEND = 0x00000004 ,
255
+ const NOTE_ATTRIB = 0x00000008 ,
256
+ const NOTE_LINK = 0x00000010 ,
257
+ const NOTE_RENAME = 0x00000020 ,
258
+ const NOTE_REVOKE = 0x00000040 ,
259
+ const NOTE_EXIT = 0x80000000 ,
260
+ const NOTE_FORK = 0x40000000 ,
261
+ const NOTE_EXEC = 0x20000000 ,
262
+ const NOTE_SIGNAL = 0x08000000 ,
263
+ const NOTE_PDATAMASK = 0x000fffff ,
264
+ const NOTE_PCTRLMASK = 0xf0000000 , // NOTE: FreeBSD uses 0xfff00000,
265
+ const NOTE_TRACK = 0x00000001 ,
266
+ const NOTE_TRACKERR = 0x00000002 ,
267
+ const NOTE_CHILD = 0x00000004
268
+ }
269
+ ) ;
270
+
271
+ #[ cfg( not( any( target_os = "dragonfly" , target_os = "netbsd" ) ) ) ]
192
272
pub const EV_POLL : EventFlag = EV_FLAG0 ;
193
273
194
- #[ cfg( not( target_os = "dragonfly" ) ) ]
274
+ #[ cfg( not( any ( target_os = "dragonfly" , target_os = "netbsd" ) ) ) ]
195
275
pub const EV_OOBAND : EventFlag = EV_FLAG1 ;
196
276
197
277
pub fn kqueue ( ) -> Result < RawFd > {
@@ -218,10 +298,12 @@ pub fn kevent(kq: RawFd,
218
298
kevent_ts ( kq, changelist, eventlist, Some ( timeout) )
219
299
}
220
300
301
+ #[ cfg( not( target_os = "netbsd" ) ) ]
221
302
pub fn kevent_ts ( kq : RawFd ,
222
303
changelist : & [ KEvent ] ,
223
304
eventlist : & mut [ KEvent ] ,
224
305
timeout_opt : Option < timespec > ) -> Result < usize > {
306
+
225
307
let res = unsafe {
226
308
ffi:: kevent (
227
309
kq,
@@ -239,6 +321,30 @@ pub fn kevent_ts(kq: RawFd,
239
321
return Ok ( res as usize )
240
322
}
241
323
324
+ #[ cfg( target_os = "netbsd" ) ]
325
+ pub fn kevent_ts ( kq : RawFd ,
326
+ changelist : & [ KEvent ] ,
327
+ eventlist : & mut [ KEvent ] ,
328
+ timeout_opt : Option < timespec > ) -> Result < usize > {
329
+
330
+ let res = unsafe {
331
+ ffi:: kevent (
332
+ kq,
333
+ changelist. as_ptr ( ) ,
334
+ changelist. len ( ) as size_t ,
335
+ eventlist. as_mut_ptr ( ) ,
336
+ eventlist. len ( ) as size_t ,
337
+ if let Some ( ref timeout) = timeout_opt { timeout as * const timespec } else { ptr:: null ( ) } )
338
+ } ;
339
+
340
+ if res < 0 {
341
+ return Err ( Error :: Sys ( Errno :: last ( ) ) ) ;
342
+ }
343
+
344
+ return Ok ( res as usize )
345
+ }
346
+
347
+ #[ cfg( not( target_os = "netbsd" ) ) ]
242
348
#[ inline]
243
349
pub fn ev_set ( ev : & mut KEvent ,
244
350
ident : usize ,
@@ -254,3 +360,20 @@ pub fn ev_set(ev: &mut KEvent,
254
360
ev. data = 0 ;
255
361
ev. udata = udata;
256
362
}
363
+
364
+ #[ cfg( target_os = "netbsd" ) ]
365
+ #[ inline]
366
+ pub fn ev_set ( ev : & mut KEvent ,
367
+ ident : usize ,
368
+ filter : EventFilter ,
369
+ flags : EventFlag ,
370
+ fflags : FilterFlag ,
371
+ udata : i64 ) {
372
+
373
+ ev. ident = ident as uintptr_t ;
374
+ ev. filter = filter;
375
+ ev. flags = flags;
376
+ ev. fflags = fflags;
377
+ ev. data = 0 ;
378
+ ev. udata = udata;
379
+ }
0 commit comments