2 * Copyright (c) 1998-2004, Index Data.
3 * See the file LICENSE for details.
5 * $Id: yaz-proxy-main.cpp,v 1.31 2004-01-30 01:30:30 adam Exp $
11 #include <sys/types.h>
15 #include <yaz/options.h>
17 #include <yaz++/socket-manager.h>
18 #include <yaz++/pdu-assoc.h>
19 #include <yaz++/proxy.h>
21 void usage(char *prog)
23 fprintf (stderr, "%s: [-c config] [-l log] [-a log] [-v level] [-t target] "
24 "[-u uid] [-p pidfile] @:port\n", prog);
28 static char *pid_fname = 0;
30 static char *log_file = 0;
33 int args(Yaz_Proxy *proxy, int argc, char **argv)
40 while ((ret = options("o:a:t:v:c:u:i:m:l:T:p:U:X",
41 argv, argc, &arg)) != -2)
55 err = proxy->set_config(arg);
58 fprintf(stderr, "Config file support not enabled (proxy not compiled with libxml2 support)\n");
63 fprintf(stderr, "Bad or missing file %s\n", arg);
68 proxy->set_APDU_log(arg);
71 proxy->set_default_target(arg);
74 proxy->set_proxy_authentication(arg);
77 proxy->option("optimize", arg);
80 yaz_log_init_level (yaz_log_mask_str(arg));
83 yaz_log_init_file (arg);
84 log_file = xstrdup(arg);
87 proxy->set_max_clients(atoi(arg));
90 proxy->set_client_idletime(atoi(arg));
93 proxy->set_target_idletime(atoi(arg));
100 pid_fname = xstrdup(arg);
113 if (proxy->server(addr))
115 yaz_log(LOG_FATAL|LOG_ERRNO, "listen %s", addr);
127 static Yaz_Proxy *static_yaz_proxy = 0;
128 static void sighup_handler(int num)
130 signal(SIGHUP, sighup_handler);
131 if (static_yaz_proxy)
132 static_yaz_proxy->reconfig();
136 static void proxy_xml_error_handler(void *ctx, const char *fmt, ...)
143 vsnprintf(buf, sizeof(buf), fmt, ap);
145 yaz_log(LOG_WARN, "%s", buf);
151 static void child_run(Yaz_SocketManager *m, int run)
153 signal(SIGHUP, sighup_handler);
156 xmlSetGenericErrorFunc(0, proxy_xml_error_handler);
158 yaz_log(LOG_LOG, "0 proxy run=%d pid=%ld", run, (long) getpid());
161 FILE *f = fopen(pid_fname, "w");
164 yaz_log(LOG_ERRNO|LOG_FATAL, "Couldn't create %s", pid_fname);
167 fprintf(f, "%ld", (long) getpid());
175 if (!(pw = getpwnam(uid)))
177 yaz_log(LOG_FATAL, "%s: Unknown user", uid);
182 chown(log_file, pw->pw_uid, pw->pw_gid);
186 if (setuid(pw->pw_uid) < 0)
188 yaz_log(LOG_FATAL|LOG_ERRNO, "setuid");
194 while (m->processEvent() > 0)
200 int main(int argc, char **argv)
209 Yaz_SocketManager mySocketManager;
210 Yaz_Proxy proxy(new Yaz_PDU_Assoc(&mySocketManager));
212 static_yaz_proxy = &proxy;
214 args(&proxy, argc, argv);
218 child_run(&mySocketManager, run);
226 yaz_log(LOG_FATAL|LOG_ERRNO, "fork");
231 child_run(&mySocketManager, run);
241 yaz_log(LOG_FATAL, "p1=%d != p=%d", p1, p);
244 if (WIFSIGNALED(status))
246 switch(WTERMSIG(status)) {
248 yaz_log(LOG_WARN, "Received SIGILL from child %ld", (long) p);
252 yaz_log(LOG_WARN, "Received SIGABRT from child %ld", (long) p);
256 yaz_log(LOG_WARN, "Received SIGSEGV from child %ld", (long) p);
260 yaz_log(LOG_LOG, "Received SIGTERM from child %ld",
265 yaz_log(LOG_WARN, "Received SIG %d from child %ld",
266 WTERMSIG(status), (long) p);
270 else if (status == 0)
274 yaz_log(LOG_LOG, "Exit %d from child %ld", status, (long) p);