2 * Copyright (c) 1998-2004, Index Data.
3 * See the file LICENSE for details.
5 * $Id: yaz-proxy-main.cpp,v 1.27 2004-01-05 11:31:04 adam Exp $
11 #include <sys/types.h>
14 #include <yaz/options.h>
16 #include <yaz++/socket-manager.h>
17 #include <yaz++/pdu-assoc.h>
18 #include <yaz++/proxy.h>
20 void usage(char *prog)
22 fprintf (stderr, "%s: [-c config] [-l log] [-a log] [-v level] [-t target] "
23 "[-u uid] [-p pidfile] @:port\n", prog);
27 static char *pid_fname = 0;
29 static char *log_file = 0;
32 int args(Yaz_Proxy *proxy, int argc, char **argv)
39 while ((ret = options("o:a:t:v:c:u:i:m:l:T:p:U:X",
40 argv, argc, &arg)) != -2)
54 err = proxy->set_config(arg);
57 fprintf(stderr, "Config file support not enabled (proxy not compiled with libxml2 support)\n");
62 fprintf(stderr, "Bad or missing file %s\n", arg);
67 proxy->set_APDU_log(arg);
70 proxy->set_default_target(arg);
73 proxy->set_proxy_authentication(arg);
76 proxy->option("optimize", arg);
79 yaz_log_init_level (yaz_log_mask_str(arg));
82 yaz_log_init_file (arg);
83 log_file = xstrdup(arg);
86 proxy->set_max_clients(atoi(arg));
89 proxy->set_client_idletime(atoi(arg));
92 proxy->set_target_idletime(atoi(arg));
99 pid_fname = xstrdup(arg);
112 yaz_log(LOG_LOG, "0 Starting proxy " VERSION );
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 child_run(Yaz_SocketManager *m)
138 yaz_log(LOG_LOG, "0 proxy pid=%ld", (long) getpid());
141 FILE *f = fopen(pid_fname, "w");
144 yaz_log(LOG_ERRNO|LOG_FATAL, "Couldn't create %s", pid_fname);
147 fprintf(f, "%ld", (long) getpid());
155 if (!(pw = getpwnam(uid)))
157 yaz_log(LOG_FATAL, "%s: Unknown user", uid);
162 chown(log_file, pw->pw_uid, pw->pw_gid);
166 if (setuid(pw->pw_uid) < 0)
168 yaz_log(LOG_FATAL|LOG_ERRNO, "setuid");
174 while (m->processEvent() > 0)
180 int main(int argc, char **argv)
183 static int mk_pid = 0;
184 Yaz_SocketManager mySocketManager;
185 Yaz_Proxy proxy(new Yaz_PDU_Assoc(&mySocketManager));
187 static_yaz_proxy = &proxy;
189 signal(SIGHUP, sighup_handler);
191 args(&proxy, argc, argv);
195 child_run(&mySocketManager);
203 yaz_log(LOG_FATAL|LOG_ERRNO, "fork");
208 child_run(&mySocketManager);
215 yaz_log(LOG_FATAL, "p1=%d != p=%d", p1, p);
218 if (WIFSIGNALED(status))
220 switch(WTERMSIG(status)) {
222 yaz_log(LOG_WARN, "Received SIGILL from child %ld", (long) p);
226 yaz_log(LOG_WARN, "Received SIGABRT from child %ld", (long) p);
230 yaz_log(LOG_WARN, "Received SIGSEGV from child %ld", (long) p);
234 yaz_log(LOG_LOG, "Received SIGTERM from child %ld",
235 WTERMSIG(status), (long) p);
239 yaz_log(LOG_WARN, "Received SIG %d from child %ld",
240 WTERMSIG(status), (long) p);
244 else if (status == 0)
248 yaz_log(LOG_LOG, "Exit %d from child %ld", status, (long) p);