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

Comparing gvpe/src/gvpe.C (file contents):
Revision 1.15 by pcg, Fri Nov 21 05:02:08 2008 UTC vs.
Revision 1.24 by root, Sat Jul 13 04:10:29 2013 UTC

1/* 1/*
2 gvpe.C -- the main file for gvpe 2 gvpe.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-2008 Marc Lehmann <gvpe@schmorp.de> 5 2003-2013 Marc Lehmann <gvpe@schmorp.de>
6 6
7 This file is part of GVPE. 7 This file is part of GVPE.
8 8
9 GVPE is free software; you can redistribute it and/or modify it 9 GVPE is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the 10 under the terms of the GNU General Public License as published by the
40#include <errno.h> 40#include <errno.h>
41#include <fcntl.h> 41#include <fcntl.h>
42#include <getopt.h> 42#include <getopt.h>
43#include <signal.h> 43#include <signal.h>
44#include <sys/types.h> 44#include <sys/types.h>
45#include <sys/stat.h>
45#include <unistd.h> 46#include <unistd.h>
46#include <signal.h> 47#include <signal.h>
47#include <termios.h> 48#include <termios.h>
48 49
49#if HAVE_SYS_MMAN_H 50#if HAVE_SYS_MMAN_H
75 76
76/* If zero, don't detach from the terminal. */ 77/* If zero, don't detach from the terminal. */
77static int do_detach = 1; 78static int do_detach = 1;
78 79
79static struct option const long_options[] = 80static struct option const long_options[] =
80 { 81{
81 {"config", required_argument, NULL, 'c'}, 82 {"config", required_argument, NULL, 'c'},
82 {"help", no_argument, &show_help, 1}, 83 {"help", no_argument, &show_help, 1},
83 {"version", no_argument, &show_version, 1}, 84 {"version", no_argument, &show_version, 1},
84 {"no-detach", no_argument, &do_detach, 0}, 85 {"no-detach", no_argument, &do_detach, 0},
85 {"log-level", required_argument, NULL, 'l'}, 86 {"log-level", required_argument, NULL, 'l'},
86 {"mlock", no_argument, &do_mlock, 1}, 87 {"mlock", no_argument, &do_mlock, 1},
87 {NULL, 0, NULL, 0} 88 {NULL, 0, NULL, 0}
88 }; 89};
89 90
90static void 91static void
91usage (int status) 92usage (int status)
92{ 93{
93 if (status != 0) 94 if (status != 0)
97 printf (_("Usage: %s [option]... NODENAME\n\n"), get_identity ()); 98 printf (_("Usage: %s [option]... NODENAME\n\n"), get_identity ());
98 printf (_ 99 printf (_
99 (" -c, --config=DIR Read configuration options from DIR.\n" 100 (" -c, --config=DIR Read configuration options from DIR.\n"
100 " -D, --no-detach Don't fork and detach.\n" 101 " -D, --no-detach Don't fork and detach.\n"
101 " -l, --log-level=LEVEL Set logging level (info, notice, warn are common).\n" 102 " -l, --log-level=LEVEL Set logging level (info, notice, warn are common).\n"
102 " -L, --mlock Lock tinc into main memory.\n" 103 " -L, --mlock Lock gvpe into main memory.\n"
103 " --help Display this help and exit.\n" 104 " --help Display this help and exit.\n"
104 " --version Output version information and exit.\n\n")); 105 " --version Output version information and exit.\n\n"));
105 printf (_("Report bugs to <gvpe@schmorp.de>.\n")); 106 printf (_("Report bugs to <gvpe@schmorp.de>.\n"));
106 } 107 }
107 108
108 exit (status); 109 exit (status);
109} 110}
110 111
111void 112static void
112parse_options (int argc, char **argv, char **envp) 113parse_options (int argc, char **argv, char **envp)
113{ 114{
114 int r; 115 int r;
115 int option_index = 0; 116 int option_index = 0;
116 117
149 break; 150 break;
150 } 151 }
151 } 152 }
152} 153}
153 154
154/*
155 Close network connections, and terminate neatly 155// close network connections, and terminate neatly
156*/ 156static void
157void cleanup_and_exit(int c) 157cleanup_and_exit (int c)
158{ 158{
159 network.shutdown_all (); 159 network.shutdown_all ();
160 160
161 if (conf.pidfilename) 161 if (conf.pidfilename)
162 remove_pid (conf.pidfilename); 162 remove_pid (conf.pidfilename);
164 slog (L_INFO, _("terminating with exit code %d"), c); 164 slog (L_INFO, _("terminating with exit code %d"), c);
165 165
166 exit (c); 166 exit (c);
167} 167}
168 168
169/*
170 Signal handlers. 169// signal handlers
171*/ 170static RETSIGTYPE
172RETSIGTYPE
173sigterm_handler (int a) 171sigterm_handler (int a)
174{ 172{
175 network.events |= vpn::EVENT_SHUTDOWN; 173 network.events |= vpn::EVENT_SHUTDOWN;
176 network.event.start (); 174 network.event.start ();
177} 175}
178 176
179RETSIGTYPE 177static RETSIGTYPE
180sighup_handler (int a) 178sighup_handler (int a)
181{ 179{
182 network.events |= vpn::EVENT_RECONNECT; 180 network.events |= vpn::EVENT_RECONNECT;
183 network.event.start (); 181 network.event.start ();
184} 182}
185 183
186RETSIGTYPE 184static RETSIGTYPE
187sigusr1_handler (int a) 185sigusr1_handler (int a)
188{ 186{
189 network.dump_status (); 187 network.dump_status ();
190} 188}
191 189
192RETSIGTYPE 190static RETSIGTYPE
193sigusr2_handler (int a) 191sigusr2_handler (int a)
194{ 192{
195} 193}
196 194
197void 195static void
198setup_signals (void) 196setup_signals (void)
199{ 197{
200 struct sigaction act; 198 struct sigaction act;
201 199
202 sigfillset (&act.sa_mask); 200 sigfillset (&act.sa_mask);
209 act.sa_flags = SA_RESETHAND; 207 act.sa_flags = SA_RESETHAND;
210 act.sa_handler = sigterm_handler; sigaction (SIGINT , &act, NULL); 208 act.sa_handler = sigterm_handler; sigaction (SIGINT , &act, NULL);
211 act.sa_handler = sigterm_handler; sigaction (SIGTERM, &act, NULL); 209 act.sa_handler = sigterm_handler; sigaction (SIGTERM, &act, NULL);
212} 210}
213 211
212static int rand_fd;
213
214// antique C++ requires external linkage :/
215void
216reseed_rng (ev::timer &w, int revents)
217{
218 char buf [SEED_SIZE];
219 int n = read (rand_fd, buf, sizeof (buf));
220
221 if (n > 0)
222 RAND_seed (buf, n);
223}
224
225static void
226setup_rng (void)
227{
228 if (!*conf.seed_dev)
229 return;
230
231#ifndef O_BINARY
232# define O_BINARY 0
233#endif
234#ifndef O_NONBLOCK
235# define O_NONBLOCK 0
236#endif
237
238 rand_fd = open (conf.seed_dev, O_RDONLY | O_NONBLOCK | O_BINARY);
239
240 if (rand_fd < 0)
241 {
242 slog (L_ERR, _("unable to open seed device '%s': %s, exiting."), conf.seed_dev, strerror (errno));
243 exit (EXIT_FAILURE);
244 }
245
246 static ev::timer reseed_timer;
247
248 if (conf.reseed)
249 {
250 reseed_timer.set<reseed_rng> ();
251 reseed_timer.set (conf.reseed, conf.reseed);
252 reseed_timer.start (EV_DEFAULT);
253 }
254
255 reseed_rng (reseed_timer, 0);
256}
257
214int 258int
215main (int argc, char **argv, char **envp) 259main (int argc, char **argv, char **envp)
216{ 260{
217 ERR_load_crypto_strings (); // we have the RAM 261 ERR_load_crypto_strings (); // we have the RAM
218 262
233 { 277 {
234 printf (_("%s version %s (built %s %s, protocol version %d.%d)\n"), get_identity (), 278 printf (_("%s version %s (built %s %s, protocol version %d.%d)\n"), get_identity (),
235 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR); 279 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR);
236 printf (_("Built with kernel interface %s/%s.\n"), IFTYPE, IFSUBTYPE); 280 printf (_("Built with kernel interface %s/%s.\n"), IFTYPE, IFSUBTYPE);
237 printf (_ 281 printf (_
238 ("Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de> and others.\n" 282 ("Copyright (C) 2003-2011 Marc Lehmann <gvpe@schmorp.de> and others.\n"
239 "See the AUTHORS file for a complete list.\n\n" 283 "See the AUTHORS file for a complete list.\n\n"
240 "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" 284 "GVPE comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
241 "and you are welcome to redistribute it under certain conditions;\n" 285 "and you are welcome to redistribute it under certain conditions;\n"
242 "see the file COPYING for details.\n")); 286 "see the file COPYING for details.\n"));
243 287
244 return 0; 288 return 0;
245 } 289 }
273 configuration_parser (conf, true, argc, argv); 317 configuration_parser (conf, true, argc, argv);
274 } 318 }
275 319
276 set_loglevel (llevel != L_NONE ? llevel : conf.llevel); 320 set_loglevel (llevel != L_NONE ? llevel : conf.llevel);
277 321
278 RAND_load_file ("/dev/urandom", 1024); 322 setup_rng ();
279 323
280 if (!THISNODE) 324 if (!THISNODE)
281 { 325 {
282 slog (L_ERR, _("current node not set, or node '%s' not found in configfile, specify the nodename when starting gvpe."), 326 slog (L_ERR, _("current node not set, or node '%s' not found in configfile, specify the nodename when starting gvpe."),
283 thisnode ? thisnode : "<unset>"); 327 thisnode ? thisnode : "<unset>");
288 exit (EXIT_SUCCESS); 332 exit (EXIT_SUCCESS);
289 333
290 setup_signals (); 334 setup_signals ();
291 335
292 if (!network.setup ()) 336 if (!network.setup ())
337 if (network.drop_privileges ())
293 { 338 {
294 ev_loop (EV_DEFAULT_ 0); 339 ev_run (EV_DEFAULT_ 0);
295 cleanup_and_exit (EXIT_FAILURE); 340 cleanup_and_exit (EXIT_FAILURE);
296 } 341 }
297 342
298 slog (L_ERR, _("unable to setup network, unrecoverable error, exiting.")); 343 slog (L_CRIT, _("unrecoverable error while setting up network, exiting."));
299 cleanup_and_exit (EXIT_FAILURE); 344 cleanup_and_exit (EXIT_FAILURE);
300} 345}
301 346

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines