* NT threaded server code by
* Chas Woodfield, Fretwell Downing Informatics.
*
- * $Id: statserv.c,v 1.89 2003-01-13 14:32:06 adam Exp $
+ * $Id: statserv.c,v 1.98 2003-03-03 19:57:35 adam Exp $
*/
#include <stdio.h>
"", /* diagnostic output to stderr */
"tcp:@:9999", /* default listener port */
PROTO_Z3950, /* default application protocol */
- 60, /* idle timeout (minutes) */
+ 15, /* idle timeout (minutes) */
1024*1024, /* maximum PDU size (approx.) to allow */
"default-config", /* configuration name to pass to backend */
"", /* set user id */
0, /* default value for inet deamon */
0, /* handle (for service, etc) */
0, /* bend_init handle */
- 0 /* bend_close handle */
+ 0, /* bend_close handle */
#ifdef WIN32
- ,"Z39.50 Server", /* NT Service Name */
+ "Z39.50 Server", /* NT Service Name */
"Server", /* NT application Name */
"", /* NT Service Dependencies */
- "Z39.50 Server" /* NT Service Display Name */
+ "Z39.50 Server", /* NT Service Display Name */
#endif /* WIN32 */
+ 0 /* SOAP handlers */
};
+static int max_sessions = 0;
+
/*
* handle incoming connect requests.
* The dynamic mode is a bit tricky mostly because we want to avoid
yaz_log(LOG_DEBUG, "Setting timeout %d", control_block.idle_timeout);
iochan_setdata(new_chan, newas);
- iochan_settimeout(new_chan, control_block.idle_timeout * 60);
+ iochan_settimeout(new_chan, 60);
/* Now what we need todo is create a new thread with this iochan as
the parameter */
if ((res = cs_listen_check(line, 0, 0, control_block.check_ip,
control_block.daemon_name)) < 0)
{
- yaz_log(LOG_WARN, "cs_listen failed");
+ yaz_log(LOG_WARN|LOG_ERRNO, "cs_listen failed");
return;
}
else if (res == 1)
newas->cs_get_mask = cs_get_mask;
iochan_setdata(new_chan, newas);
- iochan_settimeout(new_chan, control_block.idle_timeout * 60);
+ iochan_settimeout(new_chan, 60);
+#if 1
a = cs_addrstr(new_line);
+#else
+ a = 0;
+#endif
yaz_log(LOG_LOG, "Starting session %d from %s",
no_sessions, a ? a : "[Unknown]");
+ if (max_sessions && no_sessions == max_sessions)
+ control_block.one_shot = 1;
if (control_block.threads)
{
event_loop(&new_chan);
if ((assoc = create_association(chan, line)))
{
iochan_setdata(chan, assoc);
- iochan_settimeout(chan, control_block.idle_timeout * 60);
+ iochan_settimeout(chan, 60);
addr = cs_addrstr(line);
yaz_log(LOG_LOG, "Inetd association from %s",
addr ? addr : "[UNKNOWN]");
memcpy(&control_block, block, sizeof(*block));
}
+static void statserv_reset(void)
+{
+}
+
int statserv_start(int argc, char **argv)
{
int ret;
if (control_block.bend_start)
(*control_block.bend_start)(&control_block);
#ifdef WIN32
- logf (LOG_LOG, "Starting server %s", me);
+ yaz_log (LOG_LOG, "Starting server %s", me);
#else
/* UNIX */
if (control_block.inetd)
int ret = 0, r;
char *arg;
- while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:", argv, argc, &arg)) != -2)
+ while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:D:", argv, argc, &arg)) != -2)
{
switch (ret)
{
return 1;
}
break;
+ case 'D':
+ max_sessions = atoi(arg);
+ break;
default:
fprintf(stderr, "Usage: %s [ -a <pdufile> -v <loglevel>"
" -l <logfile> -u <user> -c <config> -t <minutes>"
{
/* Stops the app */
statserv_closedown();
+ statserv_reset();
}
/* WIN32 */
#else
statserv_setcontrol(cb);
ret = statserv_start (argc, argv);
statserv_closedown ();
+ statserv_reset();
return ret;
}
#endif