kqueue_sys/
lib.rs

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}