* Chas Woodfield, Fretwell Downing Informatics.
*
* $Log: statserv.c,v $
- * Revision 1.70 2001-02-01 08:52:26 adam
+ * Revision 1.75 2001-10-04 00:37:58 adam
+ * Fixes for GNU threads (not working yet).
+ *
+ * Revision 1.74 2001/10/03 23:55:18 adam
+ * GNU threads support.
+ *
+ * Revision 1.73 2001/06/28 09:27:06 adam
+ * Number of started sessions logged.
+ *
+ * Revision 1.72 2001/03/25 21:55:13 adam
+ * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
+ *
+ * Revision 1.71 2001/03/21 12:43:36 adam
+ * Implemented cs_create_host. Better error reporting for SSL comstack.
+ *
+ * Revision 1.70 2001/02/01 08:52:26 adam
* Fixed bug regarding inetd mode.
*
* Revision 1.69 2000/12/01 17:56:41 adam
#include <direct.h>
#include "service.h"
#else
+
+#ifdef _REENTRANT
#if HAVE_PTHREAD_H
#include <pthread.h>
+#elif HAVE_PTH_H
+#include <pth.h>
+#endif
#endif
+
#include <unistd.h>
#include <pwd.h>
#endif
}
static void *new_session (void *vp);
+static int no_sessions = 0;
/* UNIX listener */
static void listener(IOCHAN h, int event)
{
int res;
+ ++no_sessions;
if (pipe(hand) < 0)
{
yaz_log(LOG_FATAL|LOG_ERRNO, "pipe");
close(hand[1]);
}
else
+ {
iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
-
+ ++no_sessions;
+ }
+#ifdef _REENTRANT
#if HAVE_PTHREAD_H
if (control_block.threads)
{
}
else
new_session(new_line);
+#elif HAVE_PTH_H
+ if (control_block.threads)
+ {
+ pth_attr_t attr;
+ pth_t child_thread;
+
+ attr = pth_attr_new ();
+ pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE);
+ pth_attr_set (attr, PTH_ATTR_STACK_SIZE, 32*1024);
+ pth_attr_set (attr, PTH_ATTR_NAME, "session");
+ yaz_log (LOG_LOG, "pth_spawn");
+ child_thread = pth_spawn (attr, new_session, new_line);
+#if 0
+ pth_attr_destroy (attr);
+#endif
+ }
+ else
+ new_session(new_line);
+#endif
+
#else
new_session(new_line);
#endif
iochan_setdata(new_chan, newas);
iochan_settimeout(new_chan, control_block.idle_timeout * 60);
a = cs_addrstr(new_line);
- yaz_log(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]");
+ yaz_log(LOG_LOG, "Starting session %d from %s", no_sessions, a ? a : "[Unknown]");
if (control_block.threads)
{
static void add_listener(char *where, int what)
{
COMSTACK l;
- CS_TYPE type;
- char mode[100], addr[100];
void *ap;
IOCHAN lst = NULL;
+ const char *mode;
- if (!where || sscanf(where, "%[^:]:%s", mode, addr) != 2)
- {
- yaz_log (LOG_WARN, "%s: Address format: ('tcp'|'ssl')':'<address>",
- me);
- return;
- }
- if (!strcmp(mode, "tcp"))
- type = tcpip_type;
- else if (!strcmp(mode, "ssl"))
- {
-#if HAVE_OPENSSL_SSL_H
- type = ssl_type;
-#else
- yaz_log (LOG_WARN, "SSL Transport not allowed by configuration.");
- return;
-#endif
- }
+ if (control_block.dynamic)
+ mode = "dynamic";
+ else if (control_block.threads)
+ mode = "threaded";
else
+ mode = "static";
+
+ yaz_log(LOG_LOG, "Adding %s %s listener on %s", mode,
+ what == PROTO_SR ? "SR" : "Z3950", where);
+
+ l = cs_create_host(where, 0, &ap);
+ if (!l)
{
- yaz_log (LOG_WARN, "You must specify either 'ssl:' or 'tcp:'");
- return;
- }
- yaz_log(LOG_LOG, "Adding %s %s listener on %s",
- control_block.dynamic ? "dynamic" :
- (control_block.threads ? "threaded" : "static"),
- what == PROTO_SR ? "SR" : "Z3950", where);
- if (!(l = cs_create(type, 0, what)))
- {
- yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to create listener");
- return;
- }
- ap = cs_straddr (l, addr);
- if (!ap)
- {
- fprintf(stderr, "Address resolution failed.\n");
- cs_close (l);
+ yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to listen on %s", where);
return;
}
if (cs_bind(l, ap, CS_SERVER) < 0)
control_block.dynamic = 0;
break;
case 'T':
-#if HAVE_PTHREAD_H
+#if _REENTRANT
control_block.dynamic = 0;
control_block.threads = 1;
#else