X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fstatserv.c;h=766a87323bfc3d77567f95d2ed7437da2da1a003;hp=a692eb233b41a1f45693f869090e67a11f902a52;hb=e0816c15e2756bff6ef9265ac72ad5baf5306be9;hpb=63cafe41a93427118959a74201b3e331169a71d9 diff --git a/server/statserv.c b/server/statserv.c index a692eb2..766a873 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -4,7 +4,28 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: statserv.c,v $ - * Revision 1.28 1995-09-29 17:12:30 quinn + * 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 @@ -116,7 +137,6 @@ #ifdef USE_XTIMOSI #include #endif -#include #include #include @@ -131,14 +151,12 @@ static statserv_options_block control_block = { "", /* diagnostic output to stderr */ "tcp:@:9999", /* default listener port */ PROTO_Z3950, /* default application protocol */ - 2*60, /* idle timeout (minutes) */ + 60, /* idle timeout (minutes) */ 1024*1024, /* maximum PDU size (approx.) to allow */ "default-config", /* configuration name to pass to backend */ "" /* set user id */ }; -#define DEFAULT_LISTENER "tcp:localhost:9999" - /* * handle incoming connect requests. * The dynamic mode is a bit tricky mostly because we want to avoid @@ -172,9 +190,19 @@ static void listener(IOCHAN h, int event) else if (res == 0) /* child */ { char nbuf[100]; + IOCHAN pp; close(hand[0]); child = 1; + for (pp = iochan_getchan(); pp; pp = iochan_getnext(pp)) + { + if (pp != h) + { + COMSTACK l = iochan_getdata(pp); + cs_close(l); + iochan_destroy(pp); + } + } sprintf(nbuf, "%s(%d)", me, getpid()); log_init(control_block.loglevel, nbuf, 0); } @@ -216,6 +244,7 @@ static void listener(IOCHAN h, int event) { COMSTACK new_line; IOCHAN new_chan; + char *a; if (!(new_line = cs_accept(line))) { @@ -227,7 +256,7 @@ static void listener(IOCHAN h, int event) if (control_block.dynamic) { IOCHAN pp; - /* close our half of the listener sockets */ + /* close our half of the listener socket */ for (pp = iochan_getchan(); pp; pp = iochan_getnext(pp)) { COMSTACK l = iochan_getdata(pp); @@ -254,7 +283,8 @@ static void listener(IOCHAN h, int event) } iochan_setdata(new_chan, newas); iochan_settimeout(new_chan, control_block.idle_timeout * 60); - logf(LOG_LOG, "accepted connection"); + a = cs_addrstr(new_line); + logf(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]"); } else { @@ -263,6 +293,34 @@ static void listener(IOCHAN h, int event) } } +static void inetd_connection(int what) +{ + COMSTACK line; + IOCHAN chan; + association *assoc; + char *addr; + + if (!(line = cs_createbysocket(0, tcpip_type, 0, what))) + { + logf(LOG_ERRNO|LOG_FATAL, "Failed to create comstack on socket 0"); + exit(1); + } + if (!(chan = iochan_create(cs_fileno(line), ir_session, EVENT_INPUT))) + { + logf(LOG_FATAL, "Failed to create iochan"); + exit(1); + } + if (!(assoc = create_association(chan, line))) + { + logf(LOG_FATAL, "Failed to create association structure"); + exit(1); + } + iochan_setdata(chan, assoc); + iochan_settimeout(chan, control_block.idle_timeout * 60); + addr = cs_addrstr(line); + logf(LOG_LOG, "Inetd association from %s", addr ? addr : "[UNKNOWN]"); +} + /* * Set up a listening endpoint, and give it to the event-handler. */ @@ -352,12 +410,12 @@ void statserv_setcontrol(statserv_options_block *block) int statserv_main(int argc, char **argv) { - int ret, listeners = 0; + int ret, listeners = 0, inetd = 0, r; char *arg; int protocol = control_block.default_proto; me = argv[0]; - while ((ret = options("a:szSl:v:u:", argv, argc, &arg)) != -2) + while ((ret = options("a:iszSl:v:u:c:w:t:k:", argv, argc, &arg)) != -2) { switch (ret) { @@ -380,15 +438,52 @@ int statserv_main(int argc, char **argv) strcpy(control_block.apdufile, arg ? arg : ""); break; case 'u': strcpy(control_block.setuid, arg ? arg : ""); break; + case 'c': + strcpy(control_block.configname, arg ? arg : ""); break; + case 't': + if (!arg || !(r = atoi(arg))) + { + fprintf(stderr, "%s: Specify positive timeout for -t.\n", + me); + exit(1); + } + control_block.idle_timeout = r; + break; + case 'k': + if (!arg || !(r = atoi(arg))) + { + fprintf(stderr, "%s: Specify positive timeout for -t.\n", + me); + exit(1); + } + control_block.maxrecordsize = r * 1024; + break; + case 'i': + inetd = 1; break; + case 'w': + if (chdir(arg)) + { + perror(arg); + exit(1); + } + break; default: - fprintf(stderr, "Usage: %s [ -a -v -l -u -zsS ... ]\n", me); + fprintf(stderr, "Usage: %s [ -i -a -v " + " -l -u -c -t " + " -k " + " -zsS -w ... ]\n", me); exit(1); - } + } + } + if (inetd) + inetd_connection(protocol); + else + { + if (control_block.dynamic) + signal(SIGCHLD, catchchld); + if (!listeners && *control_block.default_listen) + add_listener(control_block.default_listen, protocol); } - if (control_block.dynamic) - signal(SIGCHLD, catchchld); - if (!listeners && *control_block.default_listen) - add_listener(control_block.default_listen, protocol); if (*control_block.setuid) { struct passwd *pw;