2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.7 1995-03-27 15:02:01 quinn
8 * Added some includes for better portability
10 * Revision 1.6 1995/03/27 08:34:21 quinn
11 * Added dynamic server functionality.
12 * Released bindings to session.c (is now redundant)
14 * Revision 1.5 1995/03/15 08:37:41 quinn
15 * Now we're pretty much set for nonblocking I/O.
17 * Revision 1.4 1995/03/14 16:59:48 quinn
20 * Revision 1.3 1995/03/14 11:30:14 quinn
23 * Revision 1.2 1995/03/14 10:27:59 quinn
24 * More work on demo server.
26 * Revision 1.1 1995/03/10 18:22:44 quinn
27 * The rudiments of an asynchronous server.
33 #include <sys/types.h>
43 static IOCHAN iochans = 0;
45 IOCHAN iochan_getchan(void)
50 IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
54 if (!(new = malloc(sizeof(*new))))
71 fd_set in, out, except;
73 static struct timeval nullto = {0, 0};
74 struct timeval *timeout;
79 timeout = 0; /* hang on select */
81 for (p = iochans; p; p = p->next)
85 if (p->flags & EVENT_INPUT)
87 if (p->flags & EVENT_OUTPUT)
89 if (p->flags & EVENT_EXCEPT)
90 FD_SET(p->fd, &except);
94 if ((res = select(max + 1, &in, &out, &except, timeout)) < 0)
100 for (p = iochans; p; p = p->next)
102 int force_event = p->force_event;
105 if (FD_ISSET(p->fd, &in) || force_event == EVENT_INPUT)
106 (*p->fun)(p, EVENT_INPUT);
107 if (!p->destroyed && (FD_ISSET(p->fd, &out) ||
108 force_event == EVENT_OUTPUT))
109 (*p->fun)(p, EVENT_OUTPUT);
110 if (!p->destroyed && (FD_ISSET(p->fd, &except) ||
111 force_event == EVENT_EXCEPT))
112 (*p->fun)(p, EVENT_EXCEPT);
114 for (p = iochans; p; p = nextp)
126 for (pr = iochans; pr; pr = pr->next)