X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fstatserv.c;h=a827e24a295ffeeaae8b3b51e7b82155244ae81c;hp=7a938e366fe0a02899435ab7f2e1f596cd5a68a1;hb=9e7c99310963a811885820ccccf9e96fae6ecf8b;hpb=7e158942eb374e7211dd3dbd834e664c70a2d143 diff --git a/server/statserv.c b/server/statserv.c index 7a938e3..a827e24 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -4,7 +4,23 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: statserv.c,v $ - * Revision 1.1 1995-03-10 18:22:45 quinn + * Revision 1.6 1995-03-15 15:18:52 quinn + * Little changes to better support nonblocking I/O + * Added backend.h + * + * Revision 1.5 1995/03/15 08:37:45 quinn + * Now we're pretty much set for nonblocking I/O. + * + * Revision 1.4 1995/03/14 16:59:48 quinn + * Bug-fixes + * + * Revision 1.3 1995/03/14 11:30:15 quinn + * Works better now. + * + * Revision 1.2 1995/03/14 10:28:03 quinn + * More work on demo server. + * + * Revision 1.1 1995/03/10 18:22:45 quinn * The rudiments of an asynchronous server. * */ @@ -16,16 +32,28 @@ #include +#include +#include +#include #include +#include +#include +#include + +#include +#include static char *me = ""; +#define DEFAULT_LISTENER "tcp:localhost:9999" + /* * handle incoming connect requests. */ void listener(IOCHAN h, int event) { COMSTACK line = (COMSTACK) iochan_getdata(h); + association *newas; if (event == EVENT_INPUT) { @@ -36,7 +64,8 @@ void listener(IOCHAN h, int event) fprintf(stderr, "cs_listen failed.\n"); exit(1); } - iochan_setflags(h, EVENT_OUTPUT) /* set us up for accepting */ + iochan_setevent(h, EVENT_OUTPUT); + iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */ } else if (event == EVENT_OUTPUT) { @@ -48,13 +77,19 @@ void listener(IOCHAN h, int event) fprintf(stderr, "Accept failed.\n"); exit(1); } - if (!(new_chan = iochan_create(cs_fileno(initializer, init_fun, - EVENT_INPUT)))) + if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session, + EVENT_INPUT))) { fprintf(stderr, "Failed to create iochan\n"); exit(1); } - iochan_setflags(h, EVENT_INPUT); /* reset for listening */ + if (!(newas = create_association(new_chan, new_line))) + { + fprintf(stderr, "Failed to create new assoc.\n"); + exit(1); + } + iochan_setdata(new_chan, newas); + iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset for listen */ } else { @@ -70,10 +105,11 @@ void add_listener(char *where) { COMSTACK l; CS_TYPE type; - char mode[100], addr[100] + char mode[100], addr[100]; void *ap; IOCHAN lst; + fprintf(stderr, "Adding listener on %s\n", where); if (!where || sscanf(where, "%[^:]:%s", mode, addr) != 2) { fprintf(stderr, "%s: Address format: ('tcp'|'osi')':'
.\n", @@ -82,28 +118,30 @@ void add_listener(char *where) } if (!strcmp(mode, "tcp")) { - if (!(ap = tcpip_strtoaddr(where))) + if (!(ap = tcpip_strtoaddr(addr))) { fprintf(stderr, "Address resolution failed for TCP.\n"); exit(1); } type = tcpip_type; } +#if 0 else if (!strcmp(mode, "osi")) { - if (!(ap = mosi_strtoaddr(where))) + if (!(ap = mosi_strtoaddr(addr))) { fprintf(stderr, "Address resolution failed for TCP.\n"); exit(1); } type = mosi_type; } +#endif else { fprintf(stderr, "You must specify either 'osi:' or 'tcp:'.\n"); exit(1); } - if (!(l = cs_create(type, 1))) + if (!(l = cs_create(type, 0))) { fprintf(stderr, "Failed to create listener\n"); exit(1); @@ -114,7 +152,8 @@ void add_listener(char *where) perror(where); exit(1); } - if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT))) + if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT | + EVENT_EXCEPT))) { fprintf(stderr, "Failed to create IOCHAN-type\n"); exit(1); @@ -127,19 +166,17 @@ int main(int argc, char **argv) int ret, listeners = 0; char *arg; + me = argv[0]; while ((ret = options("l:", argv, argc, &arg)) != -2) switch (ret) { case 0: me = arg; break; - case 'l': add_listener(arg); l++; break; + case 'l': add_listener(arg); listeners++; break; default: fprintf(stderr, "Usage: %s [-l ]\n", me); exit(1); } if (!listeners) - { - fprintf(stderr, "%s: Must specify at least one listener.\n", me); - exit(1); - } + add_listener(DEFAULT_LISTENER); return event_loop(); }