Modify wrbuf_put_zquery and wrbuf_scan_term so the generated
[yaz-moved-to-github.git] / src / statserv.c
index ebd0b70..a32ce35 100644 (file)
@@ -5,7 +5,12 @@
  * NT threaded server code by
  *   Chas Woodfield, Fretwell Downing Informatics.
  *
- * $Id: statserv.c,v 1.5 2004-01-18 02:28:42 adam Exp $
+ * $Id: statserv.c,v 1.11 2004-11-16 17:08:11 heikki Exp $
+ */
+
+/**
+ * \file statserv.c
+ * \brief Implements GFS logic
  */
 
 #include <stdio.h>
 
 static IOCHAN pListener = NULL;
 
-static char *me = "statserver";
+static char *me = "statserver"; /* log prefix */
+static char *programname="statserver"; /* full program name */
 /*
  * default behavior.
  */
+#define STAT_DEFAULT_LOG_LEVEL "none,fatal,warn,log,server,session,request"
+/* the 'none' clears yaz' own default settings, including [log] */
+
 int check_options(int argc, char **argv);
 statserv_options_block control_block = {
     1,                          /* dynamic mode */
@@ -78,11 +87,28 @@ statserv_options_block control_block = {
 #endif /* WIN32 */
     0,                          /* SOAP handlers */
     "",                         /* PID fname */
-    0                           /* background daemon */
+    0,                          /* background daemon */
+    ""                          /* SSL certificate filename */
 };
 
 static int max_sessions = 0;
 
+static int logbits_set=0;
+static int log_session=0;
+static int log_server=0;
+
+/** get_logbits sets global loglevel bits */
+static void get_logbits(int force)
+{ /* needs to be called after parsing cmd-line args that can set loglevels!*/
+    if (force || !logbits_set)
+    {
+        logbits_set=1;
+        log_session=yaz_log_module_level("session");
+        log_server=yaz_log_module_level("server");
+    }
+}
+
+
 /*
  * handle incoming connect requests.
  * The dynamic mode is a bit tricky mostly because we want to avoid
@@ -232,7 +258,7 @@ void statserv_closedown()
         /* Now we can really do something */
         if (iHandles > 0)
         {
-            logf (LOG_LOG, "waiting for %d to die", iHandles);
+            logf (log_server, "waiting for %d to die", iHandles);
             /* This will now wait, until all the threads close */
             WaitForMultipleObjects(iHandles, pThreadHandles, TRUE, INFINITE);
 
@@ -417,11 +443,10 @@ static void listener(IOCHAN h, int event)
                        iochan_destroy(pp);
                    }
                }
-               sprintf(nbuf, "%s(%d)", me, getpid());
+               sprintf(nbuf, "%s(%d)", me, no_sessions);
                yaz_log_init(control_block.loglevel, nbuf, 0);
                 /* ensure that bend_stop is not called when each child exits -
-                   only for the main process .. 
-                */
+                   only for the main process ..  */
                 control_block.bend_stop = 0;
            }
            else /* parent */
@@ -509,9 +534,9 @@ static void listener(IOCHAN h, int event)
             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 begin");
+            yaz_log (LOG_DEBUG, "pth_spawn begin");
            child_thread = pth_spawn (attr, new_session, new_line);
-            yaz_log (LOG_LOG, "pth_spawn finish");
+            yaz_log (LOG_DEBUG, "pth_spawn finish");
             pth_attr_destroy (attr);
        }
        else
@@ -522,7 +547,7 @@ static void listener(IOCHAN h, int event)
     }
     else if (event == EVENT_TIMEOUT)
     {
-       yaz_log(LOG_LOG, "Shutting down listener.");
+       yaz_log(log_server, "Shutting down listener.");
         iochan_destroy(h);
     }
     else
@@ -574,8 +599,8 @@ static void *new_session (void *vp)
 #else
     a = 0;
 #endif
-    yaz_log(LOG_LOG, "Starting session %d from %s",
-        no_sessions, a ? a : "[Unknown]");
+    yaz_log(log_session, "Starting session from %s (pid=%d)",
+        a ? a : "[Unknown]", getpid());
     if (max_sessions && no_sessions == max_sessions)
         control_block.one_shot = 1;
     if (control_block.threads)
@@ -609,7 +634,7 @@ static void inetd_connection(int what)
                 iochan_setdata(chan, assoc);
                 iochan_settimeout(chan, 60);
                 addr = cs_addrstr(line);
-                yaz_log(LOG_LOG, "Inetd association from %s",
+                yaz_log(log_session, "Inetd association from %s",
                         addr ? addr : "[UNKNOWN]");
                assoc->cs_get_mask = EVENT_INPUT;
             }
@@ -648,15 +673,18 @@ static int add_listener(char *where, int what)
     else
        mode = "static";
 
-    yaz_log(LOG_LOG, "Adding %s %s listener on %s", mode,
+    yaz_log(log_server, "Adding %s %s listener on %s", mode,
            what == PROTO_SR ? "SR" : "Z3950", where);
 
     l = cs_create_host(where, 2, &ap);
     if (!l)
     {
-       yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to listen on %s", where);
+       yaz_log(LOG_FATAL, "Failed to listen on %s", where);
        return -1;
     }
+    if (*control_block.cert_fname)
+       cs_set_ssl_certificate_file(l, control_block.cert_fname);
+
     if (cs_bind(l, ap, CS_SERVER) < 0)
     {
        yaz_log(LOG_FATAL|LOG_ERRNO, "Failed to bind to %s", where);
@@ -708,7 +736,7 @@ static void statserv_reset(void)
 int statserv_start(int argc, char **argv)
 {
     int ret = 0;
-
+    char sep;
 #ifdef WIN32
     /* We need to initialize the thread list */
     ThreadList_Initialize();
@@ -716,20 +744,23 @@ int statserv_start(int argc, char **argv)
 #endif
     
 #ifdef WIN32
-    if ((me = strrchr (argv[0], '\\')))
-       me++;
-    else
-       me = argv[0];
+    sep='\\';
 #else
-    me = argv[0];
+    sep='/';
 #endif
+    if ((me = strrchr (argv[0], sep)))
+       me++; /* get the basename */
+    else
+       me = argv[0];
+    programname=argv[0];
+
     if (control_block.options_func(argc, argv))
         return(1);
     
     if (control_block.bend_start)
         (*control_block.bend_start)(&control_block);
 #ifdef WIN32
-    yaz_log (LOG_LOG, "Starting server %s", me);
+    yaz_log (log_server, "Starting server %s", me);
     if (!pListener && *control_block.default_listen)
        add_listener(control_block.default_listen,
                     control_block.default_proto);
@@ -783,7 +814,8 @@ int statserv_start(int argc, char **argv)
            fclose(f);
        }
 
-       yaz_log (LOG_LOG, "Starting server %s pid=%d", me, getpid());
+       yaz_log (log_server, "Starting server %s pid=%d", programname, getpid());
+        
 #if 0
        sigset_t sigs_to_block;
        
@@ -822,7 +854,7 @@ int statserv_start(int argc, char **argv)
        ret = 1;
     else
     {
-       yaz_log(LOG_LOG, "Entering event loop.");
+       yaz_log(LOG_DEBUG, "Entering event loop.");
         ret = event_loop(&pListener);
     }
     return ret;
@@ -833,7 +865,12 @@ int check_options(int argc, char **argv)
     int ret = 0, r;
     char *arg;
 
-    while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:A:p:D", argv, argc, &arg)) != -2)
+    /* set default log level */
+    control_block.loglevel = yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL);
+    yaz_log_init_level(control_block.loglevel);
+
+    while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:A:p:DC:",
+                         argv, argc, &arg)) != -2)
     {
        switch (ret)
        {
@@ -872,7 +909,7 @@ int check_options(int argc, char **argv)
            yaz_log_init(control_block.loglevel, me, control_block.logfile);
            break;
        case 'v':
-           control_block.loglevel = yaz_log_mask_str(arg);
+           control_block.loglevel = yaz_log_mask_str_x(arg,control_block.loglevel);
            yaz_log_init(control_block.loglevel, me, control_block.logfile);
            break;
        case 'a':
@@ -884,6 +921,9 @@ int check_options(int argc, char **argv)
        case 'c':
            strcpy(control_block.configname, arg ? arg : "");
            break;
+       case 'C':
+           strcpy(control_block.cert_fname, arg ? arg : "");
+           break;
        case 'd':
            strcpy(control_block.daemon_name, arg ? arg : "");
            break;
@@ -930,11 +970,12 @@ int check_options(int argc, char **argv)
        default:
            fprintf(stderr, "Usage: %s [ -a <pdufile> -v <loglevel>"
                    " -l <logfile> -u <user> -c <config> -t <minutes>"
-                   " -k <kilobytes> -d <daemon> -p <pidfile>"
+                   " -k <kilobytes> -d <daemon> -p <pidfile> -C certfile"
                         " -ziDST1 -w <directory> <listener-addr>... ]\n", me);
            return 1;
         }
     }
+    get_logbits(1); 
     return 0;
 }