X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fstatserv.c;h=c69444301038700e25a0fedd2ada1f7a5fd31d7a;hb=9287c96097c00d28310becb14ea3dd7cfb9f2ab0;hp=4329b77cb221a44e151cbf272c4a1d14ebe32e9e;hpb=b81a371f23d16b616e6f7355ec7345cf8a482511;p=yaz-moved-to-github.git diff --git a/server/statserv.c b/server/statserv.c index 4329b77..c694443 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -1,12 +1,12 @@ /* - * Copyright (c) 1995-2001, Index Data + * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * - * NT server based on threads by + * NT threaded server code by * Chas Woodfield, Fretwell Downing Informatics. * - * $Id: statserv.c,v 1.77 2001-10-05 14:43:22 adam Exp $ + * $Id: statserv.c,v 1.87 2002-11-26 16:04:15 adam Exp $ */ #include @@ -243,7 +243,7 @@ void statserv_closedown() } } -void event_loop_thread (IOCHAN iochan) +void __cdecl event_loop_thread (IOCHAN iochan) { event_loop (&iochan); } @@ -330,9 +330,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) { } @@ -341,17 +354,18 @@ void statserv_closedown() { IOCHAN p; +/* CHANGE */ 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); @@ -412,7 +426,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; @@ -498,11 +513,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; } } @@ -558,7 +577,8 @@ static void *new_session (void *vp) return 0; } -#endif /* WIN32 */ +/* UNIX */ +#endif static void inetd_connection(int what) { @@ -601,7 +621,7 @@ static void inetd_connection(int what) /* * Set up a listening endpoint, and give it to the event-handler. */ -static void add_listener(char *where, int what) +static int add_listener(char *where, int what) { COMSTACK l; void *ap; @@ -622,37 +642,38 @@ static void add_listener(char *where, int what) if (!l) { yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to listen on %s", where); - return; + return -1; } if (cs_bind(l, ap, CS_SERVER) < 0) { yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", where); cs_close (l); - return; + return -1; } if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT | EVENT_EXCEPT))) { yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create IOCHAN-type"); cs_close (l); - return; + return -1; } iochan_setdata(lst, l); /* Ensure our listener chain is setup properly */ lst->next = pListener; pListener = lst; + return 0; /* OK */ } #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) { @@ -671,11 +692,11 @@ int statserv_start(int argc, char **argv) { int ret; - nmem_init (); #ifdef WIN32 /* We need to initialize the thread list */ ThreadList_Initialize(); -#endif /* WIN32 */ +/* WIN32 */ +#endif #ifdef WIN32 if ((me = strrchr (argv[0], '\\'))) @@ -693,6 +714,7 @@ int statserv_start(int argc, char **argv) #ifdef WIN32 logf (LOG_LOG, "Starting server %s", me); #else +/* UNIX */ if (control_block.inetd) inetd_connection(control_block.default_proto); else @@ -726,8 +748,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); @@ -739,7 +763,6 @@ int statserv_start(int argc, char **argv) yaz_log(LOG_LOG, "Entering event loop."); ret = event_loop(&pListener); } - nmem_exit (); return ret; } @@ -753,7 +776,8 @@ int check_options(int argc, char **argv) switch (ret) { case 0: - add_listener(arg, control_block.default_proto); + if (add_listener(arg, control_block.default_proto)) + return 1; /* failed to create listener */ break; case '1': control_block.one_shot = 1; @@ -763,7 +787,8 @@ int check_options(int argc, char **argv) control_block.default_proto = PROTO_Z3950; break; case 's': - control_block.default_proto = PROTO_SR; + fprintf (stderr, "%s: SR protocol no longer supported\n", me); + exit (1); break; case 'S': control_block.dynamic = 0; @@ -830,7 +855,7 @@ int check_options(int argc, char **argv) fprintf(stderr, "Usage: %s [ -a -v " " -l -u -c -t " " -k -d " - " -zsiST -w ... ]\n", me); + " -ziST1 -w ... ]\n", me); return 1; } } @@ -870,7 +895,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,7 +919,9 @@ void StopAppService(void *pHandle) /* Stops the app */ statserv_closedown(); } +/* WIN32 */ #else +/* UNIX */ int statserv_main(int argc, char **argv, bend_initresult *(*bend_init)(bend_initrequest *r), void (*bend_close)(void *handle))