From: Sebastian Hammer Date: Tue, 14 Mar 1995 10:27:57 +0000 (+0000) Subject: More work on demo server. X-Git-Tag: YAZ.1.8~1140 X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=commitdiff_plain;h=0a3a8b6400167c2dfd6e6b5f135f6ad4783e554c;p=yaz-moved-to-github.git More work on demo server. --- diff --git a/server/Makefile b/server/Makefile index 6830cc8..a8d26c5 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,19 +1,25 @@ # Copyright (C) 1994, Index Data I/S # All rights reserved. # Sebastian Hammer, Adam Dickmeiss -# $Id: Makefile,v 1.1 1995-03-10 18:22:44 quinn Exp $ +# $Id: Makefile,v 1.2 1995-03-14 10:27:57 quinn Exp $ SHELL=/bin/sh -INCLUDE=-I../include -I. -I../asn -I../odr -I../../egate/include -I../../xtimosi/src +INCLUDE=-I../include -I. -I../asn -I../odr -I../yazlib -I../../egate/include -I../../xtimosi/src +LIBDIR=../../lib +LIBINCLUDE=-L$(LIBDIR) #CFLAGS=-Wall -pedantic -g -#CFLAGS=-g DEFS=$(INCLUDE) -LIB= server.a +LIB=$(LIBDIR)/libserver.a +LIBS=-lserver -lasn -lodr -lcomstack options.o PO = eventl.o CPP=cc -E -#CC=checkergcc +PROG=statserv +PROGO=statserv.o session.o -all: $(LIB) +all: $(LIBDIR) $(LIB) $(PROG) + +$(PROG): $(LIB) $(PROGO) options.o + $(CC) $(CFLAGS) $(LIBINCLUDE) -o $(PROG) $(PROGO) $(LIBS) alll: @@ -22,6 +28,9 @@ $(LIB): $(PO) ar qc $(LIB) $(PO) ranlib $(LIB) +$(LIBDIR): + mkdir $(LIBDIR) + .c.o: $(CC) -c $(DEFS) $(CFLAGS) $< diff --git a/server/eventl.c b/server/eventl.c index e363111..3d2df2f 100644 --- a/server/eventl.c +++ b/server/eventl.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: eventl.c,v $ - * Revision 1.1 1995-03-10 18:22:44 quinn + * Revision 1.2 1995-03-14 10:27:59 quinn + * More work on demo server. + * + * Revision 1.1 1995/03/10 18:22:44 quinn * The rudiments of an asynchronous server. * */ @@ -29,14 +32,11 @@ IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags) new->fd = fd; new->flags = flags; new->fun = cb; + new->next = iochans; + iochans = new; return new; } -void iochan_destroy(IOCHAN i) -{ - i->destroyed = 1; -} - int event_loop() { do @@ -44,12 +44,17 @@ int event_loop() IOCHAN p, nextp; fd_set in, out, except; int res, max; + static struct timeval nullto = {0, 0}; + struct timeval *timeout; FD_ZERO(&in); FD_ZERO(&out); FD_ZERO(&except); + timeout = 0; /* hang on select */ for (p = iochans; p; p = p->next) { + if (p->force_event) + timeout = &nullto; if (p->flags & EVENT_INPUT) FD_SET(p->fd, &in); if (p->flags & EVENT_OUTPUT) @@ -59,7 +64,7 @@ int event_loop() if (p->fd > max) max = p->fd; } - if ((res = select(max + 1, &in, &out, &except, 0)) < 0) + if ((res = select(max + 1, &in, &out, &except, timeout)) < 0) { if (errno == EINTR) continue; @@ -69,12 +74,17 @@ int event_loop() continue; for (p = iochans; p; p = nextp) { + int force_event = p->force_event; + + p->force_event = 0; nextp = p->next; - if (FD_ISSET(p->fd, &in)) + if (FD_ISSET(p->fd, &in) || force_event == EVENT_INPUT) (*p->fun)(p, EVENT_INPUT); - if (!p->destroyed && FD_ISSET(p->fd, &in)) + if (!p->destroyed && (FD_ISSET(p->fd, &in) || + force_event == EVENT_OUTPUT)) (*p->fun)(p, EVENT_OUTPUT); - if (!p->destroyed && FD_ISSET(p->fd, &except)) + if (!p->destroyed && (FD_ISSET(p->fd, &except) || + force_event == EVENT_EXCEPT)) (*p->fun)(p, EVENT_EXCEPT); if (p->destroyed) { diff --git a/server/eventl.h b/server/eventl.h index d8b965c..5c6e822 100644 --- a/server/eventl.h +++ b/server/eventl.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: eventl.h,v $ - * Revision 1.1 1995-03-10 18:22:45 quinn + * Revision 1.2 1995-03-14 10:28:00 quinn + * More work on demo server. + * + * Revision 1.1 1995/03/10 18:22:45 quinn * The rudiments of an asynchronous server. * */ @@ -24,6 +27,7 @@ typedef struct iochan #define EVENT_OUTPUT 0x02 #define EVENT_EXCEPT 0x04 #define EVENT_TIMEOUT 0x08 +int force_event; IOC_CALLBACK fun; void *data; int destroyed; @@ -39,5 +43,9 @@ typedef struct iochan #define iochan_setflags(i, d) ((i)->flags = d) #define iochan_getfun(i) ((i)->fun) #define iochan_setfun(i, d) ((i)->fun = d) +#define iochan_setevent(i, e) ((i)->force_event = (e)) + +IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags); +int event_loop(); #endif diff --git a/server/session.h b/server/session.h new file mode 100644 index 0000000..cd7c2a3 --- /dev/null +++ b/server/session.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1994, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: session.h,v $ + * Revision 1.1 1995-03-14 10:28:02 quinn + * More work on demo server. + * + * + */ + +#ifndef SESSION_H +#define SESSION_H + +#include +#include + +typedef struct association +{ + /* comms-related handles */ + IOCHAN client_chan; + COMSTACK client_link; + ODR decode; + ODR encode; + char *encode_buffer; + int encoded_len; + char *input_buffer; + int input_buffer_len; + int input_apdu_len; + int state; +#define ASSOC_UNINIT 0 +#define ASSOC_IDLE 1 + + /* session parameters */ + int preferredMessageSize; + int maximumRecordSize; +} association; + +association *create_association(IOCHAN channel, COMSTACK link); +void ir_session(IOCHAN h, int event); + +#endif diff --git a/server/statserv.c b/server/statserv.c index 7a938e3..f536f02 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: statserv.c,v $ - * Revision 1.1 1995-03-10 18:22:45 quinn + * 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,7 +19,13 @@ #include +#include +#include +#include #include +#include +#include +#include static char *me = ""; @@ -26,6 +35,7 @@ static char *me = ""; void listener(IOCHAN h, int event) { COMSTACK line = (COMSTACK) iochan_getdata(h); + association *newas; if (event == EVENT_INPUT) { @@ -36,7 +46,7 @@ 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_setflags(h, EVENT_OUTPUT); /* set us up for accepting */ } else if (event == EVENT_OUTPUT) { @@ -48,12 +58,18 @@ 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); } + if (!(newas = create_association(new_chan, new_line))) + { + fprintf(stderr, "Failed to create new assoc.\n"); + exit(1); + } + iochan_setdata(h, newas); iochan_setflags(h, EVENT_INPUT); /* reset for listening */ } else @@ -70,7 +86,7 @@ void add_listener(char *where) { COMSTACK l; CS_TYPE type; - char mode[100], addr[100] + char mode[100], addr[100]; void *ap; IOCHAN lst; @@ -82,22 +98,24 @@ 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"); @@ -131,7 +149,7 @@ int main(int argc, char **argv) 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);