X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fstatserv.c;h=b041f1a9d3ad8be3feb3772c284928033d2736e9;hb=6b3cf0738c53080781fedd852e26b299224af3c3;hp=03713d472dbf64ea3335283316f121ddc2b99528;hpb=0e8b1116b97d769ea233858fe3c2ced5d1da5d7c;p=yaz-moved-to-github.git diff --git a/server/statserv.c b/server/statserv.c index 03713d4..b041f1a 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -1,12 +1,12 @@ /* - * Copyright (c) 1995-2002, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * NT threaded server code by * Chas Woodfield, Fretwell Downing Informatics. * - * $Id: statserv.c,v 1.83 2002-08-17 07:56:59 adam Exp $ + * $Id: statserv.c,v 1.97 2003-02-23 14:46:10 adam Exp $ */ #include @@ -58,7 +58,7 @@ statserv_options_block control_block = { "", /* diagnostic output to stderr */ "tcp:@:9999", /* default listener port */ PROTO_Z3950, /* default application protocol */ - 60, /* idle timeout (minutes) */ + 15, /* idle timeout (minutes) */ 1024*1024, /* maximum PDU size (approx.) to allow */ "default-config", /* configuration name to pass to backend */ "", /* set user id */ @@ -70,15 +70,18 @@ statserv_options_block control_block = { 0, /* default value for inet deamon */ 0, /* handle (for service, etc) */ 0, /* bend_init handle */ - 0 /* bend_close handle */ + 0, /* bend_close handle */ #ifdef WIN32 - ,"Z39.50 Server", /* NT Service Name */ + "Z39.50 Server", /* NT Service Name */ "Server", /* NT application Name */ "", /* NT Service Dependencies */ - "Z39.50 Server" /* NT Service Display Name */ + "Z39.50 Server", /* NT Service Display Name */ #endif /* WIN32 */ + 0 /* SOAP handlers */ }; +static int max_sessions = 0; + /* * handle incoming connect requests. * The dynamic mode is a bit tricky mostly because we want to avoid @@ -304,7 +307,7 @@ static void listener(IOCHAN h, int event) yaz_log(LOG_DEBUG, "Setting timeout %d", control_block.idle_timeout); iochan_setdata(new_chan, newas); - iochan_settimeout(new_chan, control_block.idle_timeout * 60); + iochan_settimeout(new_chan, 60); /* Now what we need todo is create a new thread with this iochan as the parameter */ @@ -330,9 +333,22 @@ static void listener(IOCHAN h, int event) } } +int statserv_must_terminate(void) +{ + return 0; +} + #else /* ! WIN32 */ -/* To save having an #ifdef in event_loop we need to define this empty function */ +static int term_flag = 0; +/* To save having an #ifdef in event_loop we need to + define this empty function +*/ +int statserv_must_terminate(void) +{ + return term_flag; +} + void statserv_remove(IOCHAN pIOChannel) { } @@ -343,15 +359,15 @@ void statserv_closedown() if (control_block.bend_stop) (*control_block.bend_stop)(&control_block); - for (p = pListener; p; p = p->next) + { iochan_destroy(p); + } } void sigterm(int sig) { - statserv_closedown(); - exit (0); + term_flag = 1; } static void *new_session (void *vp); @@ -402,6 +418,10 @@ static void listener(IOCHAN h, int event) } sprintf(nbuf, "%s(%d)", me, getpid()); yaz_log_init(control_block.loglevel, nbuf, 0); + /* ensure that bend_stop is not called when each child exits - + only for the main process .. + */ + control_block.bend_stop = 0; } else /* parent */ { @@ -412,7 +432,8 @@ static void listener(IOCHAN h, int event) char dummy[1]; int res; - if ((res = read(hand[0], dummy, 1)) < 0 && errno != EINTR) + if ((res = read(hand[0], dummy, 1)) < 0 && + yaz_errno() != EINTR) { yaz_log(LOG_FATAL|LOG_ERRNO, "handshake read"); return; @@ -428,7 +449,7 @@ static void listener(IOCHAN h, int event) if ((res = cs_listen_check(line, 0, 0, control_block.check_ip, control_block.daemon_name)) < 0) { - yaz_log(LOG_WARN, "cs_listen failed"); + yaz_log(LOG_WARN|LOG_ERRNO, "cs_listen failed"); return; } else if (res == 1) @@ -498,11 +519,15 @@ static void listener(IOCHAN h, int event) new_session(new_line); #endif } + else if (event == EVENT_TIMEOUT) + { + yaz_log(LOG_LOG, "Shutting down listener."); + iochan_destroy(h); + } else { yaz_log(LOG_FATAL, "Bad event on listener."); iochan_destroy(h); - return; } } @@ -542,10 +567,16 @@ static void *new_session (void *vp) newas->cs_get_mask = cs_get_mask; iochan_setdata(new_chan, newas); - iochan_settimeout(new_chan, control_block.idle_timeout * 60); + iochan_settimeout(new_chan, 60); +#if 1 a = cs_addrstr(new_line); +#else + a = 0; +#endif yaz_log(LOG_LOG, "Starting session %d from %s", no_sessions, a ? a : "[Unknown]"); + if (max_sessions && no_sessions == max_sessions) + control_block.one_shot = 1; if (control_block.threads) { event_loop(&new_chan); @@ -558,7 +589,8 @@ static void *new_session (void *vp) return 0; } -#endif /* WIN32 */ +/* UNIX */ +#endif static void inetd_connection(int what) { @@ -574,7 +606,7 @@ static void inetd_connection(int what) if ((assoc = create_association(chan, line))) { iochan_setdata(chan, assoc); - iochan_settimeout(chan, control_block.idle_timeout * 60); + iochan_settimeout(chan, 60); addr = cs_addrstr(line); yaz_log(LOG_LOG, "Inetd association from %s", addr ? addr : "[UNKNOWN]"); @@ -626,7 +658,8 @@ static int add_listener(char *where, int what) } if (cs_bind(l, ap, CS_SERVER) < 0) { - yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", where); + yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", + where, errno); cs_close (l); return -1; } @@ -646,14 +679,14 @@ static int add_listener(char *where, int what) } #ifndef WIN32 -/* For windows we don't need to catch the signals */ +/* UNIX only (for windows we don't need to catch the signals) */ static void catchchld(int num) { while (waitpid(-1, 0, WNOHANG) > 0) ; signal(SIGCHLD, catchchld); } -#endif /* WIN32 */ +#endif statserv_options_block *statserv_getcontrol(void) { @@ -668,6 +701,10 @@ void statserv_setcontrol(statserv_options_block *block) memcpy(&control_block, block, sizeof(*block)); } +static void statserv_reset(void) +{ +} + int statserv_start(int argc, char **argv) { int ret; @@ -675,7 +712,8 @@ int statserv_start(int argc, char **argv) #ifdef WIN32 /* We need to initialize the thread list */ ThreadList_Initialize(); -#endif /* WIN32 */ +/* WIN32 */ +#endif #ifdef WIN32 if ((me = strrchr (argv[0], '\\'))) @@ -691,13 +729,14 @@ int statserv_start(int argc, char **argv) if (control_block.bend_start) (*control_block.bend_start)(&control_block); #ifdef WIN32 - logf (LOG_LOG, "Starting server %s", me); + yaz_log (LOG_LOG, "Starting server %s", me); #else +/* UNIX */ if (control_block.inetd) inetd_connection(control_block.default_proto); else { - logf (LOG_LOG, "Starting server %s pid=%d", me, getpid()); + yaz_log (LOG_LOG, "Starting server %s pid=%d", me, getpid()); #if 0 sigset_t sigs_to_block; @@ -726,8 +765,10 @@ int statserv_start(int argc, char **argv) exit(1); } } -#endif /* WIN32 */ - +/* UNIX */ +#endif + + if ((pListener == NULL) && *control_block.default_listen) add_listener(control_block.default_listen, control_block.default_proto); @@ -747,7 +788,7 @@ int check_options(int argc, char **argv) int ret = 0, r; char *arg; - while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:", argv, argc, &arg)) != -2) + while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:D:", argv, argc, &arg)) != -2) { switch (ret) { @@ -827,6 +868,9 @@ int check_options(int argc, char **argv) return 1; } break; + case 'D': + max_sessions = atoi(arg); + break; default: fprintf(stderr, "Usage: %s [ -a -v " " -l -u -c -t " @@ -871,7 +915,7 @@ int statserv_main(int argc, char **argv, /* Now setup the service with the service controller */ SetupService(argc, argv, &ArgDetails, SZAPPNAME, cb->service_name, /* internal service name */ - cb->service_name, /* displayed name of the service */ + cb->service_display_name, /* displayed name */ SZDEPENDENCIES); return 0; } @@ -894,8 +938,11 @@ void StopAppService(void *pHandle) { /* Stops the app */ statserv_closedown(); + statserv_reset(); } +/* WIN32 */ #else +/* UNIX */ int statserv_main(int argc, char **argv, bend_initresult *(*bend_init)(bend_initrequest *r), void (*bend_close)(void *handle)) @@ -909,6 +956,7 @@ int statserv_main(int argc, char **argv, statserv_setcontrol(cb); ret = statserv_start (argc, argv); statserv_closedown (); + statserv_reset(); return ret; } #endif