1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * Copyright 1997-2002 Sun Microsystems, Inc.  All rights reserved.
3*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
4*7c478bd9Sstevel@tonic-gate  */
5*7c478bd9Sstevel@tonic-gate 
6*7c478bd9Sstevel@tonic-gate /*
7*7c478bd9Sstevel@tonic-gate  * Copyright (c) 1995-1999 by Internet Software Consortium
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * Permission to use, copy, modify, and distribute this software for any
10*7c478bd9Sstevel@tonic-gate  * purpose with or without fee is hereby granted, provided that the above
11*7c478bd9Sstevel@tonic-gate  * copyright notice and this permission notice appear in all copies.
12*7c478bd9Sstevel@tonic-gate  *
13*7c478bd9Sstevel@tonic-gate  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
14*7c478bd9Sstevel@tonic-gate  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
15*7c478bd9Sstevel@tonic-gate  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
16*7c478bd9Sstevel@tonic-gate  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
17*7c478bd9Sstevel@tonic-gate  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
18*7c478bd9Sstevel@tonic-gate  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
19*7c478bd9Sstevel@tonic-gate  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20*7c478bd9Sstevel@tonic-gate  * SOFTWARE.
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate 
23*7c478bd9Sstevel@tonic-gate /* eventlib.h - exported interfaces for eventlib
24*7c478bd9Sstevel@tonic-gate  * vix 09sep95 [initial]
25*7c478bd9Sstevel@tonic-gate  *
26*7c478bd9Sstevel@tonic-gate  * $Id: eventlib.h,v 1.23 2001/05/29 05:47:09 marka Exp $
27*7c478bd9Sstevel@tonic-gate  */
28*7c478bd9Sstevel@tonic-gate 
29*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*7c478bd9Sstevel@tonic-gate 
31*7c478bd9Sstevel@tonic-gate #ifndef _EVENTLIB_H
32*7c478bd9Sstevel@tonic-gate #define _EVENTLIB_H
33*7c478bd9Sstevel@tonic-gate 
34*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
35*7c478bd9Sstevel@tonic-gate #include <sys/uio.h>
36*7c478bd9Sstevel@tonic-gate #include <sys/time.h>
37*7c478bd9Sstevel@tonic-gate #include <stdio.h>
38*7c478bd9Sstevel@tonic-gate 
39*7c478bd9Sstevel@tonic-gate #ifndef __P
40*7c478bd9Sstevel@tonic-gate # define __EVENTLIB_P_DEFINED
41*7c478bd9Sstevel@tonic-gate # ifdef __STDC__
42*7c478bd9Sstevel@tonic-gate #  define __P(x) x
43*7c478bd9Sstevel@tonic-gate # else
44*7c478bd9Sstevel@tonic-gate #  define __P(x) ()
45*7c478bd9Sstevel@tonic-gate # endif
46*7c478bd9Sstevel@tonic-gate #endif
47*7c478bd9Sstevel@tonic-gate 
48*7c478bd9Sstevel@tonic-gate /* In the absence of branded types... */
49*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evConnID;
50*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evFileID;
51*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evStreamID;
52*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evTimerID;
53*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evWaitID;
54*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evContext;
55*7c478bd9Sstevel@tonic-gate typedef struct { void *opaque; } evEvent;
56*7c478bd9Sstevel@tonic-gate 
57*7c478bd9Sstevel@tonic-gate #define	evInitID(id) ((id)->opaque = NULL)
58*7c478bd9Sstevel@tonic-gate #define	evTestID(id) ((id).opaque != NULL)
59*7c478bd9Sstevel@tonic-gate 
60*7c478bd9Sstevel@tonic-gate typedef void (*evConnFunc)__P((evContext ctx, void *uap, int fd,
61*7c478bd9Sstevel@tonic-gate 			       const void *la, int lalen,
62*7c478bd9Sstevel@tonic-gate 			       const void *ra, int ralen));
63*7c478bd9Sstevel@tonic-gate typedef void (*evFileFunc)__P((evContext ctx, void *uap, int fd, int evmask));
64*7c478bd9Sstevel@tonic-gate typedef	void (*evStreamFunc)__P((evContext ctx, void *uap, int fd, int bytes));
65*7c478bd9Sstevel@tonic-gate typedef void (*evTimerFunc)__P((evContext ctx, void *uap,
66*7c478bd9Sstevel@tonic-gate 				struct timespec due, struct timespec inter));
67*7c478bd9Sstevel@tonic-gate typedef	void (*evWaitFunc)__P((evContext ctx, void *uap, const void *tag));
68*7c478bd9Sstevel@tonic-gate 
69*7c478bd9Sstevel@tonic-gate typedef	struct { unsigned char mask[256/8]; } evByteMask;
70*7c478bd9Sstevel@tonic-gate #define	EV_BYTEMASK_BYTE(b) ((b) / 8)
71*7c478bd9Sstevel@tonic-gate #define	EV_BYTEMASK_MASK(b) (1 << ((b) % 8))
72*7c478bd9Sstevel@tonic-gate #define	EV_BYTEMASK_SET(bm, b) \
73*7c478bd9Sstevel@tonic-gate 	((bm).mask[EV_BYTEMASK_BYTE(b)] |= EV_BYTEMASK_MASK(b))
74*7c478bd9Sstevel@tonic-gate #define	EV_BYTEMASK_CLR(bm, b) \
75*7c478bd9Sstevel@tonic-gate 	((bm).mask[EV_BYTEMASK_BYTE(b)] &= ~EV_BYTEMASK_MASK(b))
76*7c478bd9Sstevel@tonic-gate #define	EV_BYTEMASK_TST(bm, b) \
77*7c478bd9Sstevel@tonic-gate 	((bm).mask[EV_BYTEMASK_BYTE(b)] & EV_BYTEMASK_MASK(b))
78*7c478bd9Sstevel@tonic-gate 
79*7c478bd9Sstevel@tonic-gate #define	EV_POLL		1
80*7c478bd9Sstevel@tonic-gate #define	EV_WAIT		2
81*7c478bd9Sstevel@tonic-gate #define	EV_NULL		4
82*7c478bd9Sstevel@tonic-gate 
83*7c478bd9Sstevel@tonic-gate #define	EV_READ		1
84*7c478bd9Sstevel@tonic-gate #define	EV_WRITE	2
85*7c478bd9Sstevel@tonic-gate #define	EV_EXCEPT	4
86*7c478bd9Sstevel@tonic-gate 
87*7c478bd9Sstevel@tonic-gate /* eventlib.c */
88*7c478bd9Sstevel@tonic-gate #define evCreate	__evCreate
89*7c478bd9Sstevel@tonic-gate #define evSetDebug	__evSetDebug
90*7c478bd9Sstevel@tonic-gate #define evDestroy	__evDestroy
91*7c478bd9Sstevel@tonic-gate #define evGetNext	__evGetNext
92*7c478bd9Sstevel@tonic-gate #define evDispatch	__evDispatch
93*7c478bd9Sstevel@tonic-gate #define evDrop		__evDrop
94*7c478bd9Sstevel@tonic-gate #define evMainLoop	__evMainLoop
95*7c478bd9Sstevel@tonic-gate #define evHighestFD	__evHighestFD
96*7c478bd9Sstevel@tonic-gate 
97*7c478bd9Sstevel@tonic-gate int  evCreate __P((evContext *ctx));
98*7c478bd9Sstevel@tonic-gate void evSetDebug __P((evContext ctx, int lev, FILE *out));
99*7c478bd9Sstevel@tonic-gate int  evDestroy __P((evContext ctx));
100*7c478bd9Sstevel@tonic-gate int  evGetNext __P((evContext ctx, evEvent *ev, int options));
101*7c478bd9Sstevel@tonic-gate int  evDispatch __P((evContext ctx, evEvent ev));
102*7c478bd9Sstevel@tonic-gate void evDrop __P((evContext ctx, evEvent ev));
103*7c478bd9Sstevel@tonic-gate int  evMainLoop __P((evContext ctx));
104*7c478bd9Sstevel@tonic-gate int  evHighestFD __P((evContext ctx));
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate #ifdef	SUNW_POLL
107*7c478bd9Sstevel@tonic-gate extern void evPollfdAdd(evContext ctx, int pollfd_chunk_size, int fd,
108*7c478bd9Sstevel@tonic-gate 					short events);
109*7c478bd9Sstevel@tonic-gate extern void evPollfdDel(evContext ctx, int fd);
110*7c478bd9Sstevel@tonic-gate #endif	/* SUNW_POLL */
111*7c478bd9Sstevel@tonic-gate 
112*7c478bd9Sstevel@tonic-gate /* ev_connects.c */
113*7c478bd9Sstevel@tonic-gate #define evListen	__evListen
114*7c478bd9Sstevel@tonic-gate #define evConnect	__evConnect
115*7c478bd9Sstevel@tonic-gate #define evCancelConn	__evCancelConn
116*7c478bd9Sstevel@tonic-gate #define evHold		__evHold
117*7c478bd9Sstevel@tonic-gate #define evUnhold	__evUnhold
118*7c478bd9Sstevel@tonic-gate #define evTryAccept	__evTryAccept
119*7c478bd9Sstevel@tonic-gate 
120*7c478bd9Sstevel@tonic-gate int evListen __P((evContext ctx, int fd, int maxconn,
121*7c478bd9Sstevel@tonic-gate 		  evConnFunc func, void *uap, evConnID *id));
122*7c478bd9Sstevel@tonic-gate int evConnect __P((evContext ctx, int fd, const void *ra, int ralen,
123*7c478bd9Sstevel@tonic-gate 		   evConnFunc func, void *uap, evConnID *id));
124*7c478bd9Sstevel@tonic-gate int evCancelConn __P((evContext ctx, evConnID id));
125*7c478bd9Sstevel@tonic-gate int evHold __P((evContext, evConnID));
126*7c478bd9Sstevel@tonic-gate int evUnhold __P((evContext, evConnID));
127*7c478bd9Sstevel@tonic-gate int evTryAccept __P((evContext, evConnID, int *));
128*7c478bd9Sstevel@tonic-gate 
129*7c478bd9Sstevel@tonic-gate /* ev_files.c */
130*7c478bd9Sstevel@tonic-gate #define evSelectFD	__evSelectFD
131*7c478bd9Sstevel@tonic-gate #define evDeselectFD	__evDeselectFD
132*7c478bd9Sstevel@tonic-gate 
133*7c478bd9Sstevel@tonic-gate int evSelectFD __P((evContext ctx, int fd, int eventmask,
134*7c478bd9Sstevel@tonic-gate 		    evFileFunc func, void *uap, evFileID *id));
135*7c478bd9Sstevel@tonic-gate int evDeselectFD __P((evContext ctx, evFileID id));
136*7c478bd9Sstevel@tonic-gate 
137*7c478bd9Sstevel@tonic-gate /* ev_streams.c */
138*7c478bd9Sstevel@tonic-gate #define evConsIovec	__evConsIovec
139*7c478bd9Sstevel@tonic-gate #define evWrite		__evWrite
140*7c478bd9Sstevel@tonic-gate #define evRead		__evRead
141*7c478bd9Sstevel@tonic-gate #define evTimeRW	__evTimeRW
142*7c478bd9Sstevel@tonic-gate #define evUntimeRW	__evUntimeRW
143*7c478bd9Sstevel@tonic-gate #define	evCancelRW	__evCancelRW
144*7c478bd9Sstevel@tonic-gate 
145*7c478bd9Sstevel@tonic-gate struct iovec evConsIovec __P((void *buf, size_t cnt));
146*7c478bd9Sstevel@tonic-gate int evWrite __P((evContext ctx, int fd, const struct iovec *iov, int cnt,
147*7c478bd9Sstevel@tonic-gate 		 evStreamFunc func, void *uap, evStreamID *id));
148*7c478bd9Sstevel@tonic-gate int evRead __P((evContext ctx, int fd, const struct iovec *iov, int cnt,
149*7c478bd9Sstevel@tonic-gate 		evStreamFunc func, void *uap, evStreamID *id));
150*7c478bd9Sstevel@tonic-gate int evTimeRW __P((evContext ctx, evStreamID id, evTimerID timer));
151*7c478bd9Sstevel@tonic-gate int evUntimeRW __P((evContext ctx, evStreamID id));
152*7c478bd9Sstevel@tonic-gate int evCancelRW __P((evContext ctx, evStreamID id));
153*7c478bd9Sstevel@tonic-gate 
154*7c478bd9Sstevel@tonic-gate /* ev_timers.c */
155*7c478bd9Sstevel@tonic-gate #define evConsTime	__evConsTime
156*7c478bd9Sstevel@tonic-gate #define evAddTime	__evAddTime
157*7c478bd9Sstevel@tonic-gate #define evSubTime	__evSubTime
158*7c478bd9Sstevel@tonic-gate #define evCmpTime	__evCmpTime
159*7c478bd9Sstevel@tonic-gate #define	evTimeSpec	__evTimeSpec
160*7c478bd9Sstevel@tonic-gate #define	evTimeVal	__evTimeVal
161*7c478bd9Sstevel@tonic-gate 
162*7c478bd9Sstevel@tonic-gate #define evNowTime		__evNowTime
163*7c478bd9Sstevel@tonic-gate #define evLastEventTime		__evLastEventTime
164*7c478bd9Sstevel@tonic-gate #define evSetTimer		__evSetTimer
165*7c478bd9Sstevel@tonic-gate #define evClearTimer		__evClearTimer
166*7c478bd9Sstevel@tonic-gate #define evResetTimer		__evResetTimer
167*7c478bd9Sstevel@tonic-gate #define evSetIdleTimer		__evSetIdleTimer
168*7c478bd9Sstevel@tonic-gate #define evClearIdleTimer	__evClearIdleTimer
169*7c478bd9Sstevel@tonic-gate #define evResetIdleTimer	__evResetIdleTimer
170*7c478bd9Sstevel@tonic-gate #define evTouchIdleTimer	__evTouchIdleTimer
171*7c478bd9Sstevel@tonic-gate 
172*7c478bd9Sstevel@tonic-gate struct timespec evConsTime __P((time_t sec, long nsec));
173*7c478bd9Sstevel@tonic-gate struct timespec evAddTime __P((struct timespec add1, struct timespec add2));
174*7c478bd9Sstevel@tonic-gate struct timespec evSubTime __P((struct timespec minu, struct timespec subtra));
175*7c478bd9Sstevel@tonic-gate struct timespec evNowTime __P((void));
176*7c478bd9Sstevel@tonic-gate struct timespec evLastEventTime __P((evContext));
177*7c478bd9Sstevel@tonic-gate struct timespec evTimeSpec __P((struct timeval));
178*7c478bd9Sstevel@tonic-gate struct timeval evTimeVal __P((struct timespec));
179*7c478bd9Sstevel@tonic-gate int evCmpTime __P((struct timespec a, struct timespec b));
180*7c478bd9Sstevel@tonic-gate int evSetTimer __P((evContext ctx, evTimerFunc func, void *uap,
181*7c478bd9Sstevel@tonic-gate 		    struct timespec due, struct timespec inter,
182*7c478bd9Sstevel@tonic-gate 		    evTimerID *id));
183*7c478bd9Sstevel@tonic-gate int evClearTimer __P((evContext ctx, evTimerID id));
184*7c478bd9Sstevel@tonic-gate int evResetTimer __P((evContext, evTimerID, evTimerFunc, void *,
185*7c478bd9Sstevel@tonic-gate 		      struct timespec, struct timespec));
186*7c478bd9Sstevel@tonic-gate int evSetIdleTimer __P((evContext, evTimerFunc, void *, struct timespec,
187*7c478bd9Sstevel@tonic-gate 			evTimerID *));
188*7c478bd9Sstevel@tonic-gate int evClearIdleTimer __P((evContext, evTimerID));
189*7c478bd9Sstevel@tonic-gate int evResetIdleTimer __P((evContext, evTimerID, evTimerFunc, void *,
190*7c478bd9Sstevel@tonic-gate 			  struct timespec));
191*7c478bd9Sstevel@tonic-gate int evTouchIdleTimer __P((evContext, evTimerID));
192*7c478bd9Sstevel@tonic-gate 
193*7c478bd9Sstevel@tonic-gate /* ev_waits.c */
194*7c478bd9Sstevel@tonic-gate #define evWaitFor	__evWaitFor
195*7c478bd9Sstevel@tonic-gate #define evDo		__evDo
196*7c478bd9Sstevel@tonic-gate #define evUnwait	__evUnwait
197*7c478bd9Sstevel@tonic-gate #define evDefer		__evDefer
198*7c478bd9Sstevel@tonic-gate 
199*7c478bd9Sstevel@tonic-gate int evWaitFor __P((evContext ctx, const void *tag, evWaitFunc func, void *uap,
200*7c478bd9Sstevel@tonic-gate 		   evWaitID *id));
201*7c478bd9Sstevel@tonic-gate int evDo __P((evContext ctx, const void *tag));
202*7c478bd9Sstevel@tonic-gate int evUnwait __P((evContext ctx, evWaitID id));
203*7c478bd9Sstevel@tonic-gate int evDefer __P((evContext, evWaitFunc, void *));
204*7c478bd9Sstevel@tonic-gate 
205*7c478bd9Sstevel@tonic-gate #ifdef __EVENTLIB_P_DEFINED
206*7c478bd9Sstevel@tonic-gate # undef __P
207*7c478bd9Sstevel@tonic-gate #endif
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate #endif /*_EVENTLIB_H*/
210