Yaz_ProxyModules keeps track of number of open modules.
[yazproxy-moved-to-github.git] / src / yaz-proxy-main.cpp
index 360135b..b8a26d1 100644 (file)
@@ -1,45 +1,62 @@
-/* $Id: yaz-proxy-main.cpp,v 1.1 2004-04-11 11:36:47 adam Exp $
-   Copyright (c) 1998-2004, Index Data.
+/* $Id: yaz-proxy-main.cpp,v 1.15 2005-06-08 13:29:03 adam Exp $
+   Copyright (c) 1998-2005, Index Data.
 
 This file is part of the yaz-proxy.
 
-Zebra is free software; you can redistribute it and/or modify it under
+YAZ proxy is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
 Software Foundation; either version 2, or (at your option) any later
 version.
 
-Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+YAZ proxy is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or
 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.proxy.  If not, write to the
+along with YAZ proxy; see the file LICENSE.  If not, write to the
 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
  */
 
-#ifdef WIN32
-#else
 #include <signal.h>
+#if HAVE_UNISTD_H
 #include <unistd.h>
-#include <pwd.h>
 #endif
+#if HAVE_SYS_TYPES_H
 #include <sys/types.h>
-
-#include <stdarg.h>
-
-#if HAVE_GETRLIMIT
+#endif
+#if HAVE_SYS_TIME_H
 #include <sys/time.h>
+#endif
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#if HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
+#if HAVE_PWD_H
+#include <pwd.h>
+#endif
+
+#include <stdarg.h>
+#include <stdlib.h>
 
 #include <yaz/log.h>
 #include <yaz/options.h>
 
 #include <yaz++/socket-manager.h>
 #include <yaz++/pdu-assoc.h>
