X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fstatserv.c;h=ec506a5cd8be5cb2fd3eaceddd6e2c26133c3b85;hp=a09ba6b2d83146269fb1041521ebcf4efa736f09;hb=068a5a7412f492019b4d6f5e89158098d44368f7;hpb=69e1deffc8ce5541d72110417f9e555f7e33aac2 diff --git a/server/statserv.c b/server/statserv.c index a09ba6b..ec506a5 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -1,10 +1,38 @@ /* - * Copyright (c) 1995, Index Data + * Copyright (c) 1995-1997, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * + * NT server based on threads by + * Chas Woodfield, Fretwell Downing Datasystem. + * * $Log: statserv.c,v $ - * Revision 1.37 1997-09-01 08:53:01 adam + * Revision 1.43 1997-10-31 12:20:09 adam + * Improved memory debugging for xmalloc/nmem.c. References to NMEM + * instead of ODR in n ESPEC-1 handling in source d1_espec.c. + * Bug fix: missing fclose in data1_read_espec1. + * + * Revision 1.42 1997/10/27 14:03:02 adam + * Added new member to statserver_options_block, pre_init, which + * specifies a callback to be invoked after command line parsing and + * before the server listens for the first time. + * + * Revision 1.41 1997/09/29 07:19:32 adam + * Server library uses nmem_init/nmem_exit. The log prefix no longer + * includes leading path on NT. + * + * Revision 1.40 1997/09/17 12:10:41 adam + * YAZ version 1.4. + * + * Revision 1.39 1997/09/09 10:10:19 adam + * Another MSV5.0 port. Changed projects to include proper + * library/include paths. + * Server starts server in test-mode when no options are given. + * + * Revision 1.38 1997/09/04 14:19:14 adam + * Added credits. + * + * Revision 1.37 1997/09/01 08:53:01 adam * New windows NT/95 port using MSV5.0. The test server 'ztest' was * moved a separate directory. MSV5.0 project server.dsp created. * As an option, the server can now operate as an NT service. @@ -121,13 +149,9 @@ * */ -/* - * Simple, static server. I wouldn't advise a static server unless you - * really have to, but it's great for debugging memory management. :) - */ - #include #include +#include #ifdef WINDOWS #include #include @@ -167,7 +191,8 @@ static statserv_options_block control_block = { 60, /* idle timeout (minutes) */ 1024*1024, /* maximum PDU size (approx.) to allow */ "default-config", /* configuration name to pass to backend */ - "" /* set user id */ + "", /* set user id */ + NULL }; /* @@ -270,7 +295,8 @@ void statserv_closedown() int iHandles = 0; HANDLE *pThreadHandles = NULL; - /* We need to stop threads adding and removing while we start the closedown process */ + /* We need to stop threads adding and removing while we */ + /* start the closedown process */ EnterCriticalSection(&Thread_CritSect); { @@ -338,11 +364,11 @@ static void listener(IOCHAN h, int event) { if ((res = cs_listen(line, 0, 0)) < 0) { - logf(LOG_FATAL, "cs_listen failed."); + logf(LOG_FATAL, "cs_listen failed."); return; } else if (res == 1) - return; + return; logf(LOG_DEBUG, "listen ok"); iochan_setevent(h, EVENT_OUTPUT); iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */ @@ -351,46 +377,53 @@ static void listener(IOCHAN h, int event) { COMSTACK new_line; IOCHAN new_chan; - char *a; + char *a = NULL; DWORD ThreadId; - if (!(new_line = cs_accept(line))) - { - logf(LOG_FATAL, "Accept failed."); - iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */ - return; - } - logf(LOG_DEBUG, "accept ok"); + if (!(new_line = cs_accept(line))) + { + logf(LOG_FATAL, "Accept failed."); + iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */ + return; + } + logf(LOG_DEBUG, "Accept ok"); - if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session, EVENT_INPUT))) - { - logf(LOG_FATAL, "Failed to create iochan"); + if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session, EVENT_INPUT))) + { + logf(LOG_FATAL, "Failed to create iochan"); iochan_destroy(h); return; - } - if (!(newas = create_association(new_chan, new_line))) - { - logf(LOG_FATAL, "Failed to create new assoc."); + } + + logf(LOG_DEBUG, "Creating association"); + if (!(newas = create_association(new_chan, new_line))) + { + logf(LOG_FATAL, "Failed to create new assoc."); iochan_destroy(h); return; - } - iochan_setdata(new_chan, newas); - iochan_settimeout(new_chan, control_block.idle_timeout * 60); - a = cs_addrstr(new_line); - logf(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]"); - - /* Now what we need todo is create a new thread with this iochan as the parameter */ -/* if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)event_loop, new_chan, 0, &ThreadId) == NULL) -*/ - /* Somehow, somewhere we need to store this thread id, otherwise we won't be able to close cleanly */ + } + logf(LOG_DEBUG, "Setting timeout %d", control_block.idle_timeout); + iochan_setdata(new_chan, newas); + iochan_settimeout(new_chan, control_block.idle_timeout * 60); +#ifndef WINDOWS + logf(LOG_DEBUG, "Determining client address"); + a = cs_addrstr(new_line); + logf(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]"); +#endif + /* Now what we need todo is create a new thread with this iochan as + the parameter */ + /* if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)event_loop, new_chan, + 0, &ThreadId) == NULL) */ + /* Somehow, somewhere we need to store this thread id, otherwise we won't be + able to close cleanly */ NewHandle = (HANDLE)_beginthreadex(NULL, 0, event_loop, new_chan, 0, &ThreadId); if (NewHandle == (HANDLE)-1) - { - logf(LOG_FATAL, "Failed to create new thread."); + { + + logf(LOG_FATAL|LOG_ERRNO, "Failed to create new thread."); iochan_destroy(h); return; - } - + } /* We successfully created the thread, so add it to the list */ statserv_add(NewHandle, new_chan); @@ -603,32 +636,24 @@ static void add_listener(char *where, int what) if (!where || sscanf(where, "%[^:]:%s", mode, addr) != 2) { - fprintf(stderr, "%s: Address format: ('tcp'|'osi')':'
.\n", - me); + logf (LOG_WARN, "%s: Address format: ('tcp'|'osi')':'
", me); + return; } if (!strcmp(mode, "tcp")) - { - if (!(ap = tcpip_strtoaddr(addr))) - { - fprintf(stderr, "Address resolution failed for TCP.\n"); - } type = tcpip_type; - } else if (!strcmp(mode, "osi")) { #ifdef USE_XTIMOSI - if (!(ap = mosi_strtoaddr(addr))) - { - fprintf(stderr, "Address resolution failed for TCP.\n"); - } type = mosi_type; #else - fprintf(stderr, "OSI Transport not allowed by configuration.\n"); + logf (LOG_WARN, "OSI Transport not allowed by configuration."); + return; #endif } else { - fprintf(stderr, "You must specify either 'osi:' or 'tcp:'.\n"); + logf (LOG_WARN, "You must specify either 'osi:' or 'tcp:'"); + return; } logf(LOG_LOG, "Adding %s %s listener on %s", control_block.dynamic ? "dynamic" : "static", @@ -637,6 +662,13 @@ static void add_listener(char *where, int what) { logf(LOG_FATAL|LOG_ERRNO, "Failed to create listener"); } + ap = cs_straddr (l, addr); + if (!ap) + { + fprintf(stderr, "Address resolution failed.\n"); + cs_close (l); + return; + } if (cs_bind(l, ap, CS_SERVER) < 0) { logf(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", where); @@ -682,12 +714,20 @@ int statserv_main(int argc, char **argv) char *arg; int protocol = control_block.default_proto; + nmem_init (); #ifdef WINDOWS /* We need to initialize the thread list */ ThreadList_Initialize(); #endif /* WINDOWS */ +#ifdef WINDOWS + if ((me = strrchr (argv[0], '\\'))) + me++; + else + me = argv[0]; +#else me = argv[0]; +#endif while ((ret = options("a:iszSl:v:u:c:w:t:k:", argv, argc, &arg)) != -2) { switch (ret) @@ -750,10 +790,6 @@ int statserv_main(int argc, char **argv) } } -#ifdef WINDOWS - log_init(control_block.loglevel, NULL, control_block.logfile); -#endif /* WINDOWS */ - if ((pListener == NULL) && *control_block.default_listen) add_listener(control_block.default_listen, protocol); @@ -762,6 +798,8 @@ int statserv_main(int argc, char **argv) inetd_connection(protocol); else { + if (control_block.pre_init) + (*control_block.pre_init)(&control_block); if (control_block.dynamic) signal(SIGCHLD, catchchld); } @@ -785,7 +823,9 @@ int statserv_main(int argc, char **argv) logf(LOG_LOG, "Entering event loop."); if (pListener == NULL) - return(1); + ret = 1; else - return event_loop(pListener); + ret = event_loop(pListener); + nmem_exit (); + return ret; }