Fixed Makefile(s).
[yaz-moved-to-github.git] / server / statserv.c
index 64477ea..9246daa 100644 (file)
@@ -7,7 +7,21 @@
  *   Chas Woodfield, Fretwell Downing Datasystem.
  *
  * $Log: statserv.c,v $
- * Revision 1.41  1997-09-29 07:19:32  adam
+ * Revision 1.44  1997-11-07 13:31:52  adam
+ * Added NT Service name part of statserv_options_block. Moved NT
+ * service utility to server library.
+ *
+ * Revision 1.43  1997/10/31 12:20:09  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.42  1997/10/27 14:03:02  adam
+ * Added new member to statserver_options_block, pre_init, which
+ * specifies a callback to be invoked after command line parsing and
+ * before the server listens for the first time.
+ *
+ * Revision 1.41  1997/09/29 07:19:32  adam
  * Server library uses nmem_init/nmem_exit. The log prefix no longer
  * includes leading path on NT.
  *
 #include <process.h>
 #include <winsock.h>
 #include <direct.h>
+#include "service.h"
 #else
 #include <unistd.h>
 #include <pwd.h>
@@ -181,7 +196,9 @@ static statserv_options_block control_block = {
     60,                         /* idle timeout (minutes) */
     1024*1024,                  /* maximum PDU size (approx.) to allow */
     "default-config",           /* configuration name to pass to backend */
-    ""                          /* set user id */
+    "",                         /* set user id */
+    NULL,                       /* pre init handler */
+    "Z39.50 Server"             /* NT Service Name */
 };
 
 /*
@@ -394,9 +411,11 @@ static void listener(IOCHAN h, int event)
        logf(LOG_DEBUG, "Setting timeout %d", control_block.idle_timeout);
        iochan_setdata(new_chan, newas);
        iochan_settimeout(new_chan, control_block.idle_timeout * 60);
+#ifndef WINDOWS
        logf(LOG_DEBUG, "Determining client address");
        a = cs_addrstr(new_line);
        logf(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]");
+#endif
     /* Now what we need todo is create a new thread with this iochan as
        the parameter */
     /* if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)event_loop, new_chan,
@@ -695,7 +714,8 @@ void statserv_setcontrol(statserv_options_block *block)
     memcpy(&control_block, block, sizeof(*block));
 }
 
-int statserv_main(int argc, char **argv)
+
+int statserv_start(int argc, char **argv)
 {
     int ret, listeners = 0, inetd = 0, r;
     char *arg;
@@ -777,10 +797,6 @@ int statserv_main(int argc, char **argv)
             }
     }
 
-#if 0
-    log_init(control_block.loglevel, NULL, control_block.logfile);
-#endif /* WINDOWS */
-
     if ((pListener == NULL) && *control_block.default_listen)
            add_listener(control_block.default_listen, protocol);
 
@@ -789,6 +805,8 @@ int statserv_main(int argc, char **argv)
        inetd_connection(protocol);
     else
     {
+       if (control_block.pre_init)
+           (*control_block.pre_init)(&control_block);
        if (control_block.dynamic)
            signal(SIGCHLD, catchchld);
     }
@@ -818,3 +836,62 @@ int statserv_main(int argc, char **argv)
     nmem_exit ();
     return ret;
 }
+
+#ifdef WINDOWS
+typedef struct _Args
+{
+    char **argv;
+    int argc;
+} Args; 
+
+static Args ArgDetails;
+
+/* name of the executable */
+#define SZAPPNAME            "server"
+
+/* list of service dependencies - "dep1\0dep2\0\0" */
+#define SZDEPENDENCIES       ""
+
+int statserv_main(int argc, char **argv)
+{
+    statserv_options_block *cb = statserv_getcontrol();
+
+        /* Lets setup the Arg structure */
+    ArgDetails.argc = argc;
+    ArgDetails.argv = argv;
+
+    /* Now setup the service with the service controller */
+    SetupService(argc, argv, &ArgDetails, SZAPPNAME,
+        cb->service_name, /* internal service name */
+        cb->service_name, /* displayed name of the service */
+        SZDEPENDENCIES);
+    return 0;
+}
+
+int StartAppService(void *pHandle, int argc, char **argv)
+{
+    /* Initializes the App */
+    return 1;
+}
+
+void RunAppService(void *pHandle)
+{
+    Args *pArgs = (Args *)pHandle;
+
+    /* Starts the app running */
+    statserv_start(pArgs->argc, pArgs->argv);
+}
+
+void StopAppService(void *pHandle)
+{
+    /* Stops the app */
+    statserv_closedown();
+}
+#else
+int statserv_main(int argc, char **argv)
+{
+    int ret = statserv_start (argc, argv);
+    statserv_closedown ();
+    return ret;
+}
+#endif