X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fstatserv.c;h=cecc6b1a969f2485f99d9074ede9c254dbf03edb;hp=458f664a5fb9572c19be5c7bb1259717a9d10a69;hb=bc66c2a11aa31c16f46c49100e99dc9b7e940faf;hpb=8e4eabe621f8b8195faa6625a38a2e1ae7b68aa1 diff --git a/server/statserv.c b/server/statserv.c index 458f664..cecc6b1 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -1,234 +1,12 @@ /* - * Copyright (c) 1995-2000, Index Data + * Copyright (c) 1995-2001, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * NT server based on threads by * Chas Woodfield, Fretwell Downing Informatics. * - * $Log: statserv.c,v $ - * Revision 1.67 2000-11-23 10:58:32 adam - * SSL comstack support. Separate POSIX thread support library. - * - * Revision 1.66 2000/10/06 12:00:28 adam - * Fixed Handle leak for WIN32. - * - * Revision 1.65 2000/09/04 08:58:15 adam - * Added prefix yaz_ for most logging utility functions. - * - * Revision 1.64 2000/04/05 07:39:55 adam - * Added shared library support (libtool). - * - * Revision 1.63 2000/03/20 19:06:25 adam - * Added Segment request for fronend server. Work on admin for client. - * - * Revision 1.62 2000/03/17 12:47:02 adam - * Minor changes to admin client. - * - * Revision 1.61 2000/03/15 12:59:49 adam - * Added handle member to statserv_control. - * - * Revision 1.60 2000/03/14 09:06:11 adam - * Added POSIX threads support for frontend server. - * - * Revision 1.59 1999/11/30 13:47:12 adam - * Improved installation. Moved header files to include/yaz. - * - * Revision 1.58 1999/08/27 09:40:32 adam - * Renamed logf function to yaz_log. Removed VC++ project files. - * - * Revision 1.57 1999/07/06 12:17:15 adam - * Added option -1 that runs server once (for profiling purposes). - * - * Revision 1.56 1999/06/10 11:45:30 adam - * Added bend_start, bend_stop handlers and removed pre_init. - * Handlers bend_start/bend_stop are called when service/daemon is - * started/stopped. - * - * Revision 1.55 1999/06/10 09:18:54 adam - * Modified so that pre_init is called when service/server is started. - * - * Revision 1.54 1999/04/16 14:45:55 adam - * Added interface for tcpd wrapper for access control. - * - * Revision 1.53 1999/02/02 13:57:39 adam - * Uses preprocessor define WIN32 instead of WINDOWS to build code - * for Microsoft WIN32. - * - * Revision 1.52 1998/08/21 14:13:34 adam - * Added GNU Configure script to build Makefiles. - * - * Revision 1.51 1998/07/07 15:51:03 adam - * Changed server so that it stops if bind fails - "address already in - * use" typically causes this. - * - * Revision 1.50 1998/06/22 11:32:39 adam - * Added 'conditional cs_listen' feature. - * - * Revision 1.49 1998/02/27 14:04:55 adam - * Fixed bug in statserv_remove. - * - * Revision 1.48 1998/02/11 11:53:36 adam - * Changed code so that it compiles as C++. - * - * Revision 1.47 1998/02/10 10:28:57 adam - * Added app_name, service_dependencies, service_display_name and - * options_func. options_func allows us to specify a different function - * to interogate the command line arguments. The other members allow us - * to pass the full service details accross to the service manager (CW). - * - * - * Revision 1.46 1998/01/30 15:24:57 adam - * Fixed bug in inetd code. The server listened on tcp:@:9999 even - * though it was started in inetd mode. - * - * Revision 1.45 1998/01/29 13:30:23 adam - * Better event handle system for NT/Unix. - * - * Revision 1.44 1997/11/07 13:31:52 adam - * Added NT Service name part of statserv_options_block. Moved NT - * service utility to server library. - * - * 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. - * - * Revision 1.36 1996/07/06 19:58:36 quinn - * System headerfiles gathered in yconfig - * - * Revision 1.35 1996/05/29 10:03:28 quinn - * Options work - * - * Revision 1.34 1996/02/21 13:12:07 quinn - * *** empty log message *** - * - * Revision 1.33 1996/02/10 12:23:49 quinn - * Enable inetd operations fro TCP/IP stack - * - * Revision 1.32 1996/01/19 15:41:52 quinn - * *** empty log message *** - * - * Revision 1.31 1995/11/17 11:09:39 adam - * Added new option '-c' to specify configuration name in control block. - * - * Revision 1.30 1995/11/01 13:54:59 quinn - * Minor adjustments - * - * Revision 1.29 1995/10/30 12:41:29 quinn - * Added hostname lookup for server. - * - * Revision 1.28 1995/09/29 17:12:30 quinn - * Smallish - * - * Revision 1.27 1995/09/27 15:03:02 quinn - * Modified function heads & prototypes. - * - * Revision 1.26 1995/08/29 14:44:51 quinn - * Reset timeouts. - * - * Revision 1.25 1995/08/29 11:18:02 quinn - * Added code to receive close - * - * Revision 1.24 1995/06/16 10:31:39 quinn - * Added session timeout. - * - * Revision 1.23 1995/06/15 12:30:48 quinn - * Setuid-facility. - * - * Revision 1.22 1995/06/15 07:45:17 quinn - * Moving to v3. - * - * Revision 1.21 1995/06/06 08:15:40 quinn - * Cosmetic. - * - * Revision 1.20 1995/05/29 08:12:09 quinn - * Moved oid to util - * - * Revision 1.19 1995/05/16 09:37:27 quinn - * Fixed bug - * - * Revision 1.18 1995/05/16 08:51:09 quinn - * License, documentation, and memory fixes - * - * Revision 1.17 1995/05/15 11:56:42 quinn - * Asynchronous facilities. Restructuring of seshigh code. - * - * Revision 1.16 1995/04/10 10:23:40 quinn - * Some work to add scan and other things. - * - * Revision 1.15 1995/03/31 10:16:51 quinn - * Fixed logging. - * - * Revision 1.14 1995/03/31 09:18:58 quinn - * Added logging. - * - * Revision 1.13 1995/03/30 16:08:39 quinn - * Little mods. - * - * Revision 1.12 1995/03/30 13:29:02 quinn - * Smallish - * - * Revision 1.11 1995/03/30 12:18:17 quinn - * Fixed bug. - * - * Revision 1.10 1995/03/29 15:40:16 quinn - * Ongoing work. Statserv is now dynamic by default - * - * Revision 1.9 1995/03/27 08:34:30 quinn - * Added dynamic server functionality. - * Released bindings to session.c (is now redundant) - * - * Revision 1.8 1995/03/20 09:46:26 quinn - * Added osi support. - * - * Revision 1.7 1995/03/16 13:29:04 quinn - * Partitioned server. - * - * 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. - * + * $Id: statserv.c,v 1.78 2001-10-24 12:24:43 adam Exp $ */ #include @@ -239,12 +17,16 @@ #include #include "service.h" #else -#if HAVE_PTHREAD_H -#include -#endif #include #include #endif + +#if YAZ_POSIX_THREADS +#include +#elif YAZ_GNU_THREADS +#include +#endif + #include #include #include @@ -416,6 +198,7 @@ void statserv_closedown() { /* Just destroy the IOCHAN, that should do the trick */ iochan_destroy(pCurrentThread->pIOChannel); + closesocket(pCurrentThread->pIOChannel->fd); /* Keep a running count of our handles */ iHandles++; @@ -445,6 +228,7 @@ void statserv_closedown() /* Now we can really do something */ if (iHandles > 0) { + logf (LOG_LOG, "waiting for %d to die", iHandles); /* This will now wait, until all the threads close */ WaitForMultipleObjects(iHandles, pThreadHandles, TRUE, INFINITE); @@ -571,6 +355,7 @@ void sigterm(int sig) } static void *new_session (void *vp); +static int no_sessions = 0; /* UNIX listener */ static void listener(IOCHAN h, int event) @@ -586,6 +371,7 @@ static void listener(IOCHAN h, int event) { int res; + ++no_sessions; if (pipe(hand) < 0) { yaz_log(LOG_FATAL|LOG_ERRNO, "pipe"); @@ -678,9 +464,11 @@ static void listener(IOCHAN h, int event) close(hand[1]); } else + { iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */ - -#if HAVE_PTHREAD_H + ++no_sessions; + } +#if YAZ_POSIX_THREADS if (control_block.threads) { pthread_t child_thread; @@ -689,6 +477,23 @@ static void listener(IOCHAN h, int event) } else new_session(new_line); +#elif YAZ_GNU_THREADS + if (control_block.threads) + { + pth_attr_t attr; + pth_t child_thread; + + attr = pth_attr_new (); + pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE); + pth_attr_set (attr, PTH_ATTR_STACK_SIZE, 32*1024); + pth_attr_set (attr, PTH_ATTR_NAME, "session"); + yaz_log (LOG_LOG, "pth_spawn begin"); + child_thread = pth_spawn (attr, new_session, new_line); + yaz_log (LOG_LOG, "pth_spawn finish"); + pth_attr_destroy (attr); + } + else + new_session(new_line); #else new_session(new_line); #endif @@ -714,13 +519,11 @@ static void *new_session (void *vp) if (mask) { - yaz_log (LOG_LOG, "new_session , accept incomplete"); cs_accept_mask = mask; /* accept didn't complete */ cs_get_mask = 0; } else { - yaz_log (LOG_LOG, "new_session , accept complete"); cs_accept_mask = 0; /* accept completed. */ cs_get_mask = mask = EVENT_INPUT; } @@ -741,8 +544,8 @@ static void *new_session (void *vp) iochan_setdata(new_chan, newas); iochan_settimeout(new_chan, control_block.idle_timeout * 60); a = cs_addrstr(new_line); - yaz_log(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]"); - + yaz_log(LOG_LOG, "Starting session %d from %s", + no_sessions, a ? a : "[Unknown]"); if (control_block.threads) { event_loop(&new_chan); @@ -773,7 +576,9 @@ static void inetd_connection(int what) iochan_setdata(chan, assoc); iochan_settimeout(chan, control_block.idle_timeout * 60); addr = cs_addrstr(line); - yaz_log(LOG_LOG, "Inetd association from %s", addr ? addr : "[UNKNOWN]"); + yaz_log(LOG_LOG, "Inetd association from %s", + addr ? addr : "[UNKNOWN]"); + assoc->cs_get_mask = EVENT_INPUT; } else { @@ -799,47 +604,24 @@ static void inetd_connection(int what) static void add_listener(char *where, int what) { COMSTACK l; - CS_TYPE type; - char mode[100], addr[100]; void *ap; IOCHAN lst = NULL; + const char *mode; - if (!where || sscanf(where, "%[^:]:%s", mode, addr) != 2) - { - yaz_log (LOG_WARN, "%s: Address format: ('tcp'|'ssl')':'
", - me); - return; - } - if (!strcmp(mode, "tcp")) - type = tcpip_type; - else if (!strcmp(mode, "ssl")) - { -#if HAVE_OPENSSL_SSL_H - type = ssl_type; -#else - yaz_log (LOG_WARN, "SSL Transport not allowed by configuration."); - return; -#endif - } + if (control_block.dynamic) + mode = "dynamic"; + else if (control_block.threads) + mode = "threaded"; else + mode = "static"; + + yaz_log(LOG_LOG, "Adding %s %s listener on %s", mode, + what == PROTO_SR ? "SR" : "Z3950", where); + + l = cs_create_host(where, 0, &ap); + if (!l) { - yaz_log (LOG_WARN, "You must specify either 'ssl:' or 'tcp:'"); - return; - } - yaz_log(LOG_LOG, "Adding %s %s listener on %s", - control_block.dynamic ? "dynamic" : - (control_block.threads ? "threaded" : "static"), - what == PROTO_SR ? "SR" : "Z3950", where); - if (!(l = cs_create(type, 0, what))) - { - yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create listener"); - return; - } - ap = cs_straddr (l, addr); - if (!ap) - { - fprintf(stderr, "Address resolution failed.\n"); - cs_close (l); + yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to listen on %s", where); return; } if (cs_bind(l, ap, CS_SERVER) < 0) @@ -889,7 +671,6 @@ int statserv_start(int argc, char **argv) { int ret; - nmem_init (); #ifdef WIN32 /* We need to initialize the thread list */ ThreadList_Initialize(); @@ -957,7 +738,6 @@ int statserv_start(int argc, char **argv) yaz_log(LOG_LOG, "Entering event loop."); ret = event_loop(&pListener); } - nmem_exit (); return ret; } @@ -987,7 +767,10 @@ int check_options(int argc, char **argv) control_block.dynamic = 0; break; case 'T': -#if HAVE_PTHREAD_H +#if YAZ_POSIX_THREADS + control_block.dynamic = 0; + control_block.threads = 1; +#elif YAZ_GNU_THREADS control_block.dynamic = 0; control_block.threads = 1; #else