-#include <yaz++/proxy/proxy.h>
+#include <yazproxy/proxy.h>
+
+#if HAVE_XSLT
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxslt/xsltutils.h>
+#include <libxslt/transform.h>
+#endif
+
+using namespace yazpp_1;
 
 void usage(char *prog)
 {
@@ -61,7 +78,7 @@ int args(Yaz_Proxy *proxy, int argc, char **argv)
     char *prog = argv[0];
     int ret;
 
-    while ((ret = options("o:a:t:v:c:u:i:m:l:T:p:U:n:X",
+    while ((ret = options("o:a:t:v:c:u:i:m:l:T:p:n:X",
                          argv, argc, &arg)) != -2)
     {
        int err;
@@ -79,7 +96,7 @@ int args(Yaz_Proxy *proxy, int argc, char **argv)
            err = proxy->set_config(arg);
            if (err == -2)
            {
-               fprintf(stderr, "Config file support not enabled (proxy not compiled with libxml2 support)\n");
+               fprintf(stderr, "Config file support not enabled (not using libxslt & libxml2)\n");
                exit(1);
            }
            else if (err == -1)
@@ -94,9 +111,6 @@ int args(Yaz_Proxy *proxy, int argc, char **argv)
         case 't':
            proxy->set_default_target(arg);
            break;
-        case 'U':
-            proxy->set_proxy_authentication(arg);
-            break;
         case 'o':
            proxy->option("optimize", arg);
            break;
@@ -120,6 +134,7 @@ int args(Yaz_Proxy *proxy, int argc, char **argv)
            no_limit_files = atoi(arg);
            break;
        case 'X':
+           proxy->set_debug_mode(1);
            debug = 1;
            break;
        case 'p':
@@ -139,7 +154,7 @@ int args(Yaz_Proxy *proxy, int argc, char **argv)
     {
        if (proxy->server(addr))
        {
-           yaz_log(LOG_FATAL|LOG_ERRNO, "listen %s", addr);
+           yaz_log(YLOG_FATAL|YLOG_ERRNO, "listen %s", addr);
            exit(1);
        }
     }
@@ -175,13 +190,13 @@ static void proxy_xml_error_handler(void *ctx, const char *fmt, ...)
 #else
     vsnprintf(buf, sizeof(buf), fmt, ap);
 #endif
-    yaz_log(LOG_WARN, "%s: %s", (char*) ctx, buf);
+    yaz_log(YLOG_WARN, "%s: %s", (char*) ctx, buf);
 
     va_end (ap);
 }
 #endif
 
-static void child_run(Yaz_SocketManager *m, int run)
+static void child_run(SocketManager *m, int run)
 {
 #ifdef WIN32
 #else
@@ -194,7 +209,7 @@ static void child_run(Yaz_SocketManager *m, int run)
 #endif
 #ifdef WIN32
 #else
-    yaz_log(LOG_LOG, "0 proxy run=%d pid=%ld", run, (long) getpid());
+    yaz_log(YLOG_LOG, "0 proxy run=%d pid=%ld", run, (long) getpid());
 #endif
     if (no_limit_files)
     {
@@ -203,12 +218,12 @@ static void child_run(Yaz_SocketManager *m, int run)
        limit_data.rlim_cur = no_limit_files;
        limit_data.rlim_max = no_limit_files;
        
-       yaz_log(LOG_LOG, "0 setrlimit NOFILE cur=%d max=%d",
-               limit_data.rlim_cur, limit_data.rlim_max);
+       yaz_log(YLOG_LOG, "0 setrlimit NOFILE cur=%ld max=%ld",
+               (long) limit_data.rlim_cur, (long) limit_data.rlim_max);
        if (setrlimit(RLIMIT_NOFILE, &limit_data))
-           yaz_log(LOG_ERRNO|LOG_WARN, "setrlimit");
+           yaz_log(YLOG_ERRNO|YLOG_WARN, "setrlimit");
 #else
-       yaz_log(LOG_WARN, "setrlimit unavablable. Option -n ignored");
+       yaz_log(YLOG_WARN, "setrlimit unavablable. Option -n ignored");
 #endif
     }
 #ifdef WIN32
@@ -218,7 +233,7 @@ static void child_run(Yaz_SocketManager *m, int run)
        FILE *f = fopen(pid_fname, "w");
        if (!f)
        {
-           yaz_log(LOG_ERRNO|LOG_FATAL, "Couldn't create %s", pid_fname);
+           yaz_log(YLOG_ERRNO|YLOG_FATAL, "Couldn't create %s", pid_fname);
            exit(0);
        }
        fprintf(f, "%ld", (long) getpid());
@@ -231,7 +246,7 @@ static void child_run(Yaz_SocketManager *m, int run)
 
        if (!(pw = getpwnam(uid)))
        {
-           yaz_log(LOG_FATAL, "%s: Unknown user", uid);
+           yaz_log(YLOG_FATAL, "%s: Unknown user", uid);
            exit(3);
        }
        if (log_file)
@@ -241,7 +256,7 @@ static void child_run(Yaz_SocketManager *m, int run)
        }
        if (setuid(pw->pw_uid) < 0)
        {
-           yaz_log(LOG_FATAL|LOG_ERRNO, "setuid");
+           yaz_log(YLOG_FATAL|YLOG_ERRNO, "setuid");
            exit(4);
        }
        xfree(uid);
@@ -250,8 +265,8 @@ static void child_run(Yaz_SocketManager *m, int run)
 #if HAVE_GETRLIMIT
     struct rlimit limit_data;
     getrlimit(RLIMIT_NOFILE, &limit_data);
-    yaz_log(LOG_LOG, "0 getrlimit NOFILE cur=%d max=%d",
-           limit_data.rlim_cur, limit_data.rlim_max);
+    yaz_log(YLOG_LOG, "0 getrlimit NOFILE cur=%ld max=%ld",
+           (long) limit_data.rlim_cur, (long) limit_data.rlim_max);
 #endif
     
     while (m->processEvent() > 0)
@@ -269,8 +284,8 @@ int main(int argc, char **argv)
 #endif
     int cont = 1;
     int run = 1;
-    Yaz_SocketManager mySocketManager;
-    Yaz_Proxy proxy(new Yaz_PDU_Assoc(&mySocketManager));
+    SocketManager mySocketManager;
+    Yaz_Proxy proxy(new PDU_Assoc(&mySocketManager), &mySocketManager);
 
     static_yaz_proxy = &proxy;
 
@@ -289,7 +304,7 @@ int main(int argc, char **argv)
        pid_t p = fork();
        if (p == (pid_t) -1)
        {
-           yaz_log(LOG_FATAL|LOG_ERRNO, "fork");
+           yaz_log(YLOG_FATAL|YLOG_ERRNO, "fork");
            exit(1);
        }
        else if (p == 0)
@@ -304,35 +319,35 @@ int main(int argc, char **argv)
 
        if (p1 != p)
        {
-           yaz_log(LOG_FATAL, "p1=%d != p=%d", p1, p);
+           yaz_log(YLOG_FATAL, "p1=%d != p=%d", p1, p);
            exit(1);
        }
        if (WIFSIGNALED(status))
        {
            switch(WTERMSIG(status)) {
            case SIGILL:
-               yaz_log(LOG_WARN, "Received SIGILL from child %ld", (long) p);
+               yaz_log(YLOG_WARN, "Received SIGILL from child %ld", (long) p);
                cont = 1;
                break;
            case SIGABRT:
-               yaz_log(LOG_WARN, "Received SIGABRT from child %ld", (long) p);
+               yaz_log(YLOG_WARN, "Received SIGABRT from child %ld", (long) p);
                cont = 1;
                break ;
            case SIGSEGV:
-               yaz_log(LOG_WARN, "Received SIGSEGV from child %ld", (long) p);
+               yaz_log(YLOG_WARN, "Received SIGSEGV from child %ld", (long) p);
                cont = 1;
                break;
            case SIGBUS:        
-               yaz_log(LOG_WARN, "Received SIGBUS from child %ld", (long) p);
+               yaz_log(YLOG_WARN, "Received SIGBUS from child %ld", (long) p);
                cont = 1;
                break;
            case SIGTERM:
-               yaz_log(LOG_LOG, "Received SIGTERM from child %ld",
+               yaz_log(YLOG_LOG, "Received SIGTERM from child %ld",
                        (long) p);
                cont = 0;
                break;
            default:
-               yaz_log(LOG_WARN, "Received SIG %d from child %ld",
+               yaz_log(YLOG_WARN, "Received SIG %d from child %ld",
                        WTERMSIG(status), (long) p);
                cont = 0;
            }
@@ -341,7 +356,7 @@ int main(int argc, char **argv)
            cont = 0;
        else
        {
-           yaz_log(LOG_LOG, "Exit %d from child %ld", status, (long) p);
+           yaz_log(YLOG_LOG, "Exit %d from child %ld", status, (long) p);
            cont = 1;
        }
        if (cont)