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.14 by pcg, Sat Jan 17 14:50:40 2004 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines