ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/vped.C
(Generate patch)

Comparing gvpe/src/vped.C (file contents):
Revision 1.1 by pcg, Sat Mar 1 15:53:03 2003 UTC vs.
Revision 1.22 by pcg, Thu Mar 3 16:54:34 2005 UTC

1/* 1/*
2 vped.C -- the main file for vped 2 vped.C -- the main file for gvpe
3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl> 3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl>
4 2000-2002 Guus Sliepen <guus@sliepen.eu.org> 4 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
5 2003 Marc Lehmannn <pcg@goof.com> 5 2003-2005 Marc Lehmann <gvpe@schmorp.de>
6 6
7 This file is part of GVPE.
8
7 This program is free software; you can redistribute it and/or modify 9 GVPE is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 10 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 11 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 12 (at your option) any later version.
11 13
12 This program is distributed in the hope that it will be useful, 14 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 17 GNU General Public License for more details.
16 18
17 You should have received a copy of the GNU General Public License 19 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 20 along with gvpe; if not, write to the Free Software
19 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20*/ 22*/
21 23
22#include "config.h" 24#include "config.h"
23 25
24#include <cstdio> 26#include <cstdio>
25#include <cstring> 27#include <cstring>
28#include <cstdlib>
29#include <locale.h>
26 30
27#include <errno.h> 31#include <errno.h>
28#include <fcntl.h> 32#include <fcntl.h>
29#include <getopt.h> 33#include <getopt.h>
30#include <signal.h> 34#include <signal.h>
31#include <sys/types.h> 35#include <sys/types.h>
32#include <unistd.h> 36#include <unistd.h>
33#include <signal.h> 37#include <signal.h>
34#include <termios.h> 38#include <termios.h>
35 39
40#if HAVE_SYS_MMAN_H
36#include <sys/mman.h> 41# include <sys/mman.h>
42#endif
37 43
44#include <openssl/err.h>
38#include <openssl/rand.h> 45#include <openssl/rand.h>
39 46
40#include "gettext.h" 47#include "gettext.h"
41#include "pidfile.h" 48#include "pidfile.h"
42 49
43#include "conf.h" 50#include "conf.h"
44#include "slog.h" 51#include "slog.h"
45#include "util.h" 52#include "util.h"
46#include "protocol.h" 53#include "vpn.h"
54#include "iom.h"
47 55
48vpn network; 56static loglevel llevel = L_NONE;
49 57
50/* If nonzero, display usage information and exit. */ 58/* If nonzero, display usage information and exit. */
51static int show_help; 59static int show_help;
52 60
53/* If nonzero, print the version on standard output and exit. */ 61/* If nonzero, print the version on standard output and exit. */
54static int show_version; 62static int show_version;
55 63
56#if HAVE_MLOCKALL
57/* If nonzero, disable swapping for this process. */ 64/* If nonzero, disable swapping for this process. */
58static int do_mlock = 0; 65static int do_mlock = 0;
59#endif
60 66
61/* If zero, don't detach from the terminal. */ 67/* If zero, don't detach from the terminal. */
62static int do_detach = 1; 68static int do_detach = 1;
63 69
64static struct option const long_options[] = 70static struct option const long_options[] =
66 {"config", required_argument, NULL, 'c'}, 72 {"config", required_argument, NULL, 'c'},
67 {"help", no_argument, &show_help, 1}, 73 {"help", no_argument, &show_help, 1},
68 {"version", no_argument, &show_version, 1}, 74 {"version", no_argument, &show_version, 1},
69 {"no-detach", no_argument, &do_detach, 0}, 75 {"no-detach", no_argument, &do_detach, 0},
70 {"log-level", required_argument, NULL, 'l'}, 76 {"log-level", required_argument, NULL, 'l'},
71#if HAVE_MLOCKALL
72 {"mlock", no_argument, &do_mlock, 1}, 77 {"mlock", no_argument, &do_mlock, 1},
73#endif
74 {NULL, 0, NULL, 0} 78 {NULL, 0, NULL, 0}
75 }; 79 };
76 80
77static void 81static void
78usage (int status) 82usage (int status)
118 122
119 case 'D': /* no detach */ 123 case 'D': /* no detach */
120 do_detach = 0; 124 do_detach = 0;
121 break; 125 break;
122 126
123#if HAVE_MLOCKALL
124 case 'L': /* lock into memory */ 127 case 'L': /* lock into memory */
125 do_mlock = 1; 128 do_mlock = 1;
126 break; 129 break;
127#endif
128 130
129 case 'l': /* inc debug level */ 131 case 'l': /* inc debug level */
130 { 132 {
131 loglevel l = string_to_loglevel (optarg); 133 llevel = string_to_loglevel (optarg);
132 134
133 if (l != L_NONE) 135 if (llevel == L_NONE)
134 set_loglevel (l);
135 else
136 slog (L_WARN, "'%s': %s", optarg, UNKNOWN_LOGLEVEL); 136 slog (L_WARN, "'%s': %s", optarg, UNKNOWN_LOGLEVEL);
137 } 137 }
138 break; 138 break;
139 139
140 case '?': 140 case '?':
151*/ 151*/
152void cleanup_and_exit(int c) 152void cleanup_and_exit(int c)
153{ 153{
154 network.shutdown_all (); 154 network.shutdown_all ();
155 155
156 if (pidfilename) 156 if (conf.pidfilename)
157 remove_pid (pidfilename); 157 remove_pid (conf.pidfilename);
158 158
159 slog (L_INFO, _("terminating with exit code %d"), c); 159 slog (L_INFO, _("terminating with exit code %d"), c);
160 160
161 exit (c); 161 exit (c);
162} 162}
166*/ 166*/
167RETSIGTYPE 167RETSIGTYPE
168sigterm_handler (int a) 168sigterm_handler (int a)
169{ 169{
170 network.events |= vpn::EVENT_SHUTDOWN; 170 network.events |= vpn::EVENT_SHUTDOWN;
171 network.event.start (0);
171} 172}
172 173
173RETSIGTYPE 174RETSIGTYPE
174sighup_handler (int a) 175sighup_handler (int a)
175{ 176{
176 network.events |= vpn::EVENT_RECONNECT; 177 network.events |= vpn::EVENT_RECONNECT;
178 network.event.start (0);
177} 179}
178 180
179RETSIGTYPE 181RETSIGTYPE
180sigusr1_handler (int a) 182sigusr1_handler (int a)
181{ 183{
184 network.dump_status ();
182} 185}
183 186
184RETSIGTYPE 187RETSIGTYPE
185sigusr2_handler (int a) 188sigusr2_handler (int a)
186{ 189{
196 199
197 act.sa_handler = sighup_handler; sigaction (SIGHUP , &act, NULL); 200 act.sa_handler = sighup_handler; sigaction (SIGHUP , &act, NULL);
198 act.sa_handler = sigusr1_handler; sigaction (SIGUSR1, &act, NULL); 201 act.sa_handler = sigusr1_handler; sigaction (SIGUSR1, &act, NULL);
199 act.sa_handler = sigusr2_handler; sigaction (SIGUSR2, &act, NULL); 202 act.sa_handler = sigusr2_handler; sigaction (SIGUSR2, &act, NULL);
200 act.sa_handler = SIG_IGN; sigaction (SIGCHLD, &act, NULL); 203 act.sa_handler = SIG_IGN; sigaction (SIGCHLD, &act, NULL);
204 act.sa_handler = SIG_IGN; sigaction (SIGPIPE, &act, NULL);
201 act.sa_flags = SA_RESETHAND; 205 act.sa_flags = SA_RESETHAND;
202 act.sa_handler = sigterm_handler; sigaction (SIGINT , &act, NULL); 206 act.sa_handler = sigterm_handler; sigaction (SIGINT , &act, NULL);
203 act.sa_handler = sigterm_handler; sigaction (SIGTERM, &act, NULL); 207 act.sa_handler = sigterm_handler; sigaction (SIGTERM, &act, NULL);
204} 208}
205 209
206int 210int
207main (int argc, char **argv, char **envp) 211main (int argc, char **argv, char **envp)
208{ 212{
213 ERR_load_crypto_strings (); // we have the RAM
214
209 set_loglevel (L_INFO); 215 set_loglevel (L_INFO);
210 set_identity (argv[0]); 216 set_identity (argv[0]);
211 log_to (LOGTO_SYSLOG | LOGTO_STDERR); 217 log_to (LOGTO_SYSLOG | LOGTO_STDERR);
212 218
213 setlocale (LC_ALL, ""); 219 setlocale (LC_ALL, "");
216 222
217 parse_options (argc, argv, envp); 223 parse_options (argc, argv, envp);
218 224
219 if (show_version) 225 if (show_version)
220 { 226 {
221 printf (_("%s version %s (built %s %s, protocol %d:%d)\n"), get_identity (), 227 printf (_("%s version %s (built %s %s, protocol %d.%d)\n"), get_identity (),
222 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR); 228 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR);
229 printf (_("Built with kernel interface %s/%s.\n"), IFTYPE, IFSUBTYPE);
223 printf (_ 230 printf (_
224 ("Copyright (C) 2003 Marc Lehmann <vpe@plan9.de> and others.\n" 231 ("Copyright (C) 2003 Marc Lehmann <vpe@plan9.de> and others.\n"
225 "See the AUTHORS file for a complete list.\n\n" 232 "See the AUTHORS file for a complete list.\n\n"
226 "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" 233 "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
227 "and you are welcome to redistribute it under certain conditions;\n" 234 "and you are welcome to redistribute it under certain conditions;\n"
235 242
236 log_to (LOGTO_SYSLOG | LOGTO_STDERR); 243 log_to (LOGTO_SYSLOG | LOGTO_STDERR);
237 244
238 /* Lock all pages into memory if requested */ 245 /* Lock all pages into memory if requested */
239 246
240#if HAVE_MLOCKALL 247#if HAVE_MLOCKALL && HAVE_SYS_MMAN_H && _POSIX_MEMLOCK
241 if (do_mlock) 248 if (do_mlock)
242 if (mlockall (MCL_CURRENT | MCL_FUTURE)) 249 if (mlockall (MCL_CURRENT | MCL_FUTURE))
243 slog (L_ERR, _("system call `%s' failed: %s"), "mlockall", strerror (errno)); 250 slog (L_ERR, _("system call `%s' failed: %s"), "mlockall", strerror (errno));
244#endif 251#endif
245 252
246 make_names ();
247 conf.read_config (true); 253 conf.read_config (true);
248 254
255 set_loglevel (llevel != L_NONE ? llevel : conf.llevel);
256
249 RAND_load_file ("/dev/urandom", 1024); 257 RAND_load_file ("/dev/urandom", 1024);
250 258
251 //OpenSSL_add_all_algorithms ();
252
253 if (!THISNODE) 259 if (!THISNODE)
254 { 260 {
255 slog (L_ERR, _("current node not set, or node '%s' not found in configfile, use the -n switch when starting vped."), 261 slog (L_ERR, _("current node not set, or node '%s' not found in configfile, specify the nodename when starting vped."),
256 thisnode ? thisnode : "<unset>"); 262 thisnode ? thisnode : "<unset>");
257 exit (1); 263 exit (EXIT_FAILURE);
258 } 264 }
259 265
260 if (detach (do_detach)) 266 if (detach (do_detach))
261 exit (0); 267 exit (EXIT_SUCCESS);
262 268
263 setup_signals (); 269 setup_signals ();
264 270
265 if (!network.setup ()) 271 if (!network.setup ())
266 { 272 {
267 network.main_loop (); 273 io_manager::loop ();
268 cleanup_and_exit (1); 274 cleanup_and_exit (EXIT_FAILURE);
269 } 275 }
270 276
271 slog (L_ERR, _("unable to setup network, unrecoverable error, exiting.")); 277 slog (L_ERR, _("unable to setup network, unrecoverable error, exiting."));
272 cleanup_and_exit (1); 278 cleanup_and_exit (EXIT_FAILURE);
273} 279}
274 280

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines