1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #ifndef _SYS_EVENT_H_
32 #define _SYS_EVENT_H_
33
34 #define EVFILT_READ (-1)
35 #define EVFILT_WRITE (-2)
36 #define EVFILT_AIO (-3)
37 #define EVFILT_VNODE (-4)
38 #define EVFILT_PROC (-5)
39 #define EVFILT_SIGNAL (-6)
40 #define EVFILT_TIMER (-7)
41
42 #define EVFILT_SYSCOUNT 7
43
44 #define EV_SET(kevp, a, b, c, d, e, f) do { \
45 (kevp)->ident = (a); \
46 (kevp)->filter = (b); \
47 (kevp)->flags = (c); \
48 (kevp)->fflags = (d); \
49 (kevp)->data = (e); \
50 (kevp)->udata = (f); \
51 } while(0)
52
53 struct kevent {
54 u_int ident;
55 short filter;
56 u_short flags;
57 u_int fflags;
58 int data;
59 void *udata;
60 };
61
62
63 #define EV_ADD 0x0001
64 #define EV_DELETE 0x0002
65 #define EV_ENABLE 0x0004
66 #define EV_DISABLE 0x0008
67
68
69 #define EV_ONESHOT 0x0010
70 #define EV_CLEAR 0x0020
71
72 #define EV_SYSFLAGS 0xF000
73 #define EV_FLAG1 0x2000
74
75
76 #define EV_EOF 0x8000
77 #define EV_ERROR 0x4000
78
79
80
81
82 #define NOTE_LOWAT 0x0001
83 #define NOTE_EOF 0x0002
84
85
86
87
88 #define NOTE_DELETE 0x0001
89 #define NOTE_WRITE 0x0002
90 #define NOTE_EXTEND 0x0004
91 #define NOTE_ATTRIB 0x0008
92 #define NOTE_LINK 0x0010
93 #define NOTE_RENAME 0x0020
94 #define NOTE_REVOKE 0x0040
95 #define NOTE_TRUNCATE 0x0080
96
97
98
99
100 #define NOTE_EXIT 0x80000000
101 #define NOTE_FORK 0x40000000
102 #define NOTE_EXEC 0x20000000
103 #define NOTE_PCTRLMASK 0xf0000000
104 #define NOTE_PDATAMASK 0x000fffff
105
106
107 #define NOTE_TRACK 0x00000001
108 #define NOTE_TRACKERR 0x00000002
109 #define NOTE_CHILD 0x00000004
110
111
112
113
114
115 #include <sys/queue.h>
116 struct knote;
117 SLIST_HEAD(klist, knote);
118
119 #ifdef _KERNEL
120
121 #define KNOTE(list, hint) if ((list) != NULL) knote(list, hint)
122
123
124
125
126
127 #define NOTE_SIGNAL 0x08000000
128
129 struct filterops {
130 int f_isfd;
131 int (*f_attach)(struct knote *kn);
132 void (*f_detach)(struct knote *kn);
133 int (*f_event)(struct knote *kn, long hint);
134 };
135
136 struct knote {
137 SLIST_ENTRY(knote) kn_link;
138 SLIST_ENTRY(knote) kn_selnext;
139 TAILQ_ENTRY(knote) kn_tqe;
140 struct kqueue *kn_kq;
141 struct kevent kn_kevent;
142 int kn_status;
143 int kn_sfflags;
144 int kn_sdata;
145 union {
146 struct file *p_fp;
147 struct proc *p_proc;
148 } kn_ptr;
149 const struct filterops *kn_fop;
150 void *kn_hook;
151 #define KN_ACTIVE 0x01
152 #define KN_QUEUED 0x02
153 #define KN_DISABLED 0x04
154 #define KN_DETACHED 0x08
155
156 #define kn_id kn_kevent.ident
157 #define kn_filter kn_kevent.filter
158 #define kn_flags kn_kevent.flags
159 #define kn_fflags kn_kevent.fflags
160 #define kn_data kn_kevent.data
161 #define kn_fp kn_ptr.p_fp
162 };
163
164 struct proc;
165
166 extern void knote(struct klist *list, long hint);
167 extern void knote_remove(struct proc *p, struct klist *list);
168 extern void knote_fdclose(struct proc *p, int fd);
169 extern int kqueue_register(struct kqueue *kq,
170 struct kevent *kev, struct proc *p);
171 extern int filt_seltrue(struct knote *kn, long hint);
172 extern void klist_invalidate(struct klist *);
173
174 #else
175
176 #include <sys/cdefs.h>
177 struct timespec;
178
179 __BEGIN_DECLS
180 int kqueue(void);
181 int kevent(int kq, const struct kevent *changelist, int nchanges,
182 struct kevent *eventlist, int nevents,
183 const struct timespec *timeout);
184 __END_DECLS
185
186 #endif
187
188 #endif