1#![no_std]
2#[allow(unused_imports)]
3use libc::{c_int, c_short, c_uint, c_ushort, c_void, intptr_t, size_t, timespec, uintptr_t};
4
5#[cfg(not(target_os = "netbsd"))]
6use core::ptr;
7
8pub mod constants;
9
10pub use self::constants::*;
11
12#[cfg(not(target_os = "netbsd"))]
13pub type EventListSize = c_int;
14
15#[cfg(target_os = "netbsd")]
16pub type EventListSize = size_t;
17
18#[cfg(all(not(target_os = "netbsd"), not(target_os = "freebsd")))]
19#[derive(Clone, Copy, Debug)]
20#[repr(C)]
21pub struct kevent {
22 pub ident: uintptr_t,
23 pub filter: EventFilter,
24 pub flags: EventFlag,
25 pub fflags: FilterFlag,
26 pub data: i64,
27 pub udata: *mut c_void,
28}
29
30#[cfg(target_os = "netbsd")]
31#[derive(Clone, Copy, Debug)]
32#[repr(C)]
33pub struct kevent {
34 pub ident: uintptr_t,
35 pub filter: EventFilter,
36 pub flags: EventFlag,
37 pub fflags: FilterFlag,
38 pub data: i64,
39 pub udata: intptr_t,
40}
41
42#[cfg(target_os = "freebsd")]
43#[derive(Clone, Copy, Debug)]
44#[repr(C)]
45pub struct kevent {
46 pub ident: uintptr_t,
47 pub filter: EventFilter,
48 pub flags: EventFlag,
49 pub fflags: FilterFlag,
50 pub data: i64,
51 pub udata: *mut c_void,
52 pub ext: [i64; 4],
53}
54
55impl kevent {
56 #[cfg(all(not(target_os = "netbsd"), not(target_os = "freebsd")))]
57 pub fn new(
58 ident: uintptr_t,
59 filter: EventFilter,
60 flags: EventFlag,
61 fflags: FilterFlag,
62 ) -> kevent {
63 kevent {
64 ident,
65 filter,
66 flags,
67 fflags,
68 data: 0,
69 udata: ptr::null_mut(),
70 }
71 }
72
73 #[cfg(target_os = "netbsd")]
74 pub fn new(
75 ident: uintptr_t,
76 filter: EventFilter,
77 flags: EventFlag,
78 fflags: FilterFlag,
79 ) -> kevent {
80 kevent {
81 ident,
82 filter,
83 flags,
84 fflags,
85 data: 0,
86 udata: 0,
87 }
88 }
89
90 #[cfg(target_os = "freebsd")]
91 pub fn new(
92 ident: uintptr_t,
93 filter: EventFilter,
94 flags: EventFlag,
95 fflags: FilterFlag,
96 ) -> kevent {
97 kevent {
98 ident,
99 filter,
100 flags,
101 fflags,
102 data: 0,
103 udata: ptr::null_mut(),
104 ext: [0; 4],
105 }
106 }
107}
108
109#[allow(improper_ctypes)]
110extern "C" {
111 pub fn kqueue() -> c_int;
112
113 pub fn kevent(
114 kq: c_int,
115 changelist: *const kevent,
116 nchanges: EventListSize,
117 eventlist: *mut kevent,
118 nevents: EventListSize,
119 timeout: *const timespec,
120 ) -> c_int;
121
122 #[cfg(target_os = "netbsd")]
123 pub fn kqueue1(flags: c_int) -> c_int;
124}
125
126#[cfg(test)]
127mod test {
128 use super::kqueue;
129
130 #[test]
131 fn test_kqueue() {
132 unsafe {
133 assert!(kqueue() > 0);
134 }
135 }
136}