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

Comparing gvpe/src/conf.C (file contents):
Revision 1.14 by pcg, Tue Apr 8 03:25:35 2003 UTC vs.
Revision 1.39 by pcg, Sat Mar 26 03:16:24 2005 UTC

1/* 1/*
2 conf.c -- configuration code 2 conf.c -- configuration code
3 Copyright (C) 1998 Robert van der Meulen 3 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4 1998-2002 Ivo Timmermans <ivo@o2w.nl>
5 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
6 2000 Cris van Pelt <tribbel@arise.dhs.org>
7 2003 Marc Lehmann <pcg@goof.com>
8 4
5 This file is part of GVPE.
6
9 This program is free software; you can redistribute it and/or modify 7 GVPE is free software; you can redistribute it and/or modify
10 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
11 the Free Software Foundation; either version 2 of the License, or 9 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version. 10 (at your option) any later version.
13 11
14 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details. 15 GNU General Public License for more details.
18 16
19 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software 18 along with gvpe; if not, write to the Free Software
21 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22*/ 20*/
23 21
24#include "config.h" 22#include "config.h"
25 23
31#include <netdb.h> 29#include <netdb.h>
32#include <sys/stat.h> 30#include <sys/stat.h>
33#include <sys/types.h> 31#include <sys/types.h>
34#include <unistd.h> 32#include <unistd.h>
35 33
36#include <netinet/in.h> 34#include "netcompat.h"
37#include <netinet/ip_icmp.h>
38 35
39#include <openssl/err.h> 36#include <openssl/err.h>
40#include <openssl/pem.h> 37#include <openssl/pem.h>
41#include <openssl/rsa.h> 38#include <openssl/rsa.h>
42#include <openssl/rand.h> 39#include <openssl/rand.h>
43 40#include <openssl/bn.h>
44#include "gettext.h"
45 41
46#include "conf.h" 42#include "conf.h"
47#include "slog.h" 43#include "slog.h"
48#include "util.h" 44#include "util.h"
49 45
50char *confbase; 46char *confbase;
51char *thisnode; 47char *thisnode;
52char *identname; 48char *identname;
53char *pidfilename;
54 49
55struct configuration conf; 50struct configuration conf;
56 51
57u8 best_protocol (u8 protset) 52u8 best_protocol (u8 protset)
58{ 53{
59 if (protset & PROT_IPv4 ) return PROT_IPv4; 54 if (protset & PROT_IPv4 ) return PROT_IPv4;
60 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 55 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
61 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 56 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
62 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 57 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
63 59
64 return 0; 60 return 0;
65} 61}
66 62
67const char *strprotocol (u8 protocol) 63const char *strprotocol (u8 protocol)
68{ 64{
69 if (protocol & PROT_IPv4 ) return "rawip"; 65 if (protocol & PROT_IPv4 ) return "rawip";
70 if (protocol & PROT_ICMPv4) return "icmp"; 66 if (protocol & PROT_ICMPv4) return "icmp";
71 if (protocol & PROT_UDPv4 ) return "udp"; 67 if (protocol & PROT_UDPv4 ) return "udp";
72 if (protocol & PROT_TCPv4 ) return "tcp"; 68 if (protocol & PROT_TCPv4 ) return "tcp";
69 if (protocol & PROT_DNSv4 ) return "dns";
73 70
74 return "<unknown>"; 71 return "<unknown>";
75} 72}
76 73
77void 74void
91 ); 88 );
92} 89}
93 90
94conf_node::~conf_node () 91conf_node::~conf_node ()
95{ 92{
93#if 0
94 // does not work, because string pointers etc. are shared
95 // is not called, however
96 if (rsa_key) 96 if (rsa_key)
97 RSA_free (rsa_key); 97 RSA_free (rsa_key);
98 98
99 free (nodename); 99 free (nodename);
100 free (hostname); 100 free (hostname);
101 free (if_up_data);
102#if ENABLE_DNS
103 free (domain);
104 free (dns_hostname);
105#endif
106#endif
101} 107}
102 108
103void configuration::init () 109void configuration::init ()
104{ 110{
105 memset (this, 0, sizeof (*this)); 111 memset (this, 0, sizeof (*this));
106 112
113 mtu = DEFAULT_MTU;
107 rekey = DEFAULT_REKEY; 114 rekey = DEFAULT_REKEY;
108 keepalive = DEFAULT_KEEPALIVE; 115 keepalive = DEFAULT_KEEPALIVE;
109 llevel = L_INFO; 116 llevel = L_INFO;
110 ip_proto = IPPROTO_GRE; 117 ip_proto = IPPROTO_GRE;
118#if ENABLE_ICMP
111 icmp_type = ICMP_ECHOREPLY; 119 icmp_type = ICMP_ECHOREPLY;
120#endif
112 121
113 default_node.udp_port = DEFAULT_UDPPORT; 122 default_node.udp_port = DEFAULT_UDPPORT;
114 default_node.tcp_port = DEFAULT_UDPPORT; 123 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
115 default_node.connectmode = conf_node::C_ALWAYS; 124 default_node.connectmode = conf_node::C_ALWAYS;
116 default_node.compress = true; 125 default_node.compress = true;
117 default_node.protocols = PROT_UDPv4; 126 default_node.protocols = 0;
127 default_node.max_retry = DEFAULT_MAX_RETRY;
128 default_node.if_up_data = strdup ("");
129
130#if ENABLE_DNS
131 default_node.dns_port = 0; // default is 0 == client
132
133 dns_forw_host = strdup ("127.0.0.1");
134 dns_forw_port = 53;
135 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR;
136 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL;
137 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR;
138 dns_max_outstanding = DEFAULT_DNS_MAX_OUTSTANDING;
139#endif
140
141 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
118} 142}
119 143
120void configuration::cleanup() 144void configuration::cleanup()
121{ 145{
122 if (rsa_key) 146 if (rsa_key)
123 RSA_free (rsa_key); 147 RSA_free (rsa_key);
124 148
125 rsa_key = 0; 149 rsa_key = 0;
126 150
151 free (pidfilename); pidfilename = 0;
127 free (ifname); ifname = 0; 152 free (ifname); ifname = 0;
128#if ENABLE_HTTP_PROXY 153#if ENABLE_HTTP_PROXY
129 free (proxy_host); proxy_host = 0; 154 free (proxy_host); proxy_host = 0;
130 free (proxy_auth); proxy_auth = 0; 155 free (proxy_auth); proxy_auth = 0;
156#endif
157#if ENABLE_DNS
158 free (dns_forw_host); dns_forw_host = 0;
131#endif 159#endif
132} 160}
133 161
134void 162void
135configuration::clear_config () 163configuration::clear_config ()
141 169
142 cleanup (); 170 cleanup ();
143 init (); 171 init ();
144} 172}
145 173
146#define parse_bool(target,name,trueval,falseval) \ 174#define parse_bool(target,name,trueval,falseval) do { \
147 if (!strcmp (val, "yes")) target = trueval; \ 175 if (!strcmp (val, "yes")) target = trueval; \
148 else if (!strcmp (val, "no")) target = falseval; \ 176 else if (!strcmp (val, "no")) target = falseval; \
149 else if (!strcmp (val, "true")) target = trueval; \ 177 else if (!strcmp (val, "true")) target = trueval; \
150 else if (!strcmp (val, "false")) target = falseval; \ 178 else if (!strcmp (val, "false")) target = falseval; \
151 else if (!strcmp (val, "on")) target = trueval; \ 179 else if (!strcmp (val, "on")) target = trueval; \
152 else if (!strcmp (val, "off")) target = falseval; \ 180 else if (!strcmp (val, "off")) target = falseval; \
153 else \ 181 else \
154 slog (L_WARN, \ 182 slog (L_WARN, \
155 _("illegal value for '%s', only 'yes|true|on' or 'no|false|off' allowed, at '%s' line %d"), \ 183 _("illegal value for '%s', only 'yes|true|on' or 'no|false|off' allowed, at '%s' line %d"), \
156 name, var, fname, lineno); 184 name, var, fname, lineno); \
185} while (0)
157 186
158void configuration::read_config (bool need_keys) 187void configuration::read_config (bool need_keys)
159{ 188{
160 char *fname; 189 char *fname;
161 FILE *f; 190 FILE *f;
162 191
163 clear_config (); 192 clear_config ();
164 193
165 asprintf (&fname, "%s/vped.conf", confbase); 194 asprintf (&fname, "%s/gvpe.conf", confbase);
166 f = fopen (fname, "r"); 195 f = fopen (fname, "r");
167 196
168 if (f) 197 if (f)
169 { 198 {
170 char line[16384]; 199 char line[16384];
200 val = strtok (NULL, "\t\n\r ="); 229 val = strtok (NULL, "\t\n\r =");
201 230
202 if (!val || val[0] == '#') 231 if (!val || val[0] == '#')
203 { 232 {
204 slog (L_WARN, 233 slog (L_WARN,
205 _("no value for variable `%s', at '%s' line %d"), 234 _("no value for variable `%s', at '%s' line %d, skipping."),
206 var, fname, lineno); 235 var, fname, lineno);
207 break; 236 continue;
208 } 237 }
209 238
210 if (!strcmp (var, "on")) 239 if (!strcmp (var, "on"))
211 { 240 {
212 if (!::thisnode 241 if (!::thisnode
228 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line); 257 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line);
229 } 258 }
230 else if (!strcmp (var, "ip-proto")) 259 else if (!strcmp (var, "ip-proto"))
231 ip_proto = atoi (val); 260 ip_proto = atoi (val);
232 else if (!strcmp (var, "icmp-type")) 261 else if (!strcmp (var, "icmp-type"))
262 {
263#if ENABLE_ICMP
233 icmp_type = atoi (val); 264 icmp_type = atoi (val);
265#endif
266 }
234 267
235 // per config 268 // per config
236 else if (!strcmp (var, "node")) 269 else if (!strcmp (var, "node"))
237 { 270 {
238 default_node.id++; 271 default_node.id++;
256 289
257 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL)) 290 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL))
258 { 291 {
259 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 292 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
260 slog (L_ERR, _("unable to open public rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0)); 293 slog (L_ERR, _("unable to open public rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0));
261 exit (1); 294 exit (EXIT_FAILURE);
262 } 295 }
263 296
264 RSA_blinding_on (node->rsa_key, 0); 297 require (RSA_blinding_on (node->rsa_key, 0));
265 298
266 fclose (f); 299 fclose (f);
267 } 300 }
268 else 301 else
269 { 302 {
270 slog (need_keys ? L_ERR : L_NOTICE, _("unable to read public rsa key file '%s': %s"), fname, strerror (errno)); 303 slog (need_keys ? L_ERR : L_NOTICE, _("unable to read public rsa key file '%s': %s"), fname, strerror (errno));
271 304
272 if (need_keys) 305 if (need_keys)
273 exit (1); 306 exit (EXIT_FAILURE);
274 } 307 }
275 308
276 free (fname); 309 free (fname);
277 } 310 }
278 311
279 if (!::thisnode || !strcmp (node->nodename, ::thisnode)) 312 if (::thisnode && !strcmp (node->nodename, ::thisnode))
280 thisnode = node; 313 thisnode = node;
281 } 314 }
282 else if (!strcmp (var, "private-key")) 315 else if (!strcmp (var, "private-key"))
283 prikeyfile = strdup (val); 316 free (prikeyfile), prikeyfile = strdup (val);
284 else if (!strcmp (var, "ifpersist")) 317 else if (!strcmp (var, "ifpersist"))
285 {
286 parse_bool (ifpersist, "ifpersist", true, false); 318 parse_bool (ifpersist, "ifpersist", true, false);
287 }
288 else if (!strcmp (var, "ifname")) 319 else if (!strcmp (var, "ifname"))
289 ifname = strdup (val); 320 free (ifname), ifname = strdup (val);
290 else if (!strcmp (var, "rekey")) 321 else if (!strcmp (var, "rekey"))
291 rekey = atoi (val); 322 rekey = atoi (val);
292 else if (!strcmp (var, "keepalive")) 323 else if (!strcmp (var, "keepalive"))
293 keepalive = atoi (val); 324 keepalive = atoi (val);
294 else if (!strcmp (var, "mtu")) 325 else if (!strcmp (var, "mtu"))
295 mtu = atoi (val); 326 mtu = atoi (val);
296 else if (!strcmp (var, "if-up")) 327 else if (!strcmp (var, "if-up"))
297 script_if_up = strdup (val); 328 free (script_if_up), script_if_up = strdup (val);
298 else if (!strcmp (var, "node-up")) 329 else if (!strcmp (var, "node-up"))
299 script_node_up = strdup (val); 330 free (script_node_up), script_node_up = strdup (val);
300 else if (!strcmp (var, "node-down")) 331 else if (!strcmp (var, "node-down"))
301 script_node_down = strdup (val); 332 free (script_node_down), script_node_down = strdup (val);
333 else if (!strcmp (var, "pid-file"))
334 free (pidfilename), pidfilename = strdup (val);
335 else if (!strcmp (var, "dns-forw-host"))
336 {
337#if ENABLE_DNS
338 free (dns_forw_host), dns_forw_host = strdup (val);
339#endif
340 }
341 else if (!strcmp (var, "dns-forw-port"))
342 {
343#if ENABLE_DNS
344 dns_forw_port = atoi (val);
345#endif
346 }
347 else if (!strcmp (var, "dns-timeout-factor"))
348 {
349#if ENABLE_DNS
350 dns_timeout_factor = atof (val);
351#endif
352 }
353 else if (!strcmp (var, "dns-send-interval"))
354 {
355#if ENABLE_DNS
356 dns_send_interval = atoi (val);
357#endif
358 }
359 else if (!strcmp (var, "dns-overlap-factor"))
360 {
361#if ENABLE_DNS
362 dns_overlap_factor = atof (val);
363#endif
364 }
365 else if (!strcmp (var, "dns-max-outstanding"))
366 {
367#if ENABLE_DNS
368 dns_max_outstanding = atoi (val);
369#endif
370 }
371 else if (!strcmp (var, "http-proxy-host"))
372 {
302#if ENABLE_HTTP_PROXY 373#if ENABLE_HTTP_PROXY
303 else if (!strcmp (var, "http-proxy-host"))
304 proxy_host = strdup (val); 374 free (proxy_host), proxy_host = strdup (val);
375#endif
376 }
305 else if (!strcmp (var, "http-proxy-port")) 377 else if (!strcmp (var, "http-proxy-port"))
378 {
379#if ENABLE_HTTP_PROXY
306 proxy_port = atoi (val); 380 proxy_port = atoi (val);
381#endif
382 }
307 else if (!strcmp (var, "http-proxy-auth")) 383 else if (!strcmp (var, "http-proxy-auth"))
384 {
385#if ENABLE_HTTP_PROXY
308 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val)); 386 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val));
309#endif 387#endif
388 }
310 389
311 /* node-specific, non-defaultable */ 390 /* node-specific, non-defaultable */
312 else if (node != &default_node && !strcmp (var, "hostname")) 391 else if (node != &default_node && !strcmp (var, "hostname"))
313 {
314 free (node->hostname);
315 node->hostname = strdup (val); 392 free (node->hostname), node->hostname = strdup (val);
316 }
317 393
318 /* node-specific, defaultable */ 394 /* node-specific, defaultable */
319 else if (!strcmp (var, "udp-port")) 395 else if (!strcmp (var, "udp-port"))
320 node->udp_port = atoi (val); 396 node->udp_port = atoi (val);
321 else if (!strcmp (var, "tcp-port")) 397 else if (!strcmp (var, "tcp-port"))
322 node->tcp_port = atoi (val); 398 node->tcp_port = atoi (val);
399 else if (!strcmp (var, "dns-hostname"))
400 {
401#if ENABLE_DNS
402 free (node->dns_hostname), node->dns_hostname = strdup (val);
403#endif
404 }
405 else if (!strcmp (var, "dns-port"))
406 {
407#if ENABLE_DNS
408 node->dns_port = atoi (val);
409#endif
410 }
411 else if (!strcmp (var, "dns-domain"))
412 {
413#if ENABLE_DNS
414 free (node->domain), node->domain = strdup (val);
415#endif
416 }
417 else if (!strcmp (var, "if-up-data"))
418 free (node->if_up_data), node->if_up_data = strdup (val);
323 else if (!strcmp (var, "router-priority")) 419 else if (!strcmp (var, "router-priority"))
324 node->routerprio = atoi (val); 420 node->routerprio = atoi (val);
421 else if (!strcmp (var, "max-retry"))
422 node->max_retry = atoi (val);
325 else if (!strcmp (var, "connect")) 423 else if (!strcmp (var, "connect"))
326 { 424 {
327 if (!strcmp (val, "ondemand")) 425 if (!strcmp (val, "ondemand"))
328 node->connectmode = conf_node::C_ONDEMAND; 426 node->connectmode = conf_node::C_ONDEMAND;
329 else if (!strcmp (val, "never")) 427 else if (!strcmp (val, "never"))
332 node->connectmode = conf_node::C_ALWAYS; 430 node->connectmode = conf_node::C_ALWAYS;
333 else if (!strcmp (val, "disabled")) 431 else if (!strcmp (val, "disabled"))
334 node->connectmode = conf_node::C_DISABLED; 432 node->connectmode = conf_node::C_DISABLED;
335 else 433 else
336 slog (L_WARN, 434 slog (L_WARN,
337 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d"), 435 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d, ignoring."),
338 var, fname, lineno); 436 var, fname, lineno);
339 } 437 }
340 else if (!strcmp (var, "inherit-tos")) 438 else if (!strcmp (var, "inherit-tos"))
341 {
342 parse_bool (node->inherit_tos, "inherit-tos", true, false); 439 parse_bool (node->inherit_tos, "inherit-tos", true, false);
343 }
344 else if (!strcmp (var, "compress")) 440 else if (!strcmp (var, "compress"))
345 {
346 parse_bool (node->compress, "compress", true, false); 441 parse_bool (node->compress, "compress", true, false);
347 }
348 // all these bool options really really cost a lot of executable size! 442 // all these bool options really really cost a lot of executable size!
349 else if (!strcmp (var, "enable-tcp")) 443 else if (!strcmp (var, "enable-tcp"))
350 { 444 {
351#if ENABLE_TCP 445#if ENABLE_TCP
352 u8 v; parse_bool (v, "enable-tcp" , PROT_TCPv4, 0); node->protocols = (node->protocols & ~PROT_TCPv4) | v; 446 u8 v; parse_bool (v, "enable-tcp" , PROT_TCPv4, 0); node->protocols = (node->protocols & ~PROT_TCPv4) | v;
354 } 448 }
355 else if (!strcmp (var, "enable-icmp")) 449 else if (!strcmp (var, "enable-icmp"))
356 { 450 {
357#if ENABLE_ICMP 451#if ENABLE_ICMP
358 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v; 452 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v;
453#endif
454 }
455 else if (!strcmp (var, "enable-dns"))
456 {
457#if ENABLE_DNS
458 u8 v; parse_bool (v, "enable-dns" , PROT_DNSv4, 0); node->protocols = (node->protocols & ~PROT_DNSv4) | v;
359#endif 459#endif
360 } 460 }
361 else if (!strcmp (var, "enable-udp")) 461 else if (!strcmp (var, "enable-udp"))
362 { 462 {
363 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v; 463 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v;
368 } 468 }
369 469
370 // unknown or misplaced 470 // unknown or misplaced
371 else 471 else
372 slog (L_WARN, 472 slog (L_WARN,
373 _("unknown or misplaced variable `%s', at '%s' line %d"), 473 _("unknown or misplaced variable `%s', at '%s' line %d, skipping."),
374 var, fname, lineno); 474 var, fname, lineno);
375 } 475 }
376 476
377 fclose (f); 477 fclose (f);
378 } 478 }
379 else 479 else
380 { 480 {
381 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno)); 481 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
382 exit (1); 482 exit (EXIT_FAILURE);
383 } 483 }
384 484
385 free (fname); 485 free (fname);
386 486
387 fname = config_filename (prikeyfile, "hostkey"); 487 fname = config_filename (prikeyfile, "hostkey");
393 493
394 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL)) 494 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL))
395 { 495 {
396 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 496 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
397 slog (L_ERR, _("unable to read private rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0)); 497 slog (L_ERR, _("unable to read private rsa key file '%s': %s"), fname, ERR_error_string (ERR_get_error (), 0));
398 exit (1); 498 exit (EXIT_FAILURE);
399 } 499 }
400 500
401 RSA_blinding_on (rsa_key, 0); 501 require (RSA_blinding_on (rsa_key, 0));
402 502
403 fclose (f); 503 fclose (f);
404 } 504 }
405 else 505 else
406 { 506 {
407 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 507 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
408 508
409 if (need_keys) 509 if (need_keys)
410 exit (1); 510 exit (EXIT_FAILURE);
411 } 511 }
512
513 if (need_keys && ::thisnode
514 && rsa_key && thisnode && thisnode->rsa_key)
515 if (BN_cmp (rsa_key->n, thisnode->rsa_key->n) != 0
516 || BN_cmp (rsa_key->e, thisnode->rsa_key->e) != 0)
517 {
518 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
519 exit (EXIT_FAILURE);
520 }
412 521
413 free (fname); 522 free (fname);
414} 523}
415 524
416char *configuration::config_filename (const char *name, const char *dflt) 525char *configuration::config_filename (const char *name, const char *dflt)
438 printf (_("MTU: %d\n"), mtu); 547 printf (_("MTU: %d\n"), mtu);
439 printf (_("rekeying interval: %d\n"), rekey); 548 printf (_("rekeying interval: %d\n"), rekey);
440 printf (_("keepalive interval: %d\n"), keepalive); 549 printf (_("keepalive interval: %d\n"), keepalive);
441 printf (_("interface: %s\n"), ifname); 550 printf (_("interface: %s\n"), ifname);
442 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 551 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
443 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) : -1); 552 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
444 printf ("\n"); 553 printf ("\n");
445 554
446 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 555 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n",
447 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 556 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port"));
448 557
452 printf ("\n"); 561 printf ("\n");
453} 562}
454 563
455configuration::configuration () 564configuration::configuration ()
456{ 565{
566 asprintf (&confbase, "%s/gvpe", CONFDIR);
567
457 init (); 568 init ();
458} 569}
459 570
460configuration::~configuration () 571configuration::~configuration ()
461{ 572{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines