proxy.sh start/stop script
[yazpp-moved-to-github.git] / src / yaz-proxy-main.cpp
1 /*
2  * Copyright (c) 1998-2003, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: yaz-proxy-main.cpp,v 1.21 2003-10-23 09:08:52 adam Exp $
6  */
7
8 #include <signal.h>
9 #include <unistd.h>
10 #include <yaz/log.h>
11 #include <yaz/options.h>
12
13 #include <yaz++/socket-manager.h>
14 #include <yaz++/pdu-assoc.h>
15 #include <yaz++/proxy.h>
16
17 void usage(char *prog)
18 {
19     fprintf (stderr, "%s: [-c config] [-a log] [-m num] [-v level] [-t target] [-i sec] "
20              "[-u auth] [-o optlevel] @:port\n", prog);
21     exit (1);
22 }
23
24 static char *pid_fname = 0;
25
26 int args(Yaz_Proxy *proxy, int argc, char **argv)
27 {
28     char *addr = 0;
29     char *arg;
30     char *prog = argv[0];
31     int ret;
32
33     while ((ret = options("o:a:t:v:c:u:i:m:l:T:p:", argv, argc, &arg)) != -2)
34     {
35         int err;
36         switch (ret)
37         {
38         case 0:
39             if (addr)
40             {
41                 usage(prog);
42                 return 1;
43             }
44             addr = arg;
45             break;
46         case 'c':
47             err = proxy->set_config(arg);
48             if (err == -2)
49             {
50                 fprintf(stderr, "Config file support not enabled (proxy not compiled with libxml2 support)\n");
51                 exit(1);
52             }
53             else if (err == -1)
54             {
55                 fprintf(stderr, "Bad or missing file %s\n", arg);
56                 exit(1);
57             }
58             break;
59         case 'a':
60             proxy->set_APDU_log(arg);
61             break;
62         case 't':
63             proxy->set_default_target(arg);
64             break;
65         case 'u':
66             proxy->set_proxy_authentication(arg);
67             break;
68         case 'o':
69             proxy->option("optimize", arg);
70             break;
71         case 'v':
72             yaz_log_init_level (yaz_log_mask_str(arg));
73             break;
74         case 'l':
75             yaz_log_init_file (arg);
76             break;
77         case 'm':
78             proxy->set_max_clients(atoi(arg));
79             break;
80         case 'i':
81             proxy->set_client_idletime(atoi(arg));
82             break;
83         case 'T':
84             proxy->set_target_idletime(atoi(arg));
85             break;
86         case 'p':
87             if (!pid_fname)
88                 pid_fname = xstrdup(arg);
89             break;
90         default:
91             usage(prog);
92             return 1;
93         }
94     }
95     if (addr)
96     {
97         proxy->server(addr);
98     }
99     else
100     {
101         usage(prog);
102         return 1;
103     }
104     return 0;
105 }
106
107 static Yaz_Proxy *static_yaz_proxy = 0;
108 static void sighup_handler(int num)
109 {
110     if (static_yaz_proxy)
111         static_yaz_proxy->reconfig();
112 }
113
114 int main(int argc, char **argv)
115 {
116     static int mk_pid = 0;
117     Yaz_SocketManager mySocketManager;
118     Yaz_Proxy proxy(new Yaz_PDU_Assoc(&mySocketManager));
119
120     static_yaz_proxy = &proxy;
121
122     signal(SIGHUP, sighup_handler);
123
124     args(&proxy, argc, argv);
125     while (mySocketManager.processEvent() > 0)
126         if (!mk_pid && pid_fname)
127         {
128             FILE *f = fopen(pid_fname, "w");
129             if (!f)
130             {
131                 yaz_log(LOG_ERRNO|LOG_FATAL, "Couldn't create %s", pid_fname);
132                 exit(0);
133             }
134             fprintf(f, "%ld", (long) getpid());
135             fclose(f);
136             mk_pid = 1;
137         }
138     if (pid_fname)
139     {
140         if (mk_pid)
141             unlink(pid_fname);
142         xfree(pid_fname);
143     }
144     exit (0);
145     return 0;
146 }