Scope classes, tweak for TIME_UTC
[metaproxy-moved-to-github.git] / src / metaproxy_prog.cpp
index ce60c60..28651ae 100644 (file)
@@ -47,41 +47,67 @@ namespace mp = metaproxy_1;
 
 mp::RouterFleXML *routerp = 0;
 
+static void set_log_prefix(void)
+{
+#if HAVE_UNISTD_H
+    char str[80];
+
+    sprintf(str, "%lld", (long long) getpid());
+    yaz_log_init_prefix(str);
+#endif
+}
+
 #if HAVE_UNISTD_H
 static pid_t process_group = 0;
 
-static void sig_term_handler(int s)
+static void sig_usr1_handler(int s)
 {
+    yaz_log(YLOG_LOG, "metaproxy received SIGUSR1");
     routerp->stop();
-#if 0
+}
+
+static void sig_term_handler(int s)
+{
+    yaz_log(YLOG_LOG, "metaproxy received SIGTERM");
+    yaz_log(YLOG_LOG, "metaproxy stop");
     kill(-process_group, SIGTERM); /* kill all children processes as well */
     _exit(0);
-#endif
 }
 #endif
 
-static void handler_debug(void *data)
+static void work_common(void *data)
 {
+    set_log_prefix();
 #if HAVE_UNISTD_H
     process_group = getpgid(0); // save process group ID
-    
+
     signal(SIGTERM, sig_term_handler);
+    signal(SIGUSR1, sig_usr1_handler);
 #endif
     routerp = (mp::RouterFleXML*) data;
     routerp->start();
 
     mp::Package pack;
-    pack.router(*routerp).move(); /* should never exit */
+    pack.router(*routerp).move();
+    yaz_log(YLOG_LOG, "metaproxy stop"); /* only for graceful stop */
+#if HAVE_UNISTD_H
+    kill(-process_group, SIGTERM); /* kill all children processes as well */
+#endif
     _exit(0);
 }
-    
-static void handler_normal(void *data)
+
+static void work_debug(void *data)
+{
+    work_common(data);
+}
+
+static void work_normal(void *data)
 {
 #if HAVE_UNISTD_H
     /* make the current working process group leader */
     setpgid(0, 0);
 #endif
-    handler_debug(data);
+    work_common(data);
 }
 
 static int sc_main(
@@ -95,8 +121,10 @@ static int sc_main(
     unsigned mode = 0;
     const char *pidfile = 0;
     const char *uid = 0;
-    
-    while ((ret = options("c{config}:Dh{help}l:p:tu:V{version}w:X", 
+
+    set_log_prefix();
+
+    while ((ret = options("c{config}:Dh{help}l:p:tu:V{version}w:X",
                           argv, argc, &arg)) != -2)
     {
         switch (ret)
@@ -123,7 +151,7 @@ static int sc_main(
                 " -install      install windows service\n"
                 " -remove       remove windows service\n"
 #endif
-                
+
                       << std::endl;
             break;
         case 'l':
@@ -153,7 +181,7 @@ static int sc_main(
 #else
                 chdir(arg)
 #endif
-                ) 
+                )
             {
                 std::cerr << "chdir " << arg << " failed" << std::endl;
                 return 1;
@@ -171,21 +199,23 @@ static int sc_main(
         std::cerr << "No configuration given; use -h for help\n";
         return 1;
     }
-    
-    yaz_log(YLOG_LOG, "Metaproxy start " VERSION
+
+    yaz_log(YLOG_LOG, "metaproxy %s " VERSION
 #ifdef VERSION_SHA1
-            " " VERSION_SHA1
+                " " VERSION_SHA1
 #endif
-        );
-    
+        , test_config ? "test" : "start"
+            );
+
+    yaz_log_xml_errors(0, YLOG_LOG);
     xmlDocPtr doc = xmlReadFile(fname,
-                                NULL, 
+                                NULL,
                                 XML_PARSE_XINCLUDE + XML_PARSE_NOBLANKS
                                 + XML_PARSE_NSCLEAN + XML_PARSE_NONET );
-    
+
     if (!doc)
     {
-        yaz_log (YLOG_FATAL,"XML parsing failed");
+        yaz_log(YLOG_FATAL,"XML parsing failed");
         return 1;
     }
     // and perform Xinclude then
@@ -214,15 +244,15 @@ static int sc_main(
             new mp::RouterFleXML(doc, factory, test_config, wrbuf_cstr(base_path));
         if (!test_config)
         {
-            
+
             yaz_sc_running(s);
-            
+
             yaz_daemon("metaproxy", mode, mode == YAZ_DAEMON_DEBUG ?
-                       handler_debug : handler_normal, router, pidfile, uid);
+                       work_debug : work_normal, router, pidfile, uid);
         }
     }
     catch (std::logic_error &e) {
-        yaz_log (YLOG_FATAL,"std::logic error: %s" , e.what() );
+        yaz_log(YLOG_FATAL,"std::logic error: %s" , e.what() );
         ret = 1;
     }
     catch (std::runtime_error &e) {
@@ -234,6 +264,8 @@ static int sc_main(
         ret = 1;
     }
     xmlFreeDoc(doc);
+    if (test_config)
+        yaz_log(YLOG_LOG, "metaproxy test exit code %d", ret);
     return ret;
 }
 
@@ -253,8 +285,6 @@ int main(int argc, char **argv)
     exit(ret);
 }
 
-
-
 /*
  * Local variables:
  * c-basic-offset: 4