* Sebastian Hammer, Adam Dickmeiss
*
* $Log: statserv.c,v $
- * Revision 1.23 1995-06-15 12:30:48 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
+ * 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
#include <errno.h>
#include <sys/types.h>
#include <pwd.h>
+#include <sys/time.h>
#include <options.h>
#include <eventl.h>
#ifdef USE_XTIMOSI
#include <xmosi.h>
#endif
-#include <dmalloc.h>
#include <log.h>
#include <statserv.h>
LOG_DEFAULT_LEVEL, /* log level */
"", /* no PDUs */
"", /* diagnostic output to stderr */
- "tcp:@: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 */
+ 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
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);
}
{
COMSTACK new_line;
IOCHAN new_chan;
+ char *a;
if (!(new_line = cs_accept(line)))
{
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);
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
{
}
}
+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.
*/
}
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");
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)
{
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 <pdufile> -v <loglevel> -l <logfile> -u <user> -zsS <listener-addr> ... ]\n", me);
+ fprintf(stderr, "Usage: %s [ -i -a <pdufile> -v <loglevel>"
+ " -l <logfile> -u <user> -c <config> -t <minutes>"
+ " -k <kilobytes>"
+ " -zsS <listener-addr> -w <directory> ... ]\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;
if (!(pw = getpwnam(control_block.setuid)))
{
- logf(LOG_FATAL|LOG_ERRNO, "%s", control_block.setuid);
+ logf(LOG_FATAL, "%s: Unknown user", control_block.setuid);
exit(1);
}
if (setuid(pw->pw_uid) < 0)