* Sebastian Hammer, Adam Dickmeiss
*
* $Log: statserv.c,v $
- * Revision 1.19 1995-05-16 09:37:27 quinn
+ * 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
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
+#include <sys/types.h>
+#include <pwd.h>
#include <options.h>
#include <eventl.h>
LOG_DEFAULT_LEVEL, /* log level */
"", /* no PDUs */
"", /* diagnostic output to stderr */
- "tcp:localhost:9999", /* default listener port */
- PROTO_Z3950, /* application protocol */
- 60, /* idle timeout (minutes) */
- 1024*1024*4, /* maximum PDU size (approx.) to allow */
- "default-config" /* configuration name to pass to backend */
+ "tcp:@:9999", /* default listener port */
+ PROTO_Z3950, /* default application protocol */
+ 2*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"
exit(1);
}
iochan_setdata(new_chan, newas);
+ iochan_settimeout(new_chan, control_block.idle_timeout * 60);
logf(LOG_LOG, "accepted connection");
}
else
}
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");
static void catchchld(int num)
{
- while (waitpid(-1, 0, WNOHANG) > 0);
+ while (waitpid(-1, 0, WNOHANG) > 0)
+ ;
signal(SIGCHLD, catchchld);
}
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:", argv, argc, &arg)) != -2)
{
switch (ret)
{
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 : "");
break;
case 'a':
strcpy(control_block.apdufile, arg ? arg : ""); break;
+ case 'u':
+ strcpy(control_block.setuid, arg ? arg : ""); break;
default:
- fprintf(stderr, "Usage: %s [ -a <apdufile> -v <loglevel> -l <logfile> -zsS <listener-addr> ... ]\n", me);
+ fprintf(stderr, "Usage: %s [ -a <pdufile> -v <loglevel> -l <logfile> -u <user> -zsS <listener-addr> ... ]\n", me);
exit(1);
}
}
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();