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.3 by pcg, Fri Mar 21 23:17:01 2003 UTC vs.
Revision 1.19 by pcg, Fri Jun 11 15:56:36 2004 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-2004 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 <cstdlib>
27#include <clocale>
26 28
27#include <errno.h> 29#include <errno.h>
28#include <fcntl.h> 30#include <fcntl.h>
29#include <getopt.h> 31#include <getopt.h>
30#include <signal.h> 32#include <signal.h>
31#include <sys/types.h> 33#include <sys/types.h>
32#include <unistd.h> 34#include <unistd.h>
33#include <signal.h> 35#include <signal.h>
34#include <termios.h> 36#include <termios.h>
35 37
38#if HAVE_SYS_MMAN_H
36#include <sys/mman.h> 39# include <sys/mman.h>
40#endif
37 41
42#include <openssl/err.h>
38#include <openssl/rand.h> 43#include <openssl/rand.h>
39 44
40#include "gettext.h" 45#include "gettext.h"
41#include "pidfile.h" 46#include "pidfile.h"
42 47
43#include "conf.h" 48#include "conf.h"
44#include "slog.h" 49#include "slog.h"
45#include "util.h" 50#include "util.h"
46#include "protocol.h" 51#include "vpn.h"
47#include "iom.h" 52#include "iom.h"
48
49vpn network;
50 53
51static loglevel llevel = L_NONE; 54static loglevel llevel = L_NONE;
52 55
53/* If nonzero, display usage information and exit. */ 56/* If nonzero, display usage information and exit. */
54static int show_help; 57static int show_help;
55 58
56/* If nonzero, print the version on standard output and exit. */ 59/* If nonzero, print the version on standard output and exit. */
57static int show_version; 60static int show_version;
58 61
59#if HAVE_MLOCKALL
60/* If nonzero, disable swapping for this process. */ 62/* If nonzero, disable swapping for this process. */
61static int do_mlock = 0; 63static int do_mlock = 0;
62#endif
63 64
64/* If zero, don't detach from the terminal. */ 65/* If zero, don't detach from the terminal. */
65static int do_detach = 1; 66static int do_detach = 1;
66 67
67static struct option const long_options[] = 68static struct option const long_options[] =
69 {"config", required_argument, NULL, 'c'}, 70 {"config", required_argument, NULL, 'c'},
70 {"help", no_argument, &show_help, 1}, 71 {"help", no_argument, &show_help, 1},
71 {"version", no_argument, &show_version, 1}, 72 {"version", no_argument, &show_version, 1},
72 {"no-detach", no_argument, &do_detach, 0}, 73 {"no-detach", no_argument, &do_detach, 0},
73 {"log-level", required_argument, NULL, 'l'}, 74 {"log-level", required_argument, NULL, 'l'},
74#if HAVE_MLOCKALL
75 {"mlock", no_argument, &do_mlock, 1}, 75 {"mlock", no_argument, &do_mlock, 1},
76#endif
77 {NULL, 0, NULL, 0} 76 {NULL, 0, NULL, 0}
78 }; 77 };
79 78
80static void 79static void
81usage (int status) 80usage (int status)
121 120
122 case 'D': /* no detach */ 121 case 'D': /* no detach */
123 do_detach = 0; 122 do_detach = 0;
124 break; 123 break;
125 124
126#if HAVE_MLOCKALL
127 case 'L': /* lock into memory */ 125 case 'L': /* lock into memory */
128 do_mlock = 1; 126 do_mlock = 1;
129 break; 127 break;
130#endif
131 128
132 case 'l': /* inc debug level */ 129 case 'l': /* inc debug level */
133 { 130 {
134 llevel = string_to_loglevel (optarg); 131 llevel = string_to_loglevel (optarg);
135 132
152*/ 149*/
153void cleanup_and_exit(int c) 150void cleanup_and_exit(int c)
154{ 151{
155 network.shutdown_all (); 152 network.shutdown_all ();
156 153
157 if (pidfilename) 154 if (conf.pidfilename)
158 remove_pid (pidfilename); 155 remove_pid (conf.pidfilename);
159 156
160 slog (L_INFO, _("terminating with exit code %d"), c); 157 slog (L_INFO, _("terminating with exit code %d"), c);
161 158
162 exit (c); 159 exit (c);
163} 160}
180} 177}
181 178
182RETSIGTYPE 179RETSIGTYPE
183sigusr1_handler (int a) 180sigusr1_handler (int a)
184{ 181{
182 network.dump_status ();
185} 183}
186 184
187RETSIGTYPE 185RETSIGTYPE
188sigusr2_handler (int a) 186sigusr2_handler (int a)
189{ 187{
199 197
200 act.sa_handler = sighup_handler; sigaction (SIGHUP , &act, NULL); 198 act.sa_handler = sighup_handler; sigaction (SIGHUP , &act, NULL);
201 act.sa_handler = sigusr1_handler; sigaction (SIGUSR1, &act, NULL); 199 act.sa_handler = sigusr1_handler; sigaction (SIGUSR1, &act, NULL);
202 act.sa_handler = sigusr2_handler; sigaction (SIGUSR2, &act, NULL); 200 act.sa_handler = sigusr2_handler; sigaction (SIGUSR2, &act, NULL);
203 act.sa_handler = SIG_IGN; sigaction (SIGCHLD, &act, NULL); 201 act.sa_handler = SIG_IGN; sigaction (SIGCHLD, &act, NULL);
202 act.sa_handler = SIG_IGN; sigaction (SIGPIPE, &act, NULL);
204 act.sa_flags = SA_RESETHAND; 203 act.sa_flags = SA_RESETHAND;
205 act.sa_handler = sigterm_handler; sigaction (SIGINT , &act, NULL); 204 act.sa_handler = sigterm_handler; sigaction (SIGINT , &act, NULL);
206 act.sa_handler = sigterm_handler; sigaction (SIGTERM, &act, NULL); 205 act.sa_handler = sigterm_handler; sigaction (SIGTERM, &act, NULL);
207} 206}
208 207
209int 208int
210main (int argc, char **argv, char **envp) 209main (int argc, char **argv, char **envp)
211{ 210{
211 ERR_load_crypto_strings (); // we have the RAM
212
212 set_loglevel (L_INFO); 213 set_loglevel (L_INFO);
213 set_identity (argv[0]); 214 set_identity (argv[0]);
214 log_to (LOGTO_SYSLOG | LOGTO_STDERR); 215 log_to (LOGTO_SYSLOG | LOGTO_STDERR);
215 216
216 setlocale (LC_ALL, ""); 217 setlocale (LC_ALL, "");
219 220
220 parse_options (argc, argv, envp); 221 parse_options (argc, argv, envp);
221 222
222 if (show_version) 223 if (show_version)
223 { 224 {
224 printf (_("%s version %s (built %s %s, protocol %d:%d)\n"), get_identity (), 225 printf (_("%s version %s (built %s %s, protocol %d.%d)\n"), get_identity (),
225 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR); 226 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR);
227 printf (_("Built with kernel interface %s/%s.\n"), IFTYPE, IFSUBTYPE);
226 printf (_ 228 printf (_
227 ("Copyright (C) 2003 Marc Lehmann <vpe@plan9.de> and others.\n" 229 ("Copyright (C) 2003 Marc Lehmann <vpe@plan9.de> and others.\n"
228 "See the AUTHORS file for a complete list.\n\n" 230 "See the AUTHORS file for a complete list.\n\n"
229 "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" 231 "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
230 "and you are welcome to redistribute it under certain conditions;\n" 232 "and you are welcome to redistribute it under certain conditions;\n"
238 240
239 log_to (LOGTO_SYSLOG | LOGTO_STDERR); 241 log_to (LOGTO_SYSLOG | LOGTO_STDERR);
240 242
241 /* Lock all pages into memory if requested */ 243 /* Lock all pages into memory if requested */
242 244
243#if HAVE_MLOCKALL 245#if HAVE_MLOCKALL && HAVE_SYS_MMAN_H && _POSIX_MEMLOCK
244 if (do_mlock) 246 if (do_mlock)
245 if (mlockall (MCL_CURRENT | MCL_FUTURE)) 247 if (mlockall (MCL_CURRENT | MCL_FUTURE))
246 slog (L_ERR, _("system call `%s' failed: %s"), "mlockall", strerror (errno)); 248 slog (L_ERR, _("system call `%s' failed: %s"), "mlockall", strerror (errno));
247#endif 249#endif
248 250
249 make_names ();
250 conf.read_config (true); 251 conf.read_config (true);
251 252
252 set_loglevel (llevel != L_NONE ? llevel : conf.llevel); 253 set_loglevel (llevel != L_NONE ? llevel : conf.llevel);
253 254
254 RAND_load_file ("/dev/urandom", 1024); 255 RAND_load_file ("/dev/urandom", 1024);
255 256
256 if (!THISNODE) 257 if (!THISNODE)
257 { 258 {
258 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, specify the nodename when starting vped."),
259 thisnode ? thisnode : "<unset>"); 260 thisnode ? thisnode : "<unset>");
260 exit (1); 261 exit (EXIT_FAILURE);
261 } 262 }
262 263
263 if (detach (do_detach)) 264 if (detach (do_detach))
264 exit (0); 265 exit (EXIT_SUCCESS);
265 266
266 setup_signals (); 267 setup_signals ();
267 268
268 if (!network.setup ()) 269 if (!network.setup ())
269 { 270 {
270 iom.loop (); 271 iom.loop ();
271 cleanup_and_exit (1); 272 cleanup_and_exit (EXIT_FAILURE);
272 } 273 }
273 274
274 slog (L_ERR, _("unable to setup network, unrecoverable error, exiting.")); 275 slog (L_ERR, _("unable to setup network, unrecoverable error, exiting."));
275 cleanup_and_exit (1); 276 cleanup_and_exit (EXIT_FAILURE);
276} 277}
277 278

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines