Merge from vendor branch FILE:
[dragonfly.git] / contrib / bind-9.3 / lib / bind / isc / eventlib_p.h
1 /*
2  * Copyright (c) 2005 by Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (c) 1995-1999 by Internet Software Consortium
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /* eventlib_p.h - private interfaces for eventlib
19  * vix 09sep95 [initial]
20  *
21  * $Id: eventlib_p.h,v 1.3.2.1.4.3 2005/07/28 07:43:20 marka Exp $
22  */
23
24 #ifndef _EVENTLIB_P_H
25 #define _EVENTLIB_P_H
26
27 #include <sys/param.h>
28 #include <sys/types.h>
29 #include <sys/socket.h>
30 #include <netinet/in.h>
31 #include <sys/un.h>
32
33 #define EVENTLIB_DEBUG 1
34
35 #include <errno.h>
36 #include <fcntl.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40
41 #include <isc/heap.h>
42 #include <isc/list.h>
43 #include <isc/memcluster.h>
44
45 #define EV_MASK_ALL     (EV_READ | EV_WRITE | EV_EXCEPT)
46 #define EV_ERR(e)               return (errno = (e), -1)
47 #define OK(x)           if ((x) < 0) EV_ERR(errno); else (void)NULL
48
49 #define NEW(p)          if (((p) = memget(sizeof *(p))) != NULL) \
50                                 FILL(p); \
51                         else \
52                                 (void)NULL;
53 #define OKNEW(p)        if (!((p) = memget(sizeof *(p)))) { \
54                                 errno = ENOMEM; \
55                                 return (-1); \
56                         } else \
57                                 FILL(p)
58 #define FREE(p)         memput((p), sizeof *(p))
59
60 #if EVENTLIB_DEBUG
61 #define FILL(p)         memset((p), 0xF5, sizeof *(p))
62 #else
63 #define FILL(p)
64 #endif
65
66 #ifdef USE_POLL
67 #ifdef HAVE_STROPTS_H
68 #include <stropts.h>
69 #endif
70 #include <poll.h>
71 #endif /* USE_POLL */
72
73 typedef struct evConn {
74         evConnFunc      func;
75         void *          uap;
76         int             fd;
77         int             flags;
78 #define EV_CONN_LISTEN          0x0001          /* Connection is a listener. */
79 #define EV_CONN_SELECTED        0x0002          /* evSelectFD(conn->file). */
80 #define EV_CONN_BLOCK           0x0004          /* Listener fd was blocking. */
81         evFileID        file;
82         struct evConn * prev;
83         struct evConn * next;
84 } evConn;
85
86 typedef struct evAccept {
87         int             fd;
88         union {
89                 struct sockaddr         sa;
90                 struct sockaddr_in      in;
91 #ifndef NO_SOCKADDR_UN
92                 struct sockaddr_un      un;
93 #endif
94         }               la;
95         ISC_SOCKLEN_T   lalen;
96         union {
97                 struct sockaddr         sa;
98                 struct sockaddr_in      in;
99 #ifndef NO_SOCKADDR_UN
100                 struct sockaddr_un      un;
101 #endif
102         }               ra;
103         ISC_SOCKLEN_T   ralen;
104         int             ioErrno;
105         evConn *        conn;
106         LINK(struct evAccept) link;
107 } evAccept;
108
109 typedef struct evFile {
110         evFileFunc      func;
111         void *          uap;
112         int             fd;
113         int             eventmask;
114         int             preemptive;
115         struct evFile * prev;
116         struct evFile * next;
117         struct evFile * fdprev;
118         struct evFile * fdnext;
119 } evFile;
120
121 typedef struct evStream {
122         evStreamFunc    func;
123         void *          uap;
124         evFileID        file;
125         evTimerID       timer;
126         int             flags;
127 #define EV_STR_TIMEROK  0x0001  /* IFF timer valid. */
128         int             fd;
129         struct iovec *  iovOrig;
130         int             iovOrigCount;
131         struct iovec *  iovCur;
132         int             iovCurCount;
133         int             ioTotal;
134         int             ioDone;
135         int             ioErrno;
136         struct evStream *prevDone, *nextDone;
137         struct evStream *prev, *next;
138 } evStream;
139
140 typedef struct evTimer {
141         evTimerFunc     func;
142         void *          uap;
143         struct timespec due, inter;
144         int             index;
145         int             mode;
146 #define EV_TMR_RATE     1
147 } evTimer;
148
149 typedef struct evWait {
150         evWaitFunc      func;
151         void *          uap;
152         const void *    tag;
153         struct evWait * next;
154 } evWait;
155
156 typedef struct evWaitList {
157         evWait *                first;
158         evWait *                last;
159         struct evWaitList *     prev;
160         struct evWaitList *     next;
161 } evWaitList;
162
163 typedef struct evEvent_p {
164         enum {  Accept, File, Stream, Timer, Wait, Free, Null  } type;
165         union {
166                 struct {  evAccept *this;  }                    accept;
167                 struct {  evFile *this; int eventmask;  }       file;
168                 struct {  evStream *this;  }                    stream;
169                 struct {  evTimer *this;  }                     timer;
170                 struct {  evWait *this;  }                      wait;
171                 struct {  struct evEvent_p *next;  }            free;
172                 struct {  const void *placeholder;  }           null;
173         } u;
174 } evEvent_p;
175
176 #ifdef USE_POLL
177 typedef struct { 
178         void            *ctx;   /* pointer to the evContext_p   */ 
179         uint32_t        type;   /* READ, WRITE, EXCEPT, nonblk  */ 
180         uint32_t        result; /* 1 => revents, 0 => events    */ 
181 } __evEmulMask; 
182
183 #define emulMaskInit(ctx, field, ev, lastnext) \
184         ctx->field.ctx = ctx; \
185         ctx->field.type = ev; \
186         ctx->field.result = lastnext; 
187   
188 extern short    *__fd_eventfield(int fd, __evEmulMask *maskp); 
189 extern short    __poll_event(__evEmulMask *maskp); 
190 extern void             __fd_clr(int fd, __evEmulMask *maskp); 
191 extern void             __fd_set(int fd, __evEmulMask *maskp); 
192
193 #undef  FD_ZERO 
194 #define FD_ZERO(maskp) 
195   
196 #undef  FD_SET 
197 #define FD_SET(fd, maskp) \
198         __fd_set(fd, maskp) 
199
200 #undef  FD_CLR 
201 #define FD_CLR(fd, maskp) \
202         __fd_clr(fd, maskp) 
203
204 #undef  FD_ISSET 
205 #define FD_ISSET(fd, maskp) \
206         ((*__fd_eventfield(fd, maskp) & __poll_event(maskp)) != 0) 
207
208 #endif /* USE_POLL */
209
210 typedef struct {
211         /* Global. */
212         const evEvent_p *cur;
213         /* Debugging. */
214         int             debug;
215         FILE            *output;
216         /* Connections. */
217         evConn          *conns;
218         LIST(evAccept)  accepts;
219         /* Files. */
220         evFile          *files, *fdNext;
221 #ifndef USE_POLL
222         fd_set          rdLast, rdNext;
223         fd_set          wrLast, wrNext;
224         fd_set          exLast, exNext;
225         fd_set          nonblockBefore;
226         int             fdMax, fdCount, highestFD;
227         evFile          *fdTable[FD_SETSIZE];
228 #else
229         struct pollfd   *pollfds;       /* Allocated as needed  */ 
230         evFile          **fdTable;      /* Ditto                */ 
231         int             maxnfds;        /* # elements in above  */ 
232         int             firstfd;        /* First active fd      */ 
233         int             fdMax;          /* Last active fd       */ 
234         int             fdCount;        /* # fd:s with I/O      */ 
235         int             highestFD;      /* max fd allowed by OS */ 
236         __evEmulMask    rdLast, rdNext; 
237         __evEmulMask    wrLast, wrNext; 
238         __evEmulMask    exLast, exNext; 
239         __evEmulMask    nonblockBefore; 
240 #endif /* USE_POLL */
241 #ifdef EVENTLIB_TIME_CHECKS
242         struct timespec lastSelectTime;
243         int             lastFdCount;
244 #endif
245         /* Streams. */
246         evStream        *streams;
247         evStream        *strDone, *strLast;
248         /* Timers. */
249         struct timespec lastEventTime;
250         heap_context    timers;
251         /* Waits. */
252         evWaitList      *waitLists;
253         evWaitList      waitDone;
254 } evContext_p;
255
256 /* eventlib.c */
257 #define evPrintf __evPrintf
258 void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...)
259      ISC_FORMAT_PRINTF(3, 4);
260
261 #ifdef USE_POLL
262 extern int evPollfdRealloc(evContext_p *ctx, int pollfd_chunk_size, int fd);
263 #endif /* USE_POLL */
264
265 /* ev_timers.c */
266 #define evCreateTimers __evCreateTimers
267 heap_context evCreateTimers(const evContext_p *);
268 #define evDestroyTimers __evDestroyTimers
269 void evDestroyTimers(const evContext_p *);
270
271 /* ev_waits.c */
272 #define evFreeWait __evFreeWait
273 evWait *evFreeWait(evContext_p *ctx, evWait *old);
274
275 /* Global options */
276 extern int      __evOptMonoTime;
277
278 #endif /*_EVENTLIB_P_H*/