1 /*        $NetBSD: epolltable-internal.h,v 1.1.1.2 2021/04/07 02:43:12 christos Exp $     */
2 /*
3  * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
4  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #ifndef EPOLLTABLE_INTERNAL_H_INCLUDED_
29 #define EPOLLTABLE_INTERNAL_H_INCLUDED_
30 
31 /*
32   Here are the values we're masking off to decide what operations to do.
33   Note that since EV_READ|EV_WRITE.
34 
35   Note also that this table is a little sparse, since ADD+DEL is
36   nonsensical ("xxx" in the list below.)
37 
38   Note also that we are shifting old_events by only 5 bits, since
39   EV_READ is 2 and EV_WRITE is 4.
40 
41   The table was auto-generated with a python script, according to this
42   pseudocode:[*0]
43 
44       If either the read or the write change is add+del:
45            This is impossible; Set op==-1, events=0.
46       Else, if either the read or the write change is add:
47            Set events to 0.
48            If the read change is add, or
49               (the read change is not del, and ev_read is in old_events):
50                  Add EPOLLIN to events.
51            If the write change is add, or
52               (the write change is not del, and ev_write is in old_events):
53                  Add EPOLLOUT to events.
54 
55            If old_events is set:
56                  Set op to EPOLL_CTL_MOD [*1,*2]
57           Else:
58                  Set op to EPOLL_CTL_ADD [*3]
59 
60       Else, if the read or the write change is del:
61            Set op to EPOLL_CTL_DEL.
62            If the read change is del:
63                If the write change is del:
64                      Set events to EPOLLIN|EPOLLOUT
65                Else if ev_write is in old_events:
66                      Set events to EPOLLOUT
67                     Set op to EPOLL_CTL_MOD
68                Else
69                      Set events to EPOLLIN
70            Else:
71                {The write change is del.}
72               If ev_read is in old_events:
73                      Set events to EPOLLIN
74                     Set op to EPOLL_CTL_MOD
75               Else:
76                     Set the events to EPOLLOUT
77 
78       Else:
79              There is no read or write change; set op to 0 and events to 0.
80 
81       The logic is a little tricky, since we had no events set on the fd before,
82       we need to set op="ADD" and set events=the events we want to add.          If we
83       had any events set on the fd before, and we want any events to remain on
84       the fd, we need to say op="MOD" and set events=the events we want to
85       remain.  But if we want to delete the last event, we say op="DEL" and
86       set events=(any non-null pointer).
87 
88   [*0] Actually, the Python script has gotten a bit more complicated, to
89        support EPOLLRDHUP.
90 
91   [*1] This MOD is only a guess.  MOD might fail with ENOENT if the file was
92        closed and a new file was opened with the same fd.  If so, we'll retry
93        with ADD.
94 
95   [*2] We can't replace this with a no-op even if old_events is the same as
96        the new events: if the file was closed and reopened, we need to retry
97        with an ADD.  (We do a MOD in this case since "no change" is more
98        common than "close and reopen", so we'll usually wind up doing 1
99        syscalls instead of 2.)
100 
101   [*3] This ADD is only a guess.  There is a fun Linux kernel issue where if
102        you have two fds for the same file (via dup) and you ADD one to an
103        epfd, then close it, then re-create it with the same fd (via dup2 or an
104        unlucky dup), then try to ADD it again, you'll get an EEXIST, since the
105        struct epitem is not actually removed from the struct eventpoll until
106        the file itself is closed.
107 
108   EV_CHANGE_ADD==1
109   EV_CHANGE_DEL==2
110   EV_READ      ==2
111   EV_WRITE     ==4
112   EV_CLOSED    ==0x80
113 
114   Bit 0: close change is add
115   Bit 1: close change is del
116   Bit 2: read change is add
117   Bit 3: read change is del
118   Bit 4: write change is add
119   Bit 5: write change is del
120   Bit 6: old events had EV_READ
121   Bit 7: old events had EV_WRITE
122   Bit 8: old events had EV_CLOSED
123 */
124 
125 #define EPOLL_OP_TABLE_INDEX(c) \
126           (   (((c)->close_change&(EV_CHANGE_ADD|EV_CHANGE_DEL))) |             \
127               (((c)->read_change&(EV_CHANGE_ADD|EV_CHANGE_DEL)) << 2) |         \
128               (((c)->write_change&(EV_CHANGE_ADD|EV_CHANGE_DEL)) << 4) |        \
129               (((c)->old_events&(EV_READ|EV_WRITE)) << 5) |           \
130               (((c)->old_events&(EV_CLOSED)) << 1)                                        \
131               )
132 
133 #if EV_READ != 2 || EV_WRITE != 4 || EV_CLOSED != 0x80 || EV_CHANGE_ADD != 1 || EV_CHANGE_DEL != 2
134 #error "Libevent's internals changed!  Regenerate the op_table in epolltable-internal.h"
135 #endif
136 
137 static const struct operation {
138           int events;
139           int op;
140 } epoll_op_table[] = {
141           /* old=  0, write:  0, read:  0, close:  0 */
142           { 0, 0 },
143           /* old=  0, write:  0, read:  0, close:add */
144           { EPOLLRDHUP, EPOLL_CTL_ADD },
145           /* old=  0, write:  0, read:  0, close:del */
146           { EPOLLRDHUP, EPOLL_CTL_DEL },
147           /* old=  0, write:  0, read:  0, close:xxx */
148           { 0, 255 },
149           /* old=  0, write:  0, read:add, close:  0 */
150           { EPOLLIN, EPOLL_CTL_ADD },
151           /* old=  0, write:  0, read:add, close:add */
152           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_ADD },
153           /* old=  0, write:  0, read:add, close:del */
154           { EPOLLIN, EPOLL_CTL_ADD },
155           /* old=  0, write:  0, read:add, close:xxx */
156           { 0, 255 },
157           /* old=  0, write:  0, read:del, close:  0 */
158           { EPOLLIN, EPOLL_CTL_DEL },
159           /* old=  0, write:  0, read:del, close:add */
160           { EPOLLRDHUP, EPOLL_CTL_ADD },
161           /* old=  0, write:  0, read:del, close:del */
162           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_DEL },
163           /* old=  0, write:  0, read:del, close:xxx */
164           { 0, 255 },
165           /* old=  0, write:  0, read:xxx, close:  0 */
166           { 0, 255 },
167           /* old=  0, write:  0, read:xxx, close:add */
168           { 0, 255 },
169           /* old=  0, write:  0, read:xxx, close:del */
170           { 0, 255 },
171           /* old=  0, write:  0, read:xxx, close:xxx */
172           { 0, 255 },
173           /* old=  0, write:add, read:  0, close:  0 */
174           { EPOLLOUT, EPOLL_CTL_ADD },
175           /* old=  0, write:add, read:  0, close:add */
176           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_ADD },
177           /* old=  0, write:add, read:  0, close:del */
178           { EPOLLOUT, EPOLL_CTL_ADD },
179           /* old=  0, write:add, read:  0, close:xxx */
180           { 0, 255 },
181           /* old=  0, write:add, read:add, close:  0 */
182           { EPOLLIN|EPOLLOUT, EPOLL_CTL_ADD },
183           /* old=  0, write:add, read:add, close:add */
184           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_ADD },
185           /* old=  0, write:add, read:add, close:del */
186           { EPOLLIN|EPOLLOUT, EPOLL_CTL_ADD },
187           /* old=  0, write:add, read:add, close:xxx */
188           { 0, 255 },
189           /* old=  0, write:add, read:del, close:  0 */
190           { EPOLLOUT, EPOLL_CTL_ADD },
191           /* old=  0, write:add, read:del, close:add */
192           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_ADD },
193           /* old=  0, write:add, read:del, close:del */
194           { EPOLLOUT, EPOLL_CTL_ADD },
195           /* old=  0, write:add, read:del, close:xxx */
196           { 0, 255 },
197           /* old=  0, write:add, read:xxx, close:  0 */
198           { 0, 255 },
199           /* old=  0, write:add, read:xxx, close:add */
200           { 0, 255 },
201           /* old=  0, write:add, read:xxx, close:del */
202           { 0, 255 },
203           /* old=  0, write:add, read:xxx, close:xxx */
204           { 0, 255 },
205           /* old=  0, write:del, read:  0, close:  0 */
206           { EPOLLOUT, EPOLL_CTL_DEL },
207           /* old=  0, write:del, read:  0, close:add */
208           { EPOLLRDHUP, EPOLL_CTL_ADD },
209           /* old=  0, write:del, read:  0, close:del */
210           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
211           /* old=  0, write:del, read:  0, close:xxx */
212           { 0, 255 },
213           /* old=  0, write:del, read:add, close:  0 */
214           { EPOLLIN, EPOLL_CTL_ADD },
215           /* old=  0, write:del, read:add, close:add */
216           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_ADD },
217           /* old=  0, write:del, read:add, close:del */
218           { EPOLLIN, EPOLL_CTL_ADD },
219           /* old=  0, write:del, read:add, close:xxx */
220           { 0, 255 },
221           /* old=  0, write:del, read:del, close:  0 */
222           { EPOLLIN|EPOLLOUT, EPOLL_CTL_DEL },
223           /* old=  0, write:del, read:del, close:add */
224           { EPOLLRDHUP, EPOLL_CTL_ADD },
225           /* old=  0, write:del, read:del, close:del */
226           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
227           /* old=  0, write:del, read:del, close:xxx */
228           { 0, 255 },
229           /* old=  0, write:del, read:xxx, close:  0 */
230           { 0, 255 },
231           /* old=  0, write:del, read:xxx, close:add */
232           { 0, 255 },
233           /* old=  0, write:del, read:xxx, close:del */
234           { 0, 255 },
235           /* old=  0, write:del, read:xxx, close:xxx */
236           { 0, 255 },
237           /* old=  0, write:xxx, read:  0, close:  0 */
238           { 0, 255 },
239           /* old=  0, write:xxx, read:  0, close:add */
240           { 0, 255 },
241           /* old=  0, write:xxx, read:  0, close:del */
242           { 0, 255 },
243           /* old=  0, write:xxx, read:  0, close:xxx */
244           { 0, 255 },
245           /* old=  0, write:xxx, read:add, close:  0 */
246           { 0, 255 },
247           /* old=  0, write:xxx, read:add, close:add */
248           { 0, 255 },
249           /* old=  0, write:xxx, read:add, close:del */
250           { 0, 255 },
251           /* old=  0, write:xxx, read:add, close:xxx */
252           { 0, 255 },
253           /* old=  0, write:xxx, read:del, close:  0 */
254           { 0, 255 },
255           /* old=  0, write:xxx, read:del, close:add */
256           { 0, 255 },
257           /* old=  0, write:xxx, read:del, close:del */
258           { 0, 255 },
259           /* old=  0, write:xxx, read:del, close:xxx */
260           { 0, 255 },
261           /* old=  0, write:xxx, read:xxx, close:  0 */
262           { 0, 255 },
263           /* old=  0, write:xxx, read:xxx, close:add */
264           { 0, 255 },
265           /* old=  0, write:xxx, read:xxx, close:del */
266           { 0, 255 },
267           /* old=  0, write:xxx, read:xxx, close:xxx */
268           { 0, 255 },
269           /* old=  r, write:  0, read:  0, close:  0 */
270           { 0, 0 },
271           /* old=  r, write:  0, read:  0, close:add */
272           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
273           /* old=  r, write:  0, read:  0, close:del */
274           { EPOLLIN, EPOLL_CTL_MOD },
275           /* old=  r, write:  0, read:  0, close:xxx */
276           { 0, 255 },
277           /* old=  r, write:  0, read:add, close:  0 */
278           { EPOLLIN, EPOLL_CTL_MOD },
279           /* old=  r, write:  0, read:add, close:add */
280           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
281           /* old=  r, write:  0, read:add, close:del */
282           { EPOLLIN, EPOLL_CTL_MOD },
283           /* old=  r, write:  0, read:add, close:xxx */
284           { 0, 255 },
285           /* old=  r, write:  0, read:del, close:  0 */
286           { EPOLLIN, EPOLL_CTL_DEL },
287           /* old=  r, write:  0, read:del, close:add */
288           { EPOLLRDHUP, EPOLL_CTL_MOD },
289           /* old=  r, write:  0, read:del, close:del */
290           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_DEL },
291           /* old=  r, write:  0, read:del, close:xxx */
292           { 0, 255 },
293           /* old=  r, write:  0, read:xxx, close:  0 */
294           { 0, 255 },
295           /* old=  r, write:  0, read:xxx, close:add */
296           { 0, 255 },
297           /* old=  r, write:  0, read:xxx, close:del */
298           { 0, 255 },
299           /* old=  r, write:  0, read:xxx, close:xxx */
300           { 0, 255 },
301           /* old=  r, write:add, read:  0, close:  0 */
302           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
303           /* old=  r, write:add, read:  0, close:add */
304           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
305           /* old=  r, write:add, read:  0, close:del */
306           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
307           /* old=  r, write:add, read:  0, close:xxx */
308           { 0, 255 },
309           /* old=  r, write:add, read:add, close:  0 */
310           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
311           /* old=  r, write:add, read:add, close:add */
312           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
313           /* old=  r, write:add, read:add, close:del */
314           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
315           /* old=  r, write:add, read:add, close:xxx */
316           { 0, 255 },
317           /* old=  r, write:add, read:del, close:  0 */
318           { EPOLLOUT, EPOLL_CTL_MOD },
319           /* old=  r, write:add, read:del, close:add */
320           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
321           /* old=  r, write:add, read:del, close:del */
322           { EPOLLOUT, EPOLL_CTL_MOD },
323           /* old=  r, write:add, read:del, close:xxx */
324           { 0, 255 },
325           /* old=  r, write:add, read:xxx, close:  0 */
326           { 0, 255 },
327           /* old=  r, write:add, read:xxx, close:add */
328           { 0, 255 },
329           /* old=  r, write:add, read:xxx, close:del */
330           { 0, 255 },
331           /* old=  r, write:add, read:xxx, close:xxx */
332           { 0, 255 },
333           /* old=  r, write:del, read:  0, close:  0 */
334           { EPOLLIN, EPOLL_CTL_MOD },
335           /* old=  r, write:del, read:  0, close:add */
336           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
337           /* old=  r, write:del, read:  0, close:del */
338           { EPOLLIN, EPOLL_CTL_MOD },
339           /* old=  r, write:del, read:  0, close:xxx */
340           { 0, 255 },
341           /* old=  r, write:del, read:add, close:  0 */
342           { EPOLLIN, EPOLL_CTL_MOD },
343           /* old=  r, write:del, read:add, close:add */
344           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
345           /* old=  r, write:del, read:add, close:del */
346           { EPOLLIN, EPOLL_CTL_MOD },
347           /* old=  r, write:del, read:add, close:xxx */
348           { 0, 255 },
349           /* old=  r, write:del, read:del, close:  0 */
350           { EPOLLIN|EPOLLOUT, EPOLL_CTL_DEL },
351           /* old=  r, write:del, read:del, close:add */
352           { EPOLLRDHUP, EPOLL_CTL_MOD },
353           /* old=  r, write:del, read:del, close:del */
354           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
355           /* old=  r, write:del, read:del, close:xxx */
356           { 0, 255 },
357           /* old=  r, write:del, read:xxx, close:  0 */
358           { 0, 255 },
359           /* old=  r, write:del, read:xxx, close:add */
360           { 0, 255 },
361           /* old=  r, write:del, read:xxx, close:del */
362           { 0, 255 },
363           /* old=  r, write:del, read:xxx, close:xxx */
364           { 0, 255 },
365           /* old=  r, write:xxx, read:  0, close:  0 */
366           { 0, 255 },
367           /* old=  r, write:xxx, read:  0, close:add */
368           { 0, 255 },
369           /* old=  r, write:xxx, read:  0, close:del */
370           { 0, 255 },
371           /* old=  r, write:xxx, read:  0, close:xxx */
372           { 0, 255 },
373           /* old=  r, write:xxx, read:add, close:  0 */
374           { 0, 255 },
375           /* old=  r, write:xxx, read:add, close:add */
376           { 0, 255 },
377           /* old=  r, write:xxx, read:add, close:del */
378           { 0, 255 },
379           /* old=  r, write:xxx, read:add, close:xxx */
380           { 0, 255 },
381           /* old=  r, write:xxx, read:del, close:  0 */
382           { 0, 255 },
383           /* old=  r, write:xxx, read:del, close:add */
384           { 0, 255 },
385           /* old=  r, write:xxx, read:del, close:del */
386           { 0, 255 },
387           /* old=  r, write:xxx, read:del, close:xxx */
388           { 0, 255 },
389           /* old=  r, write:xxx, read:xxx, close:  0 */
390           { 0, 255 },
391           /* old=  r, write:xxx, read:xxx, close:add */
392           { 0, 255 },
393           /* old=  r, write:xxx, read:xxx, close:del */
394           { 0, 255 },
395           /* old=  r, write:xxx, read:xxx, close:xxx */
396           { 0, 255 },
397           /* old=  w, write:  0, read:  0, close:  0 */
398           { 0, 0 },
399           /* old=  w, write:  0, read:  0, close:add */
400           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
401           /* old=  w, write:  0, read:  0, close:del */
402           { EPOLLOUT, EPOLL_CTL_MOD },
403           /* old=  w, write:  0, read:  0, close:xxx */
404           { 0, 255 },
405           /* old=  w, write:  0, read:add, close:  0 */
406           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
407           /* old=  w, write:  0, read:add, close:add */
408           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
409           /* old=  w, write:  0, read:add, close:del */
410           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
411           /* old=  w, write:  0, read:add, close:xxx */
412           { 0, 255 },
413           /* old=  w, write:  0, read:del, close:  0 */
414           { EPOLLOUT, EPOLL_CTL_MOD },
415           /* old=  w, write:  0, read:del, close:add */
416           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
417           /* old=  w, write:  0, read:del, close:del */
418           { EPOLLOUT, EPOLL_CTL_MOD },
419           /* old=  w, write:  0, read:del, close:xxx */
420           { 0, 255 },
421           /* old=  w, write:  0, read:xxx, close:  0 */
422           { 0, 255 },
423           /* old=  w, write:  0, read:xxx, close:add */
424           { 0, 255 },
425           /* old=  w, write:  0, read:xxx, close:del */
426           { 0, 255 },
427           /* old=  w, write:  0, read:xxx, close:xxx */
428           { 0, 255 },
429           /* old=  w, write:add, read:  0, close:  0 */
430           { EPOLLOUT, EPOLL_CTL_MOD },
431           /* old=  w, write:add, read:  0, close:add */
432           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
433           /* old=  w, write:add, read:  0, close:del */
434           { EPOLLOUT, EPOLL_CTL_MOD },
435           /* old=  w, write:add, read:  0, close:xxx */
436           { 0, 255 },
437           /* old=  w, write:add, read:add, close:  0 */
438           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
439           /* old=  w, write:add, read:add, close:add */
440           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
441           /* old=  w, write:add, read:add, close:del */
442           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
443           /* old=  w, write:add, read:add, close:xxx */
444           { 0, 255 },
445           /* old=  w, write:add, read:del, close:  0 */
446           { EPOLLOUT, EPOLL_CTL_MOD },
447           /* old=  w, write:add, read:del, close:add */
448           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
449           /* old=  w, write:add, read:del, close:del */
450           { EPOLLOUT, EPOLL_CTL_MOD },
451           /* old=  w, write:add, read:del, close:xxx */
452           { 0, 255 },
453           /* old=  w, write:add, read:xxx, close:  0 */
454           { 0, 255 },
455           /* old=  w, write:add, read:xxx, close:add */
456           { 0, 255 },
457           /* old=  w, write:add, read:xxx, close:del */
458           { 0, 255 },
459           /* old=  w, write:add, read:xxx, close:xxx */
460           { 0, 255 },
461           /* old=  w, write:del, read:  0, close:  0 */
462           { EPOLLOUT, EPOLL_CTL_DEL },
463           /* old=  w, write:del, read:  0, close:add */
464           { EPOLLRDHUP, EPOLL_CTL_MOD },
465           /* old=  w, write:del, read:  0, close:del */
466           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
467           /* old=  w, write:del, read:  0, close:xxx */
468           { 0, 255 },
469           /* old=  w, write:del, read:add, close:  0 */
470           { EPOLLIN, EPOLL_CTL_MOD },
471           /* old=  w, write:del, read:add, close:add */
472           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
473           /* old=  w, write:del, read:add, close:del */
474           { EPOLLIN, EPOLL_CTL_MOD },
475           /* old=  w, write:del, read:add, close:xxx */
476           { 0, 255 },
477           /* old=  w, write:del, read:del, close:  0 */
478           { EPOLLIN|EPOLLOUT, EPOLL_CTL_DEL },
479           /* old=  w, write:del, read:del, close:add */
480           { EPOLLRDHUP, EPOLL_CTL_MOD },
481           /* old=  w, write:del, read:del, close:del */
482           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
483           /* old=  w, write:del, read:del, close:xxx */
484           { 0, 255 },
485           /* old=  w, write:del, read:xxx, close:  0 */
486           { 0, 255 },
487           /* old=  w, write:del, read:xxx, close:add */
488           { 0, 255 },
489           /* old=  w, write:del, read:xxx, close:del */
490           { 0, 255 },
491           /* old=  w, write:del, read:xxx, close:xxx */
492           { 0, 255 },
493           /* old=  w, write:xxx, read:  0, close:  0 */
494           { 0, 255 },
495           /* old=  w, write:xxx, read:  0, close:add */
496           { 0, 255 },
497           /* old=  w, write:xxx, read:  0, close:del */
498           { 0, 255 },
499           /* old=  w, write:xxx, read:  0, close:xxx */
500           { 0, 255 },
501           /* old=  w, write:xxx, read:add, close:  0 */
502           { 0, 255 },
503           /* old=  w, write:xxx, read:add, close:add */
504           { 0, 255 },
505           /* old=  w, write:xxx, read:add, close:del */
506           { 0, 255 },
507           /* old=  w, write:xxx, read:add, close:xxx */
508           { 0, 255 },
509           /* old=  w, write:xxx, read:del, close:  0 */
510           { 0, 255 },
511           /* old=  w, write:xxx, read:del, close:add */
512           { 0, 255 },
513           /* old=  w, write:xxx, read:del, close:del */
514           { 0, 255 },
515           /* old=  w, write:xxx, read:del, close:xxx */
516           { 0, 255 },
517           /* old=  w, write:xxx, read:xxx, close:  0 */
518           { 0, 255 },
519           /* old=  w, write:xxx, read:xxx, close:add */
520           { 0, 255 },
521           /* old=  w, write:xxx, read:xxx, close:del */
522           { 0, 255 },
523           /* old=  w, write:xxx, read:xxx, close:xxx */
524           { 0, 255 },
525           /* old= rw, write:  0, read:  0, close:  0 */
526           { 0, 0 },
527           /* old= rw, write:  0, read:  0, close:add */
528           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
529           /* old= rw, write:  0, read:  0, close:del */
530           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
531           /* old= rw, write:  0, read:  0, close:xxx */
532           { 0, 255 },
533           /* old= rw, write:  0, read:add, close:  0 */
534           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
535           /* old= rw, write:  0, read:add, close:add */
536           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
537           /* old= rw, write:  0, read:add, close:del */
538           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
539           /* old= rw, write:  0, read:add, close:xxx */
540           { 0, 255 },
541           /* old= rw, write:  0, read:del, close:  0 */
542           { EPOLLOUT, EPOLL_CTL_MOD },
543           /* old= rw, write:  0, read:del, close:add */
544           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
545           /* old= rw, write:  0, read:del, close:del */
546           { EPOLLOUT, EPOLL_CTL_MOD },
547           /* old= rw, write:  0, read:del, close:xxx */
548           { 0, 255 },
549           /* old= rw, write:  0, read:xxx, close:  0 */
550           { 0, 255 },
551           /* old= rw, write:  0, read:xxx, close:add */
552           { 0, 255 },
553           /* old= rw, write:  0, read:xxx, close:del */
554           { 0, 255 },
555           /* old= rw, write:  0, read:xxx, close:xxx */
556           { 0, 255 },
557           /* old= rw, write:add, read:  0, close:  0 */
558           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
559           /* old= rw, write:add, read:  0, close:add */
560           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
561           /* old= rw, write:add, read:  0, close:del */
562           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
563           /* old= rw, write:add, read:  0, close:xxx */
564           { 0, 255 },
565           /* old= rw, write:add, read:add, close:  0 */
566           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
567           /* old= rw, write:add, read:add, close:add */
568           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
569           /* old= rw, write:add, read:add, close:del */
570           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
571           /* old= rw, write:add, read:add, close:xxx */
572           { 0, 255 },
573           /* old= rw, write:add, read:del, close:  0 */
574           { EPOLLOUT, EPOLL_CTL_MOD },
575           /* old= rw, write:add, read:del, close:add */
576           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
577           /* old= rw, write:add, read:del, close:del */
578           { EPOLLOUT, EPOLL_CTL_MOD },
579           /* old= rw, write:add, read:del, close:xxx */
580           { 0, 255 },
581           /* old= rw, write:add, read:xxx, close:  0 */
582           { 0, 255 },
583           /* old= rw, write:add, read:xxx, close:add */
584           { 0, 255 },
585           /* old= rw, write:add, read:xxx, close:del */
586           { 0, 255 },
587           /* old= rw, write:add, read:xxx, close:xxx */
588           { 0, 255 },
589           /* old= rw, write:del, read:  0, close:  0 */
590           { EPOLLIN, EPOLL_CTL_MOD },
591           /* old= rw, write:del, read:  0, close:add */
592           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
593           /* old= rw, write:del, read:  0, close:del */
594           { EPOLLIN, EPOLL_CTL_MOD },
595           /* old= rw, write:del, read:  0, close:xxx */
596           { 0, 255 },
597           /* old= rw, write:del, read:add, close:  0 */
598           { EPOLLIN, EPOLL_CTL_MOD },
599           /* old= rw, write:del, read:add, close:add */
600           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
601           /* old= rw, write:del, read:add, close:del */
602           { EPOLLIN, EPOLL_CTL_MOD },
603           /* old= rw, write:del, read:add, close:xxx */
604           { 0, 255 },
605           /* old= rw, write:del, read:del, close:  0 */
606           { EPOLLIN|EPOLLOUT, EPOLL_CTL_DEL },
607           /* old= rw, write:del, read:del, close:add */
608           { EPOLLRDHUP, EPOLL_CTL_MOD },
609           /* old= rw, write:del, read:del, close:del */
610           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
611           /* old= rw, write:del, read:del, close:xxx */
612           { 0, 255 },
613           /* old= rw, write:del, read:xxx, close:  0 */
614           { 0, 255 },
615           /* old= rw, write:del, read:xxx, close:add */
616           { 0, 255 },
617           /* old= rw, write:del, read:xxx, close:del */
618           { 0, 255 },
619           /* old= rw, write:del, read:xxx, close:xxx */
620           { 0, 255 },
621           /* old= rw, write:xxx, read:  0, close:  0 */
622           { 0, 255 },
623           /* old= rw, write:xxx, read:  0, close:add */
624           { 0, 255 },
625           /* old= rw, write:xxx, read:  0, close:del */
626           { 0, 255 },
627           /* old= rw, write:xxx, read:  0, close:xxx */
628           { 0, 255 },
629           /* old= rw, write:xxx, read:add, close:  0 */
630           { 0, 255 },
631           /* old= rw, write:xxx, read:add, close:add */
632           { 0, 255 },
633           /* old= rw, write:xxx, read:add, close:del */
634           { 0, 255 },
635           /* old= rw, write:xxx, read:add, close:xxx */
636           { 0, 255 },
637           /* old= rw, write:xxx, read:del, close:  0 */
638           { 0, 255 },
639           /* old= rw, write:xxx, read:del, close:add */
640           { 0, 255 },
641           /* old= rw, write:xxx, read:del, close:del */
642           { 0, 255 },
643           /* old= rw, write:xxx, read:del, close:xxx */
644           { 0, 255 },
645           /* old= rw, write:xxx, read:xxx, close:  0 */
646           { 0, 255 },
647           /* old= rw, write:xxx, read:xxx, close:add */
648           { 0, 255 },
649           /* old= rw, write:xxx, read:xxx, close:del */
650           { 0, 255 },
651           /* old= rw, write:xxx, read:xxx, close:xxx */
652           { 0, 255 },
653           /* old=  c, write:  0, read:  0, close:  0 */
654           { 0, 0 },
655           /* old=  c, write:  0, read:  0, close:add */
656           { EPOLLRDHUP, EPOLL_CTL_MOD },
657           /* old=  c, write:  0, read:  0, close:del */
658           { EPOLLRDHUP, EPOLL_CTL_DEL },
659           /* old=  c, write:  0, read:  0, close:xxx */
660           { 0, 255 },
661           /* old=  c, write:  0, read:add, close:  0 */
662           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
663           /* old=  c, write:  0, read:add, close:add */
664           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
665           /* old=  c, write:  0, read:add, close:del */
666           { EPOLLIN, EPOLL_CTL_MOD },
667           /* old=  c, write:  0, read:add, close:xxx */
668           { 0, 255 },
669           /* old=  c, write:  0, read:del, close:  0 */
670           { EPOLLRDHUP, EPOLL_CTL_MOD },
671           /* old=  c, write:  0, read:del, close:add */
672           { EPOLLRDHUP, EPOLL_CTL_MOD },
673           /* old=  c, write:  0, read:del, close:del */
674           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_DEL },
675           /* old=  c, write:  0, read:del, close:xxx */
676           { 0, 255 },
677           /* old=  c, write:  0, read:xxx, close:  0 */
678           { 0, 255 },
679           /* old=  c, write:  0, read:xxx, close:add */
680           { 0, 255 },
681           /* old=  c, write:  0, read:xxx, close:del */
682           { 0, 255 },
683           /* old=  c, write:  0, read:xxx, close:xxx */
684           { 0, 255 },
685           /* old=  c, write:add, read:  0, close:  0 */
686           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
687           /* old=  c, write:add, read:  0, close:add */
688           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
689           /* old=  c, write:add, read:  0, close:del */
690           { EPOLLOUT, EPOLL_CTL_MOD },
691           /* old=  c, write:add, read:  0, close:xxx */
692           { 0, 255 },
693           /* old=  c, write:add, read:add, close:  0 */
694           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
695           /* old=  c, write:add, read:add, close:add */
696           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
697           /* old=  c, write:add, read:add, close:del */
698           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
699           /* old=  c, write:add, read:add, close:xxx */
700           { 0, 255 },
701           /* old=  c, write:add, read:del, close:  0 */
702           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
703           /* old=  c, write:add, read:del, close:add */
704           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
705           /* old=  c, write:add, read:del, close:del */
706           { EPOLLOUT, EPOLL_CTL_MOD },
707           /* old=  c, write:add, read:del, close:xxx */
708           { 0, 255 },
709           /* old=  c, write:add, read:xxx, close:  0 */
710           { 0, 255 },
711           /* old=  c, write:add, read:xxx, close:add */
712           { 0, 255 },
713           /* old=  c, write:add, read:xxx, close:del */
714           { 0, 255 },
715           /* old=  c, write:add, read:xxx, close:xxx */
716           { 0, 255 },
717           /* old=  c, write:del, read:  0, close:  0 */
718           { EPOLLRDHUP, EPOLL_CTL_MOD },
719           /* old=  c, write:del, read:  0, close:add */
720           { EPOLLRDHUP, EPOLL_CTL_MOD },
721           /* old=  c, write:del, read:  0, close:del */
722           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
723           /* old=  c, write:del, read:  0, close:xxx */
724           { 0, 255 },
725           /* old=  c, write:del, read:add, close:  0 */
726           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
727           /* old=  c, write:del, read:add, close:add */
728           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
729           /* old=  c, write:del, read:add, close:del */
730           { EPOLLIN, EPOLL_CTL_MOD },
731           /* old=  c, write:del, read:add, close:xxx */
732           { 0, 255 },
733           /* old=  c, write:del, read:del, close:  0 */
734           { EPOLLRDHUP, EPOLL_CTL_MOD },
735           /* old=  c, write:del, read:del, close:add */
736           { EPOLLRDHUP, EPOLL_CTL_MOD },
737           /* old=  c, write:del, read:del, close:del */
738           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
739           /* old=  c, write:del, read:del, close:xxx */
740           { 0, 255 },
741           /* old=  c, write:del, read:xxx, close:  0 */
742           { 0, 255 },
743           /* old=  c, write:del, read:xxx, close:add */
744           { 0, 255 },
745           /* old=  c, write:del, read:xxx, close:del */
746           { 0, 255 },
747           /* old=  c, write:del, read:xxx, close:xxx */
748           { 0, 255 },
749           /* old=  c, write:xxx, read:  0, close:  0 */
750           { 0, 255 },
751           /* old=  c, write:xxx, read:  0, close:add */
752           { 0, 255 },
753           /* old=  c, write:xxx, read:  0, close:del */
754           { 0, 255 },
755           /* old=  c, write:xxx, read:  0, close:xxx */
756           { 0, 255 },
757           /* old=  c, write:xxx, read:add, close:  0 */
758           { 0, 255 },
759           /* old=  c, write:xxx, read:add, close:add */
760           { 0, 255 },
761           /* old=  c, write:xxx, read:add, close:del */
762           { 0, 255 },
763           /* old=  c, write:xxx, read:add, close:xxx */
764           { 0, 255 },
765           /* old=  c, write:xxx, read:del, close:  0 */
766           { 0, 255 },
767           /* old=  c, write:xxx, read:del, close:add */
768           { 0, 255 },
769           /* old=  c, write:xxx, read:del, close:del */
770           { 0, 255 },
771           /* old=  c, write:xxx, read:del, close:xxx */
772           { 0, 255 },
773           /* old=  c, write:xxx, read:xxx, close:  0 */
774           { 0, 255 },
775           /* old=  c, write:xxx, read:xxx, close:add */
776           { 0, 255 },
777           /* old=  c, write:xxx, read:xxx, close:del */
778           { 0, 255 },
779           /* old=  c, write:xxx, read:xxx, close:xxx */
780           { 0, 255 },
781           /* old= cr, write:  0, read:  0, close:  0 */
782           { 0, 0 },
783           /* old= cr, write:  0, read:  0, close:add */
784           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
785           /* old= cr, write:  0, read:  0, close:del */
786           { EPOLLIN, EPOLL_CTL_MOD },
787           /* old= cr, write:  0, read:  0, close:xxx */
788           { 0, 255 },
789           /* old= cr, write:  0, read:add, close:  0 */
790           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
791           /* old= cr, write:  0, read:add, close:add */
792           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
793           /* old= cr, write:  0, read:add, close:del */
794           { EPOLLIN, EPOLL_CTL_MOD },
795           /* old= cr, write:  0, read:add, close:xxx */
796           { 0, 255 },
797           /* old= cr, write:  0, read:del, close:  0 */
798           { EPOLLRDHUP, EPOLL_CTL_MOD },
799           /* old= cr, write:  0, read:del, close:add */
800           { EPOLLRDHUP, EPOLL_CTL_MOD },
801           /* old= cr, write:  0, read:del, close:del */
802           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_DEL },
803           /* old= cr, write:  0, read:del, close:xxx */
804           { 0, 255 },
805           /* old= cr, write:  0, read:xxx, close:  0 */
806           { 0, 255 },
807           /* old= cr, write:  0, read:xxx, close:add */
808           { 0, 255 },
809           /* old= cr, write:  0, read:xxx, close:del */
810           { 0, 255 },
811           /* old= cr, write:  0, read:xxx, close:xxx */
812           { 0, 255 },
813           /* old= cr, write:add, read:  0, close:  0 */
814           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
815           /* old= cr, write:add, read:  0, close:add */
816           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
817           /* old= cr, write:add, read:  0, close:del */
818           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
819           /* old= cr, write:add, read:  0, close:xxx */
820           { 0, 255 },
821           /* old= cr, write:add, read:add, close:  0 */
822           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
823           /* old= cr, write:add, read:add, close:add */
824           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
825           /* old= cr, write:add, read:add, close:del */
826           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
827           /* old= cr, write:add, read:add, close:xxx */
828           { 0, 255 },
829           /* old= cr, write:add, read:del, close:  0 */
830           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
831           /* old= cr, write:add, read:del, close:add */
832           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
833           /* old= cr, write:add, read:del, close:del */
834           { EPOLLOUT, EPOLL_CTL_MOD },
835           /* old= cr, write:add, read:del, close:xxx */
836           { 0, 255 },
837           /* old= cr, write:add, read:xxx, close:  0 */
838           { 0, 255 },
839           /* old= cr, write:add, read:xxx, close:add */
840           { 0, 255 },
841           /* old= cr, write:add, read:xxx, close:del */
842           { 0, 255 },
843           /* old= cr, write:add, read:xxx, close:xxx */
844           { 0, 255 },
845           /* old= cr, write:del, read:  0, close:  0 */
846           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
847           /* old= cr, write:del, read:  0, close:add */
848           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
849           /* old= cr, write:del, read:  0, close:del */
850           { EPOLLIN, EPOLL_CTL_MOD },
851           /* old= cr, write:del, read:  0, close:xxx */
852           { 0, 255 },
853           /* old= cr, write:del, read:add, close:  0 */
854           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
855           /* old= cr, write:del, read:add, close:add */
856           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
857           /* old= cr, write:del, read:add, close:del */
858           { EPOLLIN, EPOLL_CTL_MOD },
859           /* old= cr, write:del, read:add, close:xxx */
860           { 0, 255 },
861           /* old= cr, write:del, read:del, close:  0 */
862           { EPOLLRDHUP, EPOLL_CTL_MOD },
863           /* old= cr, write:del, read:del, close:add */
864           { EPOLLRDHUP, EPOLL_CTL_MOD },
865           /* old= cr, write:del, read:del, close:del */
866           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
867           /* old= cr, write:del, read:del, close:xxx */
868           { 0, 255 },
869           /* old= cr, write:del, read:xxx, close:  0 */
870           { 0, 255 },
871           /* old= cr, write:del, read:xxx, close:add */
872           { 0, 255 },
873           /* old= cr, write:del, read:xxx, close:del */
874           { 0, 255 },
875           /* old= cr, write:del, read:xxx, close:xxx */
876           { 0, 255 },
877           /* old= cr, write:xxx, read:  0, close:  0 */
878           { 0, 255 },
879           /* old= cr, write:xxx, read:  0, close:add */
880           { 0, 255 },
881           /* old= cr, write:xxx, read:  0, close:del */
882           { 0, 255 },
883           /* old= cr, write:xxx, read:  0, close:xxx */
884           { 0, 255 },
885           /* old= cr, write:xxx, read:add, close:  0 */
886           { 0, 255 },
887           /* old= cr, write:xxx, read:add, close:add */
888           { 0, 255 },
889           /* old= cr, write:xxx, read:add, close:del */
890           { 0, 255 },
891           /* old= cr, write:xxx, read:add, close:xxx */
892           { 0, 255 },
893           /* old= cr, write:xxx, read:del, close:  0 */
894           { 0, 255 },
895           /* old= cr, write:xxx, read:del, close:add */
896           { 0, 255 },
897           /* old= cr, write:xxx, read:del, close:del */
898           { 0, 255 },
899           /* old= cr, write:xxx, read:del, close:xxx */
900           { 0, 255 },
901           /* old= cr, write:xxx, read:xxx, close:  0 */
902           { 0, 255 },
903           /* old= cr, write:xxx, read:xxx, close:add */
904           { 0, 255 },
905           /* old= cr, write:xxx, read:xxx, close:del */
906           { 0, 255 },
907           /* old= cr, write:xxx, read:xxx, close:xxx */
908           { 0, 255 },
909           /* old= cw, write:  0, read:  0, close:  0 */
910           { 0, 0 },
911           /* old= cw, write:  0, read:  0, close:add */
912           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
913           /* old= cw, write:  0, read:  0, close:del */
914           { EPOLLOUT, EPOLL_CTL_MOD },
915           /* old= cw, write:  0, read:  0, close:xxx */
916           { 0, 255 },
917           /* old= cw, write:  0, read:add, close:  0 */
918           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
919           /* old= cw, write:  0, read:add, close:add */
920           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
921           /* old= cw, write:  0, read:add, close:del */
922           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
923           /* old= cw, write:  0, read:add, close:xxx */
924           { 0, 255 },
925           /* old= cw, write:  0, read:del, close:  0 */
926           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
927           /* old= cw, write:  0, read:del, close:add */
928           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
929           /* old= cw, write:  0, read:del, close:del */
930           { EPOLLOUT, EPOLL_CTL_MOD },
931           /* old= cw, write:  0, read:del, close:xxx */
932           { 0, 255 },
933           /* old= cw, write:  0, read:xxx, close:  0 */
934           { 0, 255 },
935           /* old= cw, write:  0, read:xxx, close:add */
936           { 0, 255 },
937           /* old= cw, write:  0, read:xxx, close:del */
938           { 0, 255 },
939           /* old= cw, write:  0, read:xxx, close:xxx */
940           { 0, 255 },
941           /* old= cw, write:add, read:  0, close:  0 */
942           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
943           /* old= cw, write:add, read:  0, close:add */
944           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
945           /* old= cw, write:add, read:  0, close:del */
946           { EPOLLOUT, EPOLL_CTL_MOD },
947           /* old= cw, write:add, read:  0, close:xxx */
948           { 0, 255 },
949           /* old= cw, write:add, read:add, close:  0 */
950           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
951           /* old= cw, write:add, read:add, close:add */
952           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
953           /* old= cw, write:add, read:add, close:del */
954           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
955           /* old= cw, write:add, read:add, close:xxx */
956           { 0, 255 },
957           /* old= cw, write:add, read:del, close:  0 */
958           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
959           /* old= cw, write:add, read:del, close:add */
960           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
961           /* old= cw, write:add, read:del, close:del */
962           { EPOLLOUT, EPOLL_CTL_MOD },
963           /* old= cw, write:add, read:del, close:xxx */
964           { 0, 255 },
965           /* old= cw, write:add, read:xxx, close:  0 */
966           { 0, 255 },
967           /* old= cw, write:add, read:xxx, close:add */
968           { 0, 255 },
969           /* old= cw, write:add, read:xxx, close:del */
970           { 0, 255 },
971           /* old= cw, write:add, read:xxx, close:xxx */
972           { 0, 255 },
973           /* old= cw, write:del, read:  0, close:  0 */
974           { EPOLLRDHUP, EPOLL_CTL_MOD },
975           /* old= cw, write:del, read:  0, close:add */
976           { EPOLLRDHUP, EPOLL_CTL_MOD },
977           /* old= cw, write:del, read:  0, close:del */
978           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
979           /* old= cw, write:del, read:  0, close:xxx */
980           { 0, 255 },
981           /* old= cw, write:del, read:add, close:  0 */
982           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
983           /* old= cw, write:del, read:add, close:add */
984           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
985           /* old= cw, write:del, read:add, close:del */
986           { EPOLLIN, EPOLL_CTL_MOD },
987           /* old= cw, write:del, read:add, close:xxx */
988           { 0, 255 },
989           /* old= cw, write:del, read:del, close:  0 */
990           { EPOLLRDHUP, EPOLL_CTL_MOD },
991           /* old= cw, write:del, read:del, close:add */
992           { EPOLLRDHUP, EPOLL_CTL_MOD },
993           /* old= cw, write:del, read:del, close:del */
994           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
995           /* old= cw, write:del, read:del, close:xxx */
996           { 0, 255 },
997           /* old= cw, write:del, read:xxx, close:  0 */
998           { 0, 255 },
999           /* old= cw, write:del, read:xxx, close:add */
1000           { 0, 255 },
1001           /* old= cw, write:del, read:xxx, close:del */
1002           { 0, 255 },
1003           /* old= cw, write:del, read:xxx, close:xxx */
1004           { 0, 255 },
1005           /* old= cw, write:xxx, read:  0, close:  0 */
1006           { 0, 255 },
1007           /* old= cw, write:xxx, read:  0, close:add */
1008           { 0, 255 },
1009           /* old= cw, write:xxx, read:  0, close:del */
1010           { 0, 255 },
1011           /* old= cw, write:xxx, read:  0, close:xxx */
1012           { 0, 255 },
1013           /* old= cw, write:xxx, read:add, close:  0 */
1014           { 0, 255 },
1015           /* old= cw, write:xxx, read:add, close:add */
1016           { 0, 255 },
1017           /* old= cw, write:xxx, read:add, close:del */
1018           { 0, 255 },
1019           /* old= cw, write:xxx, read:add, close:xxx */
1020           { 0, 255 },
1021           /* old= cw, write:xxx, read:del, close:  0 */
1022           { 0, 255 },
1023           /* old= cw, write:xxx, read:del, close:add */
1024           { 0, 255 },
1025           /* old= cw, write:xxx, read:del, close:del */
1026           { 0, 255 },
1027           /* old= cw, write:xxx, read:del, close:xxx */
1028           { 0, 255 },
1029           /* old= cw, write:xxx, read:xxx, close:  0 */
1030           { 0, 255 },
1031           /* old= cw, write:xxx, read:xxx, close:add */
1032           { 0, 255 },
1033           /* old= cw, write:xxx, read:xxx, close:del */
1034           { 0, 255 },
1035           /* old= cw, write:xxx, read:xxx, close:xxx */
1036           { 0, 255 },
1037           /* old=crw, write:  0, read:  0, close:  0 */
1038           { 0, 0 },
1039           /* old=crw, write:  0, read:  0, close:add */
1040           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1041           /* old=crw, write:  0, read:  0, close:del */
1042           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
1043           /* old=crw, write:  0, read:  0, close:xxx */
1044           { 0, 255 },
1045           /* old=crw, write:  0, read:add, close:  0 */
1046           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1047           /* old=crw, write:  0, read:add, close:add */
1048           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1049           /* old=crw, write:  0, read:add, close:del */
1050           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
1051           /* old=crw, write:  0, read:add, close:xxx */
1052           { 0, 255 },
1053           /* old=crw, write:  0, read:del, close:  0 */
1054           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1055           /* old=crw, write:  0, read:del, close:add */
1056           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1057           /* old=crw, write:  0, read:del, close:del */
1058           { EPOLLOUT, EPOLL_CTL_MOD },
1059           /* old=crw, write:  0, read:del, close:xxx */
1060           { 0, 255 },
1061           /* old=crw, write:  0, read:xxx, close:  0 */
1062           { 0, 255 },
1063           /* old=crw, write:  0, read:xxx, close:add */
1064           { 0, 255 },
1065           /* old=crw, write:  0, read:xxx, close:del */
1066           { 0, 255 },
1067           /* old=crw, write:  0, read:xxx, close:xxx */
1068           { 0, 255 },
1069           /* old=crw, write:add, read:  0, close:  0 */
1070           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1071           /* old=crw, write:add, read:  0, close:add */
1072           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1073           /* old=crw, write:add, read:  0, close:del */
1074           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
1075           /* old=crw, write:add, read:  0, close:xxx */
1076           { 0, 255 },
1077           /* old=crw, write:add, read:add, close:  0 */
1078           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1079           /* old=crw, write:add, read:add, close:add */
1080           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1081           /* old=crw, write:add, read:add, close:del */
1082           { EPOLLIN|EPOLLOUT, EPOLL_CTL_MOD },
1083           /* old=crw, write:add, read:add, close:xxx */
1084           { 0, 255 },
1085           /* old=crw, write:add, read:del, close:  0 */
1086           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1087           /* old=crw, write:add, read:del, close:add */
1088           { EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_MOD },
1089           /* old=crw, write:add, read:del, close:del */
1090           { EPOLLOUT, EPOLL_CTL_MOD },
1091           /* old=crw, write:add, read:del, close:xxx */
1092           { 0, 255 },
1093           /* old=crw, write:add, read:xxx, close:  0 */
1094           { 0, 255 },
1095           /* old=crw, write:add, read:xxx, close:add */
1096           { 0, 255 },
1097           /* old=crw, write:add, read:xxx, close:del */
1098           { 0, 255 },
1099           /* old=crw, write:add, read:xxx, close:xxx */
1100           { 0, 255 },
1101           /* old=crw, write:del, read:  0, close:  0 */
1102           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
1103           /* old=crw, write:del, read:  0, close:add */
1104           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
1105           /* old=crw, write:del, read:  0, close:del */
1106           { EPOLLIN, EPOLL_CTL_MOD },
1107           /* old=crw, write:del, read:  0, close:xxx */
1108           { 0, 255 },
1109           /* old=crw, write:del, read:add, close:  0 */
1110           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
1111           /* old=crw, write:del, read:add, close:add */
1112           { EPOLLIN|EPOLLRDHUP, EPOLL_CTL_MOD },
1113           /* old=crw, write:del, read:add, close:del */
1114           { EPOLLIN, EPOLL_CTL_MOD },
1115           /* old=crw, write:del, read:add, close:xxx */
1116           { 0, 255 },
1117           /* old=crw, write:del, read:del, close:  0 */
1118           { EPOLLRDHUP, EPOLL_CTL_MOD },
1119           /* old=crw, write:del, read:del, close:add */
1120           { EPOLLRDHUP, EPOLL_CTL_MOD },
1121           /* old=crw, write:del, read:del, close:del */
1122           { EPOLLIN|EPOLLOUT|EPOLLRDHUP, EPOLL_CTL_DEL },
1123           /* old=crw, write:del, read:del, close:xxx */
1124           { 0, 255 },
1125           /* old=crw, write:del, read:xxx, close:  0 */
1126           { 0, 255 },
1127           /* old=crw, write:del, read:xxx, close:add */
1128           { 0, 255 },
1129           /* old=crw, write:del, read:xxx, close:del */
1130           { 0, 255 },
1131           /* old=crw, write:del, read:xxx, close:xxx */
1132           { 0, 255 },
1133           /* old=crw, write:xxx, read:  0, close:  0 */
1134           { 0, 255 },
1135           /* old=crw, write:xxx, read:  0, close:add */
1136           { 0, 255 },
1137           /* old=crw, write:xxx, read:  0, close:del */
1138           { 0, 255 },
1139           /* old=crw, write:xxx, read:  0, close:xxx */
1140           { 0, 255 },
1141           /* old=crw, write:xxx, read:add, close:  0 */
1142           { 0, 255 },
1143           /* old=crw, write:xxx, read:add, close:add */
1144           { 0, 255 },
1145           /* old=crw, write:xxx, read:add, close:del */
1146           { 0, 255 },
1147           /* old=crw, write:xxx, read:add, close:xxx */
1148           { 0, 255 },
1149           /* old=crw, write:xxx, read:del, close:  0 */
1150           { 0, 255 },
1151           /* old=crw, write:xxx, read:del, close:add */
1152           { 0, 255 },
1153           /* old=crw, write:xxx, read:del, close:del */
1154           { 0, 255 },
1155           /* old=crw, write:xxx, read:del, close:xxx */
1156           { 0, 255 },
1157           /* old=crw, write:xxx, read:xxx, close:  0 */
1158           { 0, 255 },
1159           /* old=crw, write:xxx, read:xxx, close:add */
1160           { 0, 255 },
1161           /* old=crw, write:xxx, read:xxx, close:del */
1162           { 0, 255 },
1163           /* old=crw, write:xxx, read:xxx, close:xxx */
1164           { 0, 255 },
1165 };
1166 
1167 #endif
1168