2 * Copyright (c) 1995, Index Data
3 * See the file LICENSE for details.
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.21 1996-02-21 12:55:51 quinn
10 * Revision 1.20 1996/02/21 12:52:55 quinn
13 * Revision 1.19 1995/12/05 11:17:30 quinn
14 * Moved some paranthesises around. Sigh.
16 * Revision 1.18 1995/11/13 09:27:41 quinn
17 * Fiddling with the variant stuff.
19 * Revision 1.17 1995/11/07 12:37:44 quinn
20 * Added support for forcing TIMEOUT event.
22 * Revision 1.16 1995/11/01 13:54:56 quinn
25 * Revision 1.15 1995/09/15 14:44:15 quinn
26 * *** empty log message ***
28 * Revision 1.14 1995/08/29 14:44:50 quinn
31 * Revision 1.13 1995/08/29 11:17:56 quinn
32 * Added code to receive close
34 * Revision 1.12 1995/08/29 10:41:18 quinn
37 * Revision 1.11 1995/06/19 12:39:09 quinn
38 * Fixed bug in timeout code. Added BER dumper.
40 * Revision 1.10 1995/06/16 10:31:33 quinn
41 * Added session timeout.
43 * Revision 1.9 1995/06/05 10:53:31 quinn
44 * Added a better SCAN.
46 * Revision 1.8 1995/05/16 08:51:01 quinn
47 * License, documentation, and memory fixes
49 * Revision 1.7 1995/03/27 15:02:01 quinn
50 * Added some includes for better portability
52 * Revision 1.6 1995/03/27 08:34:21 quinn
53 * Added dynamic server functionality.
54 * Released bindings to session.c (is now redundant)
56 * Revision 1.5 1995/03/15 08:37:41 quinn
57 * Now we're pretty much set for nonblocking I/O.
59 * Revision 1.4 1995/03/14 16:59:48 quinn
62 * Revision 1.3 1995/03/14 11:30:14 quinn
65 * Revision 1.2 1995/03/14 10:27:59 quinn
66 * More work on demo server.
68 * Revision 1.1 1995/03/10 18:22:44 quinn
69 * The rudiments of an asynchronous server.
76 #include <sys/types.h>
82 #include <sys/select.h>
89 static IOCHAN iochans = 0;
91 IOCHAN iochan_getchan(void)
96 IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
100 if (!(new = xmalloc(sizeof(*new))))
107 new->force_event = 0;
108 new->last_event = new->max_idle = 0;
115 do /* loop as long as there are active associations to process */
118 fd_set in, out, except;
120 static struct timeval nullto = {0, 0}, to;
121 struct timeval *timeout;
126 timeout = &to; /* hang on select */
130 for (p = iochans; p; p = p->next)
133 timeout = &nullto; /* polling select */
134 if (p->flags & EVENT_INPUT)
136 if (p->flags & EVENT_OUTPUT)
138 if (p->flags & EVENT_EXCEPT)
139 FD_SET(p->fd, &except);
143 if ((res = select(max + 1, &in, &out, &except, timeout)) < 0)
149 for (p = iochans; p; p = p->next)
151 int force_event = p->force_event;
152 time_t now = time(0);
155 if (!p->destroyed && (FD_ISSET(p->fd, &in) || force_event ==
159 (*p->fun)(p, EVENT_INPUT);
161 if (!p->destroyed && (FD_ISSET(p->fd, &out) ||
162 force_event == EVENT_OUTPUT))
165 (*p->fun)(p, EVENT_OUTPUT);
167 if (!p->destroyed && (FD_ISSET(p->fd, &except) ||
168 force_event == EVENT_EXCEPT))
171 (*p->fun)(p, EVENT_EXCEPT);
173 if (!p->destroyed && ((p->max_idle && now - p->last_event >
174 p->max_idle) || force_event == EVENT_TIMEOUT))
177 (*p->fun)(p, EVENT_TIMEOUT);
180 for (p = iochans; p; p = nextp)
192 for (pr = iochans; pr; pr = pr->next)
195 assert(pr); /* grave error if it weren't there */