1*824ce2deSPedro F. Giffuni /*- 2*824ce2deSPedro F. Giffuni * SPDX-License-Identifier: ISC 3*824ce2deSPedro F. Giffuni * 465e96449SHajimu UMEMOTO * Copyright (c) 2005 by Internet Systems Consortium, Inc. ("ISC") 565e96449SHajimu UMEMOTO * Copyright (c) 1995-1999 by Internet Software Consortium 665e96449SHajimu UMEMOTO * 765e96449SHajimu UMEMOTO * Permission to use, copy, modify, and distribute this software for any 865e96449SHajimu UMEMOTO * purpose with or without fee is hereby granted, provided that the above 965e96449SHajimu UMEMOTO * copyright notice and this permission notice appear in all copies. 1065e96449SHajimu UMEMOTO * 1165e96449SHajimu UMEMOTO * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 1265e96449SHajimu UMEMOTO * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1365e96449SHajimu UMEMOTO * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 1465e96449SHajimu UMEMOTO * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1565e96449SHajimu UMEMOTO * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1665e96449SHajimu UMEMOTO * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 1765e96449SHajimu UMEMOTO * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1865e96449SHajimu UMEMOTO */ 1965e96449SHajimu UMEMOTO 20dde4a85dSHajimu UMEMOTO /*! \file 21dde4a85dSHajimu UMEMOTO * \brief private interfaces for eventlib 22dde4a85dSHajimu UMEMOTO * \author vix 09sep95 [initial] 2365e96449SHajimu UMEMOTO * 24046c3635SPedro F. Giffuni * $Id: eventlib_p.h,v 1.9 2006/03/09 23:57:56 marka Exp $ 2565e96449SHajimu UMEMOTO */ 2665e96449SHajimu UMEMOTO 2765e96449SHajimu UMEMOTO #ifndef _EVENTLIB_P_H 2865e96449SHajimu UMEMOTO #define _EVENTLIB_P_H 2965e96449SHajimu UMEMOTO 3065e96449SHajimu UMEMOTO #include <sys/param.h> 3165e96449SHajimu UMEMOTO #include <sys/socket.h> 3265e96449SHajimu UMEMOTO #include <netinet/in.h> 3365e96449SHajimu UMEMOTO #include <sys/un.h> 3465e96449SHajimu UMEMOTO 3565e96449SHajimu UMEMOTO #define EVENTLIB_DEBUG 1 3665e96449SHajimu UMEMOTO 3765e96449SHajimu UMEMOTO #include <errno.h> 3865e96449SHajimu UMEMOTO #include <fcntl.h> 3965e96449SHajimu UMEMOTO #include <stdio.h> 4065e96449SHajimu UMEMOTO #include <stdlib.h> 4165e96449SHajimu UMEMOTO #include <string.h> 4265e96449SHajimu UMEMOTO 43ab96eeabSHajimu UMEMOTO #ifndef _LIBC 4465e96449SHajimu UMEMOTO #include <isc/list.h> 45ab96eeabSHajimu UMEMOTO #include <isc/heap.h> 4665e96449SHajimu UMEMOTO #include <isc/memcluster.h> 47ab96eeabSHajimu UMEMOTO #endif 4865e96449SHajimu UMEMOTO 4965e96449SHajimu UMEMOTO #define EV_MASK_ALL (EV_READ | EV_WRITE | EV_EXCEPT) 5065e96449SHajimu UMEMOTO #define EV_ERR(e) return (errno = (e), -1) 5165e96449SHajimu UMEMOTO #define OK(x) if ((x) < 0) EV_ERR(errno); else (void)NULL 522cd19db2SHajimu UMEMOTO #define OKFREE(x, y) if ((x) < 0) { FREE((y)); EV_ERR(errno); } \ 532cd19db2SHajimu UMEMOTO else (void)NULL 5465e96449SHajimu UMEMOTO 5565e96449SHajimu UMEMOTO #define NEW(p) if (((p) = memget(sizeof *(p))) != NULL) \ 5665e96449SHajimu UMEMOTO FILL(p); \ 5765e96449SHajimu UMEMOTO else \ 5865e96449SHajimu UMEMOTO (void)NULL; 5965e96449SHajimu UMEMOTO #define OKNEW(p) if (!((p) = memget(sizeof *(p)))) { \ 6065e96449SHajimu UMEMOTO errno = ENOMEM; \ 6165e96449SHajimu UMEMOTO return (-1); \ 6265e96449SHajimu UMEMOTO } else \ 6365e96449SHajimu UMEMOTO FILL(p) 6465e96449SHajimu UMEMOTO #define FREE(p) memput((p), sizeof *(p)) 6565e96449SHajimu UMEMOTO 6665e96449SHajimu UMEMOTO #if EVENTLIB_DEBUG 6765e96449SHajimu UMEMOTO #define FILL(p) memset((p), 0xF5, sizeof *(p)) 6865e96449SHajimu UMEMOTO #else 6965e96449SHajimu UMEMOTO #define FILL(p) 7065e96449SHajimu UMEMOTO #endif 7165e96449SHajimu UMEMOTO 7265e96449SHajimu UMEMOTO #ifdef USE_POLL 7365e96449SHajimu UMEMOTO #ifdef HAVE_STROPTS_H 7465e96449SHajimu UMEMOTO #include <stropts.h> 7565e96449SHajimu UMEMOTO #endif 7665e96449SHajimu UMEMOTO #include <poll.h> 7765e96449SHajimu UMEMOTO #endif /* USE_POLL */ 7865e96449SHajimu UMEMOTO 7965e96449SHajimu UMEMOTO typedef struct evConn { 8065e96449SHajimu UMEMOTO evConnFunc func; 8165e96449SHajimu UMEMOTO void * uap; 8265e96449SHajimu UMEMOTO int fd; 8365e96449SHajimu UMEMOTO int flags; 84dde4a85dSHajimu UMEMOTO #define EV_CONN_LISTEN 0x0001 /*%< Connection is a listener. */ 85dde4a85dSHajimu UMEMOTO #define EV_CONN_SELECTED 0x0002 /*%< evSelectFD(conn->file). */ 86dde4a85dSHajimu UMEMOTO #define EV_CONN_BLOCK 0x0004 /*%< Listener fd was blocking. */ 8765e96449SHajimu UMEMOTO evFileID file; 8865e96449SHajimu UMEMOTO struct evConn * prev; 8965e96449SHajimu UMEMOTO struct evConn * next; 9065e96449SHajimu UMEMOTO } evConn; 9165e96449SHajimu UMEMOTO 92ab96eeabSHajimu UMEMOTO #ifndef _LIBC 9365e96449SHajimu UMEMOTO typedef struct evAccept { 9465e96449SHajimu UMEMOTO int fd; 9565e96449SHajimu UMEMOTO union { 9665e96449SHajimu UMEMOTO struct sockaddr sa; 9765e96449SHajimu UMEMOTO struct sockaddr_in in; 9865e96449SHajimu UMEMOTO #ifndef NO_SOCKADDR_UN 9965e96449SHajimu UMEMOTO struct sockaddr_un un; 10065e96449SHajimu UMEMOTO #endif 10165e96449SHajimu UMEMOTO } la; 10265e96449SHajimu UMEMOTO ISC_SOCKLEN_T lalen; 10365e96449SHajimu UMEMOTO union { 10465e96449SHajimu UMEMOTO struct sockaddr sa; 10565e96449SHajimu UMEMOTO struct sockaddr_in in; 10665e96449SHajimu UMEMOTO #ifndef NO_SOCKADDR_UN 10765e96449SHajimu UMEMOTO struct sockaddr_un un; 10865e96449SHajimu UMEMOTO #endif 10965e96449SHajimu UMEMOTO } ra; 11065e96449SHajimu UMEMOTO ISC_SOCKLEN_T ralen; 11165e96449SHajimu UMEMOTO int ioErrno; 11265e96449SHajimu UMEMOTO evConn * conn; 11365e96449SHajimu UMEMOTO LINK(struct evAccept) link; 11465e96449SHajimu UMEMOTO } evAccept; 11565e96449SHajimu UMEMOTO 11665e96449SHajimu UMEMOTO typedef struct evFile { 11765e96449SHajimu UMEMOTO evFileFunc func; 11865e96449SHajimu UMEMOTO void * uap; 11965e96449SHajimu UMEMOTO int fd; 12065e96449SHajimu UMEMOTO int eventmask; 12165e96449SHajimu UMEMOTO int preemptive; 12265e96449SHajimu UMEMOTO struct evFile * prev; 12365e96449SHajimu UMEMOTO struct evFile * next; 12465e96449SHajimu UMEMOTO struct evFile * fdprev; 12565e96449SHajimu UMEMOTO struct evFile * fdnext; 12665e96449SHajimu UMEMOTO } evFile; 12765e96449SHajimu UMEMOTO 12865e96449SHajimu UMEMOTO typedef struct evStream { 12965e96449SHajimu UMEMOTO evStreamFunc func; 13065e96449SHajimu UMEMOTO void * uap; 13165e96449SHajimu UMEMOTO evFileID file; 13265e96449SHajimu UMEMOTO evTimerID timer; 13365e96449SHajimu UMEMOTO int flags; 134dde4a85dSHajimu UMEMOTO #define EV_STR_TIMEROK 0x0001 /*%< IFF timer valid. */ 13565e96449SHajimu UMEMOTO int fd; 13665e96449SHajimu UMEMOTO struct iovec * iovOrig; 13765e96449SHajimu UMEMOTO int iovOrigCount; 13865e96449SHajimu UMEMOTO struct iovec * iovCur; 13965e96449SHajimu UMEMOTO int iovCurCount; 14065e96449SHajimu UMEMOTO int ioTotal; 14165e96449SHajimu UMEMOTO int ioDone; 14265e96449SHajimu UMEMOTO int ioErrno; 14365e96449SHajimu UMEMOTO struct evStream *prevDone, *nextDone; 14465e96449SHajimu UMEMOTO struct evStream *prev, *next; 14565e96449SHajimu UMEMOTO } evStream; 14665e96449SHajimu UMEMOTO 14765e96449SHajimu UMEMOTO typedef struct evTimer { 14865e96449SHajimu UMEMOTO evTimerFunc func; 14965e96449SHajimu UMEMOTO void * uap; 15065e96449SHajimu UMEMOTO struct timespec due, inter; 15165e96449SHajimu UMEMOTO int index; 15265e96449SHajimu UMEMOTO int mode; 15365e96449SHajimu UMEMOTO #define EV_TMR_RATE 1 15465e96449SHajimu UMEMOTO } evTimer; 15565e96449SHajimu UMEMOTO 15665e96449SHajimu UMEMOTO typedef struct evWait { 15765e96449SHajimu UMEMOTO evWaitFunc func; 15865e96449SHajimu UMEMOTO void * uap; 15965e96449SHajimu UMEMOTO const void * tag; 16065e96449SHajimu UMEMOTO struct evWait * next; 16165e96449SHajimu UMEMOTO } evWait; 16265e96449SHajimu UMEMOTO 16365e96449SHajimu UMEMOTO typedef struct evWaitList { 16465e96449SHajimu UMEMOTO evWait * first; 16565e96449SHajimu UMEMOTO evWait * last; 16665e96449SHajimu UMEMOTO struct evWaitList * prev; 16765e96449SHajimu UMEMOTO struct evWaitList * next; 16865e96449SHajimu UMEMOTO } evWaitList; 16965e96449SHajimu UMEMOTO 17065e96449SHajimu UMEMOTO typedef struct evEvent_p { 17165e96449SHajimu UMEMOTO enum { Accept, File, Stream, Timer, Wait, Free, Null } type; 17265e96449SHajimu UMEMOTO union { 17365e96449SHajimu UMEMOTO struct { evAccept *this; } accept; 17465e96449SHajimu UMEMOTO struct { evFile *this; int eventmask; } file; 17565e96449SHajimu UMEMOTO struct { evStream *this; } stream; 17665e96449SHajimu UMEMOTO struct { evTimer *this; } timer; 17765e96449SHajimu UMEMOTO struct { evWait *this; } wait; 17865e96449SHajimu UMEMOTO struct { struct evEvent_p *next; } free; 17965e96449SHajimu UMEMOTO struct { const void *placeholder; } null; 18065e96449SHajimu UMEMOTO } u; 18165e96449SHajimu UMEMOTO } evEvent_p; 182ab96eeabSHajimu UMEMOTO #endif 18365e96449SHajimu UMEMOTO 18465e96449SHajimu UMEMOTO #ifdef USE_POLL 18565e96449SHajimu UMEMOTO typedef struct { 18665e96449SHajimu UMEMOTO void *ctx; /* pointer to the evContext_p */ 18765e96449SHajimu UMEMOTO uint32_t type; /* READ, WRITE, EXCEPT, nonblk */ 18865e96449SHajimu UMEMOTO uint32_t result; /* 1 => revents, 0 => events */ 18965e96449SHajimu UMEMOTO } __evEmulMask; 19065e96449SHajimu UMEMOTO 19165e96449SHajimu UMEMOTO #define emulMaskInit(ctx, field, ev, lastnext) \ 19265e96449SHajimu UMEMOTO ctx->field.ctx = ctx; \ 19365e96449SHajimu UMEMOTO ctx->field.type = ev; \ 19465e96449SHajimu UMEMOTO ctx->field.result = lastnext; 19565e96449SHajimu UMEMOTO 19665e96449SHajimu UMEMOTO extern short *__fd_eventfield(int fd, __evEmulMask *maskp); 19765e96449SHajimu UMEMOTO extern short __poll_event(__evEmulMask *maskp); 19865e96449SHajimu UMEMOTO extern void __fd_clr(int fd, __evEmulMask *maskp); 19965e96449SHajimu UMEMOTO extern void __fd_set(int fd, __evEmulMask *maskp); 20065e96449SHajimu UMEMOTO 20165e96449SHajimu UMEMOTO #undef FD_ZERO 20265e96449SHajimu UMEMOTO #define FD_ZERO(maskp) 20365e96449SHajimu UMEMOTO 20465e96449SHajimu UMEMOTO #undef FD_SET 20565e96449SHajimu UMEMOTO #define FD_SET(fd, maskp) \ 20665e96449SHajimu UMEMOTO __fd_set(fd, maskp) 20765e96449SHajimu UMEMOTO 20865e96449SHajimu UMEMOTO #undef FD_CLR 20965e96449SHajimu UMEMOTO #define FD_CLR(fd, maskp) \ 21065e96449SHajimu UMEMOTO __fd_clr(fd, maskp) 21165e96449SHajimu UMEMOTO 21265e96449SHajimu UMEMOTO #undef FD_ISSET 21365e96449SHajimu UMEMOTO #define FD_ISSET(fd, maskp) \ 21465e96449SHajimu UMEMOTO ((*__fd_eventfield(fd, maskp) & __poll_event(maskp)) != 0) 21565e96449SHajimu UMEMOTO 21665e96449SHajimu UMEMOTO #endif /* USE_POLL */ 21765e96449SHajimu UMEMOTO 218ab96eeabSHajimu UMEMOTO #ifndef _LIBC 21965e96449SHajimu UMEMOTO typedef struct { 22065e96449SHajimu UMEMOTO /* Global. */ 22165e96449SHajimu UMEMOTO const evEvent_p *cur; 22265e96449SHajimu UMEMOTO /* Debugging. */ 22365e96449SHajimu UMEMOTO int debug; 22465e96449SHajimu UMEMOTO FILE *output; 22565e96449SHajimu UMEMOTO /* Connections. */ 22665e96449SHajimu UMEMOTO evConn *conns; 22765e96449SHajimu UMEMOTO LIST(evAccept) accepts; 22865e96449SHajimu UMEMOTO /* Files. */ 22965e96449SHajimu UMEMOTO evFile *files, *fdNext; 23065e96449SHajimu UMEMOTO #ifndef USE_POLL 23165e96449SHajimu UMEMOTO fd_set rdLast, rdNext; 23265e96449SHajimu UMEMOTO fd_set wrLast, wrNext; 23365e96449SHajimu UMEMOTO fd_set exLast, exNext; 23465e96449SHajimu UMEMOTO fd_set nonblockBefore; 23565e96449SHajimu UMEMOTO int fdMax, fdCount, highestFD; 23665e96449SHajimu UMEMOTO evFile *fdTable[FD_SETSIZE]; 23765e96449SHajimu UMEMOTO #else 23865e96449SHajimu UMEMOTO struct pollfd *pollfds; /* Allocated as needed */ 23965e96449SHajimu UMEMOTO evFile **fdTable; /* Ditto */ 24065e96449SHajimu UMEMOTO int maxnfds; /* # elements in above */ 24165e96449SHajimu UMEMOTO int firstfd; /* First active fd */ 24265e96449SHajimu UMEMOTO int fdMax; /* Last active fd */ 24365e96449SHajimu UMEMOTO int fdCount; /* # fd:s with I/O */ 24465e96449SHajimu UMEMOTO int highestFD; /* max fd allowed by OS */ 24565e96449SHajimu UMEMOTO __evEmulMask rdLast, rdNext; 24665e96449SHajimu UMEMOTO __evEmulMask wrLast, wrNext; 24765e96449SHajimu UMEMOTO __evEmulMask exLast, exNext; 24865e96449SHajimu UMEMOTO __evEmulMask nonblockBefore; 24965e96449SHajimu UMEMOTO #endif /* USE_POLL */ 25065e96449SHajimu UMEMOTO #ifdef EVENTLIB_TIME_CHECKS 25165e96449SHajimu UMEMOTO struct timespec lastSelectTime; 25265e96449SHajimu UMEMOTO int lastFdCount; 25365e96449SHajimu UMEMOTO #endif 25465e96449SHajimu UMEMOTO /* Streams. */ 25565e96449SHajimu UMEMOTO evStream *streams; 25665e96449SHajimu UMEMOTO evStream *strDone, *strLast; 25765e96449SHajimu UMEMOTO /* Timers. */ 25865e96449SHajimu UMEMOTO struct timespec lastEventTime; 25965e96449SHajimu UMEMOTO heap_context timers; 26065e96449SHajimu UMEMOTO /* Waits. */ 26165e96449SHajimu UMEMOTO evWaitList *waitLists; 26265e96449SHajimu UMEMOTO evWaitList waitDone; 26365e96449SHajimu UMEMOTO } evContext_p; 26465e96449SHajimu UMEMOTO 26565e96449SHajimu UMEMOTO /* eventlib.c */ 26665e96449SHajimu UMEMOTO #define evPrintf __evPrintf 26765e96449SHajimu UMEMOTO void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...) 26865e96449SHajimu UMEMOTO ISC_FORMAT_PRINTF(3, 4); 26965e96449SHajimu UMEMOTO 27065e96449SHajimu UMEMOTO #ifdef USE_POLL 27165e96449SHajimu UMEMOTO extern int evPollfdRealloc(evContext_p *ctx, int pollfd_chunk_size, int fd); 27265e96449SHajimu UMEMOTO #endif /* USE_POLL */ 27365e96449SHajimu UMEMOTO 27465e96449SHajimu UMEMOTO /* ev_timers.c */ 27565e96449SHajimu UMEMOTO #define evCreateTimers __evCreateTimers 27665e96449SHajimu UMEMOTO heap_context evCreateTimers(const evContext_p *); 27765e96449SHajimu UMEMOTO #define evDestroyTimers __evDestroyTimers 27865e96449SHajimu UMEMOTO void evDestroyTimers(const evContext_p *); 27965e96449SHajimu UMEMOTO 28065e96449SHajimu UMEMOTO /* ev_waits.c */ 28165e96449SHajimu UMEMOTO #define evFreeWait __evFreeWait 28265e96449SHajimu UMEMOTO evWait *evFreeWait(evContext_p *ctx, evWait *old); 283ab96eeabSHajimu UMEMOTO #endif 28465e96449SHajimu UMEMOTO 28565e96449SHajimu UMEMOTO /* Global options */ 286714b79b9SAlexander Kabaev #ifndef _LIBC 28765e96449SHajimu UMEMOTO extern int __evOptMonoTime; 288714b79b9SAlexander Kabaev #endif 28965e96449SHajimu UMEMOTO 29065e96449SHajimu UMEMOTO #endif /*_EVENTLIB_P_H*/ 291