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.17 by pcg, Tue Oct 14 15:48:15 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
37 35
38#include <openssl/err.h> 36#include <openssl/err.h>
39#include <openssl/pem.h> 37#include <openssl/pem.h>
40#include <openssl/rsa.h> 38#include <openssl/rsa.h>
41#include <openssl/rand.h> 39#include <openssl/rand.h>
42 40#include <openssl/bn.h>
43#include "gettext.h"
44 41
45#include "conf.h" 42#include "conf.h"
46#include "slog.h" 43#include "slog.h"
47#include "util.h" 44#include "util.h"
48 45
49char *confbase; 46char *confbase;
50char *thisnode; 47char *thisnode;
51char *identname; 48char *identname;
52char *pidfilename;
53 49
54struct configuration conf; 50struct configuration conf;
55 51
56u8 best_protocol (u8 protset) 52u8 best_protocol (u8 protset)
57{ 53{
58 if (protset & PROT_IPv4 ) return PROT_IPv4; 54 if (protset & PROT_IPv4 ) return PROT_IPv4;
59 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 55 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
60 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 56 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
61 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 57 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
62 59
63 return 0; 60 return 0;
64} 61}
65 62
66const char *strprotocol (u8 protocol) 63const char *strprotocol (u8 protocol)
67{ 64{
68 if (protocol & PROT_IPv4 ) return "rawip"; 65 if (protocol & PROT_IPv4 ) return "rawip";
69 if (protocol & PROT_ICMPv4) return "icmp"; 66 if (protocol & PROT_ICMPv4) return "icmp";
70 if (protocol & PROT_UDPv4 ) return "udp"; 67 if (protocol & PROT_UDPv4 ) return "udp";
71 if (protocol & PROT_TCPv4 ) return "tcp"; 68 if (protocol & PROT_TCPv4 ) return "tcp";
69 if (protocol & PROT_DNSv4 ) return "dns";
72 70
73 return "<unknown>"; 71 return "<unknown>";
74} 72}
75 73
76void 74void
90 ); 88 );
91} 89}
92 90
93conf_node::~conf_node () 91conf_node::~conf_node ()
94{ 92{
93#if 0
94 // does not work, because string pointers etc. are shared
95 // is not called, however
95 if (rsa_key) 96 if (rsa_key)
96 RSA_free (rsa_key); 97 RSA_free (rsa_key);
97 98
98 free (nodename); 99 free (nodename);
99 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
100} 107}
101 108
102void configuration::init () 109void configuration::init ()
103{ 110{
104 memset (this, 0, sizeof (*this)); 111 memset (this, 0, sizeof (*this));
105 112
113 mtu = DEFAULT_MTU;
106 rekey = DEFAULT_REKEY; 114 rekey = DEFAULT_REKEY;
107 keepalive = DEFAULT_KEEPALIVE; 115 keepalive = DEFAULT_KEEPALIVE;
108 llevel = L_INFO; 116 llevel = L_INFO;
109 ip_proto = IPPROTO_GRE; 117 ip_proto = IPPROTO_GRE;
110#if ENABLE_ICMP 118#if ENABLE_ICMP
111 icmp_type = ICMP_ECHOREPLY; 119 icmp_type = ICMP_ECHOREPLY;
112#endif 120#endif
113 121
114 default_node.udp_port = DEFAULT_UDPPORT; 122 default_node.udp_port = DEFAULT_UDPPORT;
115 default_node.tcp_port = DEFAULT_UDPPORT; 123 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
116 default_node.connectmode = conf_node::C_ALWAYS; 124 default_node.connectmode = conf_node::C_ALWAYS;
117 default_node.compress = true; 125 default_node.compress = true;
118 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");
119} 142}
120 143
121void configuration::cleanup() 144void configuration::cleanup()
122{ 145{
123 if (rsa_key) 146 if (rsa_key)
124 RSA_free (rsa_key); 147 RSA_free (rsa_key);
125 148
126 rsa_key = 0; 149 rsa_key = 0;
127 150
151 free (pidfilename); pidfilename = 0;
128 free (ifname); ifname = 0; 152 free (ifname); ifname = 0;
129#if ENABLE_HTTP_PROXY 153#if ENABLE_HTTP_PROXY
130 free (proxy_host); proxy_host = 0; 154 free (proxy_host); proxy_host = 0;
131 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;
132#endif 159#endif
133} 160}
134 161
135void 162void
136configuration::clear_config () 163configuration::clear_config ()
142 169
143 cleanup (); 170 cleanup ();
144 init (); 171 init ();
145} 172}
146 173
147#define parse_bool(target,name,trueval,falseval) \ 174#define parse_bool(target,name,trueval,falseval) do { \
148 if (!strcmp (val, "yes")) target = trueval; \ 175 if (!strcmp (val, "yes")) target = trueval; \
149 else if (!strcmp (val, "no")) target = falseval; \ 176 else if (!strcmp (val, "no")) target = falseval; \
150 else if (!strcmp (val, "true")) target = trueval; \ 177 else if (!strcmp (val, "true")) target = trueval; \
151 else if (!strcmp (val, "false")) target = falseval; \ 178 else if (!strcmp (val, "false")) target = falseval; \
152 else if (!strcmp (val, "on")) target = trueval; \ 179 else if (!strcmp (val, "on")) target = trueval; \
153 else if (!strcmp (val, "off")) target = falseval; \ 180 else if (!strcmp (val, "off")) target = falseval; \
154 else \ 181 else \
155 slog (L_WARN, \ 182 slog (L_WARN, \
156 _("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"), \
157 name, var, fname, lineno); 184 name, var, fname, lineno); \
185} while (0)
158 186
159void configuration::read_config (bool need_keys) 187void configuration::read_config (bool need_keys)
160{ 188{
161 char *fname; 189 char *fname;
162 FILE *f; 190 FILE *f;
163 191
164 clear_config (); 192 clear_config ();
165 193
166 asprintf (&fname, "%s/vped.conf", confbase); 194 asprintf (&fname, "%s/gvpe.conf", confbase);
167 f = fopen (fname, "r"); 195 f = fopen (fname, "r");
168 196
169 if (f) 197 if (f)
170 { 198 {
171 char line[16384]; 199 char line[16384];
201 val = strtok (NULL, "\t\n\r ="); 229 val = strtok (NULL, "\t\n\r =");
202 230
203 if (!val || val[0] == '#') 231 if (!val || val[0] == '#')
204 { 232 {
205 slog (L_WARN, 233 slog (L_WARN,
206 _("no value for variable `%s', at '%s' line %d"), 234 _("no value for variable `%s', at '%s' line %d, skipping."),
207 var, fname, lineno); 235 var, fname, lineno);
208 break; 236 continue;
209 } 237 }
210 238
211 if (!strcmp (var, "on")) 239 if (!strcmp (var, "on"))
212 { 240 {
213 if (!::thisnode 241 if (!::thisnode
228 else 256 else
229 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);
230 } 258 }
231 else if (!strcmp (var, "ip-proto")) 259 else if (!strcmp (var, "ip-proto"))
232 ip_proto = atoi (val); 260 ip_proto = atoi (val);
261 else if (!strcmp (var, "icmp-type"))
262 {
233#if ENABLE_ICMP 263#if ENABLE_ICMP
234 //TODO: error message
235 else if (!strcmp (var, "icmp-type"))
236 icmp_type = atoi (val); 264 icmp_type = atoi (val);
237#endif 265#endif
266 }
238 267
239 // per config 268 // per config
240 else if (!strcmp (var, "node")) 269 else if (!strcmp (var, "node"))
241 { 270 {
242 default_node.id++; 271 default_node.id++;
260 289
261 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL)) 290 if (!PEM_read_RSAPublicKey(f, &node->rsa_key, NULL, NULL))
262 { 291 {
263 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 292 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
264 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));
265 exit (1); 294 exit (EXIT_FAILURE);
266 } 295 }
267 296
268 RSA_blinding_on (node->rsa_key, 0); 297 require (RSA_blinding_on (node->rsa_key, 0));
269 298
270 fclose (f); 299 fclose (f);
271 } 300 }
272 else 301 else
273 { 302 {
274 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));
275 304
276 if (need_keys) 305 if (need_keys)
277 exit (1); 306 exit (EXIT_FAILURE);
278 } 307 }
279 308
280 free (fname); 309 free (fname);
281 } 310 }
282 311
283 if (!::thisnode || !strcmp (node->nodename, ::thisnode)) 312 if (::thisnode && !strcmp (node->nodename, ::thisnode))
284 thisnode = node; 313 thisnode = node;
285 } 314 }
286 else if (!strcmp (var, "private-key")) 315 else if (!strcmp (var, "private-key"))
287 prikeyfile = strdup (val); 316 free (prikeyfile), prikeyfile = strdup (val);
288 else if (!strcmp (var, "ifpersist")) 317 else if (!strcmp (var, "ifpersist"))
289 {
290 parse_bool (ifpersist, "ifpersist", true, false); 318 parse_bool (ifpersist, "ifpersist", true, false);
291 }
292 else if (!strcmp (var, "ifname")) 319 else if (!strcmp (var, "ifname"))
293 ifname = strdup (val); 320 free (ifname), ifname = strdup (val);
294 else if (!strcmp (var, "rekey")) 321 else if (!strcmp (var, "rekey"))
295 rekey = atoi (val); 322 rekey = atoi (val);
296 else if (!strcmp (var, "keepalive")) 323 else if (!strcmp (var, "keepalive"))
297 keepalive = atoi (val); 324 keepalive = atoi (val);
298 else if (!strcmp (var, "mtu")) 325 else if (!strcmp (var, "mtu"))
299 mtu = atoi (val); 326 mtu = atoi (val);
300 else if (!strcmp (var, "if-up")) 327 else if (!strcmp (var, "if-up"))
301 script_if_up = strdup (val); 328 free (script_if_up), script_if_up = strdup (val);
302 else if (!strcmp (var, "node-up")) 329 else if (!strcmp (var, "node-up"))
303 script_node_up = strdup (val); 330 free (script_node_up), script_node_up = strdup (val);
304 else if (!strcmp (var, "node-down")) 331 else if (!strcmp (var, "node-down"))
305 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 {
306#if ENABLE_HTTP_PROXY 373#if ENABLE_HTTP_PROXY
307 else if (!strcmp (var, "http-proxy-host"))
308 proxy_host = strdup (val); 374 free (proxy_host), proxy_host = strdup (val);
375#endif
376 }
309 else if (!strcmp (var, "http-proxy-port")) 377 else if (!strcmp (var, "http-proxy-port"))
378 {
379#if ENABLE_HTTP_PROXY
310 proxy_port = atoi (val); 380 proxy_port = atoi (val);
381#endif
382 }
311 else if (!strcmp (var, "http-proxy-auth")) 383 else if (!strcmp (var, "http-proxy-auth"))
384 {
385#if ENABLE_HTTP_PROXY
312 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val)); 386 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val));
313#endif 387#endif
388 }
314 389
315 /* node-specific, non-defaultable */ 390 /* node-specific, non-defaultable */
316 else if (node != &default_node && !strcmp (var, "hostname")) 391 else if (node != &default_node && !strcmp (var, "hostname"))
317 {
318 free (node->hostname);
319 node->hostname = strdup (val); 392 free (node->hostname), node->hostname = strdup (val);
320 }
321 393
322 /* node-specific, defaultable */ 394 /* node-specific, defaultable */
323 else if (!strcmp (var, "udp-port")) 395 else if (!strcmp (var, "udp-port"))
324 node->udp_port = atoi (val); 396 node->udp_port = atoi (val);
325 else if (!strcmp (var, "tcp-port")) 397 else if (!strcmp (var, "tcp-port"))
326 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);
327 else if (!strcmp (var, "router-priority")) 419 else if (!strcmp (var, "router-priority"))
328 node->routerprio = atoi (val); 420 node->routerprio = atoi (val);
421 else if (!strcmp (var, "max-retry"))
422 node->max_retry = atoi (val);
329 else if (!strcmp (var, "connect")) 423 else if (!strcmp (var, "connect"))
330 { 424 {
331 if (!strcmp (val, "ondemand")) 425 if (!strcmp (val, "ondemand"))
332 node->connectmode = conf_node::C_ONDEMAND; 426 node->connectmode = conf_node::C_ONDEMAND;
333 else if (!strcmp (val, "never")) 427 else if (!strcmp (val, "never"))
336 node->connectmode = conf_node::C_ALWAYS; 430 node->connectmode = conf_node::C_ALWAYS;
337 else if (!strcmp (val, "disabled")) 431 else if (!strcmp (val, "disabled"))
338 node->connectmode = conf_node::C_DISABLED; 432 node->connectmode = conf_node::C_DISABLED;
339 else 433 else
340 slog (L_WARN, 434 slog (L_WARN,
341 _("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."),
342 var, fname, lineno); 436 var, fname, lineno);
343 } 437 }
344 else if (!strcmp (var, "inherit-tos")) 438 else if (!strcmp (var, "inherit-tos"))
345 {
346 parse_bool (node->inherit_tos, "inherit-tos", true, false); 439 parse_bool (node->inherit_tos, "inherit-tos", true, false);
347 }
348 else if (!strcmp (var, "compress")) 440 else if (!strcmp (var, "compress"))
349 {
350 parse_bool (node->compress, "compress", true, false); 441 parse_bool (node->compress, "compress", true, false);
351 }
352 // 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!
353 else if (!strcmp (var, "enable-tcp")) 443 else if (!strcmp (var, "enable-tcp"))
354 { 444 {
355#if ENABLE_TCP 445#if ENABLE_TCP
356 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;
358 } 448 }
359 else if (!strcmp (var, "enable-icmp")) 449 else if (!strcmp (var, "enable-icmp"))
360 { 450 {
361#if ENABLE_ICMP 451#if ENABLE_ICMP
362 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;
363#endif 459#endif
364 } 460 }
365 else if (!strcmp (var, "enable-udp")) 461 else if (!strcmp (var, "enable-udp"))
366 { 462 {
367 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;
372 } 468 }
373 469
374 // unknown or misplaced 470 // unknown or misplaced
375 else 471 else
376 slog (L_WARN, 472 slog (L_WARN,
377 _("unknown or misplaced variable `%s', at '%s' line %d"), 473 _("unknown or misplaced variable `%s', at '%s' line %d, skipping."),
378 var, fname, lineno); 474 var, fname, lineno);
379 } 475 }
380 476
381 fclose (f); 477 fclose (f);
382 } 478 }
383 else 479 else
384 { 480 {
385 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));
386 exit (1); 482 exit (EXIT_FAILURE);
387 } 483 }
388 484
389 free (fname); 485 free (fname);
390 486
391 fname = config_filename (prikeyfile, "hostkey"); 487 fname = config_filename (prikeyfile, "hostkey");
397 493
398 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL)) 494 if (!PEM_read_RSAPrivateKey (f, &rsa_key, NULL, NULL))
399 { 495 {
400 ERR_load_RSA_strings (); ERR_load_PEM_strings (); 496 ERR_load_RSA_strings (); ERR_load_PEM_strings ();
401 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));
402 exit (1); 498 exit (EXIT_FAILURE);
403 } 499 }
404 500
405 RSA_blinding_on (rsa_key, 0); 501 require (RSA_blinding_on (rsa_key, 0));
406 502
407 fclose (f); 503 fclose (f);
408 } 504 }
409 else 505 else
410 { 506 {
411 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));
412 508
413 if (need_keys) 509 if (need_keys)
414 exit (1); 510 exit (EXIT_FAILURE);
415 } 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 }
416 521
417 free (fname); 522 free (fname);
418} 523}
419 524
420char *configuration::config_filename (const char *name, const char *dflt) 525char *configuration::config_filename (const char *name, const char *dflt)
456 printf ("\n"); 561 printf ("\n");
457} 562}
458 563
459configuration::configuration () 564configuration::configuration ()
460{ 565{
566 asprintf (&confbase, "%s/gvpe", CONFDIR);
567
461 init (); 568 init ();
462} 569}
463 570
464configuration::~configuration () 571configuration::~configuration ()
465{ 572{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines