2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.1 1995-03-10 18:22:45 quinn
8 * The rudiments of an asynchronous server.
13 * Simple, static server. I wouldn't advise a static server unless you
14 * really have to, but it's great for debugging memory management. :)
24 * handle incoming connect requests.
26 void listener(IOCHAN h, int event)
28 COMSTACK line = (COMSTACK) iochan_getdata(h);
30 if (event == EVENT_INPUT)
32 if (cs_listen(line, 0, 0) < 0)
34 if (cs_errno(line) == CSNODATA)
36 fprintf(stderr, "cs_listen failed.\n");
39 iochan_setflags(h, EVENT_OUTPUT) /* set us up for accepting */
41 else if (event == EVENT_OUTPUT)
46 if (!(new_line = cs_accept(line)))
48 fprintf(stderr, "Accept failed.\n");
51 if (!(new_chan = iochan_create(cs_fileno(initializer, init_fun,
54 fprintf(stderr, "Failed to create iochan\n");
57 iochan_setflags(h, EVENT_INPUT); /* reset for listening */
61 fprintf(stderr, "Bad event on listener.\n");
67 * Set up a listening endpoint, and give it to the event-handler.
69 void add_listener(char *where)
73 char mode[100], addr[100]
77 if (!where || sscanf(where, "%[^:]:%s", mode, addr) != 2)
79 fprintf(stderr, "%s: Address format: ('tcp'|'osi')':'<address>.\n",
83 if (!strcmp(mode, "tcp"))
85 if (!(ap = tcpip_strtoaddr(where)))
87 fprintf(stderr, "Address resolution failed for TCP.\n");
92 else if (!strcmp(mode, "osi"))
94 if (!(ap = mosi_strtoaddr(where)))
96 fprintf(stderr, "Address resolution failed for TCP.\n");
103 fprintf(stderr, "You must specify either 'osi:' or 'tcp:'.\n");
106 if (!(l = cs_create(type, 1)))
108 fprintf(stderr, "Failed to create listener\n");
111 if (cs_bind(l, ap, CS_SERVER) < 0)
113 fprintf(stderr, "Failed to bind.\n");
117 if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT)))
119 fprintf(stderr, "Failed to create IOCHAN-type\n");
122 iochan_setdata(lst, l);
125 int main(int argc, char **argv)
127 int ret, listeners = 0;
130 while ((ret = options("l:", argv, argc, &arg)) != -2)
133 case 0: me = arg; break;
134 case 'l': add_listener(arg); l++; break;
136 fprintf(stderr, "Usage: %s [-l <listener-addr>]\n", me);
141 fprintf(stderr, "%s: Must specify at least one listener.\n", me);