X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fstatserv.c;h=7d24826e0f137d5ddbc57b341f30c2da06ee7905;hb=b2d4fae21009b1909a35ef9ae6bcd27c1a5dca74;hp=154db57a7ffd47a9da3ff3fd3103e71cb66f48bd;hpb=225a451c3b6a46e0034060affad7df94b18ba3aa;p=yaz-moved-to-github.git diff --git a/server/statserv.c b/server/statserv.c index 154db57..7d24826 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -4,7 +4,43 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: statserv.c,v $ - * Revision 1.19 1995-05-16 09:37:27 quinn + * 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 @@ -76,6 +112,9 @@ #include #include #include +#include +#include +#include #include #include @@ -86,7 +125,6 @@ #ifdef USE_XTIMOSI #include #endif -#include #include #include @@ -99,15 +137,14 @@ static statserv_options_block control_block = { LOG_DEFAULT_LEVEL, /* log level */ "", /* no PDUs */ "", /* diagnostic output to stderr */ - "tcp:localhost:9999", /* default listener port */ - PROTO_Z3950, /* application protocol */ + "tcp:@:9999", /* default listener port */ + PROTO_Z3950, /* default application protocol */ 60, /* idle timeout (minutes) */ - 1024*1024*4, /* maximum PDU size (approx.) to allow */ - "default-config" /* configuration name to pass to backend */ + 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 @@ -185,6 +222,7 @@ static void listener(IOCHAN h, int event) { COMSTACK new_line; IOCHAN new_chan; + char *a; if (!(new_line = cs_accept(line))) { @@ -222,7 +260,9 @@ static void listener(IOCHAN h, int event) exit(1); } iochan_setdata(new_chan, newas); - logf(LOG_LOG, "accepted connection"); + iochan_settimeout(new_chan, control_block.idle_timeout * 60); + a = cs_addrstr(new_line); + logf(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]"); } else { @@ -257,17 +297,20 @@ static void add_listener(char *where, int what) } type = tcpip_type; } -#ifdef USE_XTIMOSI else if (!strcmp(mode, "osi")) { +#ifdef USE_XTIMOSI if (!(ap = mosi_strtoaddr(addr))) { fprintf(stderr, "Address resolution failed for TCP.\n"); exit(1); } type = mosi_type; - } +#else + fprintf(stderr, "OSI Transport not allowed by configuration.\n"); + exit(1); #endif + } else { fprintf(stderr, "You must specify either 'osi:' or 'tcp:'.\n"); @@ -297,7 +340,8 @@ static void add_listener(char *where, int what) static void catchchld(int num) { - while (waitpid(-1, 0, WNOHANG) > 0); + while (waitpid(-1, 0, WNOHANG) > 0) + ; signal(SIGCHLD, catchchld); } @@ -321,7 +365,7 @@ int statserv_main(int argc, char **argv) int protocol = control_block.default_proto; me = argv[0]; - while ((ret = options("a:szSl:v:", argv, argc, &arg)) != -2) + while ((ret = options("a:szSl:v:u:c:", argv, argc, &arg)) != -2) { switch (ret) { @@ -329,8 +373,8 @@ int statserv_main(int argc, char **argv) add_listener(arg, protocol); listeners++; break; - case 'z': protocol = CS_Z3950; break; - case 's': protocol = CS_SR; break; + case 'z': protocol = PROTO_Z3950; break; + case 's': protocol = PROTO_SR; break; case 'S': control_block.dynamic = 0; break; case 'l': strcpy(control_block.logfile, arg ? arg : ""); @@ -342,15 +386,36 @@ int statserv_main(int argc, char **argv) break; case 'a': 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; default: - fprintf(stderr, "Usage: %s [ -a -v -l -zsS ... ]\n", me); + fprintf(stderr, "Usage: %s [ -a -v " + " -l -u -c " + " -zsS ... ]\n", me); exit(1); - } + } } 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; + + if (!(pw = getpwnam(control_block.setuid))) + { + logf(LOG_FATAL, "%s: Unknown user", control_block.setuid); + exit(1); + } + if (setuid(pw->pw_uid) < 0) + { + logf(LOG_FATAL|LOG_ERRNO, "setuid"); + exit(1); + } + } logf(LOG_LOG, "Entering event loop."); return event_loop();