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.42 by pcg, Mon Dec 5 12:58:08 2005 UTC vs.
Revision 1.61 by root, Tue Jul 16 16:44:36 2013 UTC

1/* 1/*
2 conf.c -- configuration code 2 conf.C -- configuration code
3 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de> 3 Copyright (C) 2003-2008,2011 Marc Lehmann <gvpe@schmorp.de>
4 4
5 This file is part of GVPE. 5 This file is part of GVPE.
6 6
7 GVPE is free software; you can redistribute it and/or modify 7 GVPE is free software; you can redistribute it and/or modify it
8 it under the terms of the GNU General Public License as published by 8 under the terms of the GNU General Public License as published by the
9 the Free Software Foundation; either version 2 of the License, or 9 Free Software Foundation; either version 3 of the License, or (at your
10 (at your option) any later version. 10 option) any later version.
11 11
12 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, but
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 GNU General Public License for more details. 15 Public License for more details.
16 16
17 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 along
18 along with gvpe; if not, write to the Free Software 18 with this program; if not, see <http://www.gnu.org/licenses/>.
19 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this Program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a modified
24 version of that library), containing parts covered by the terms of the
25 OpenSSL or SSLeay licenses, the licensors of this Program grant you
26 additional permission to convey the resulting work. Corresponding
27 Source for a non-source form of such a combination shall include the
28 source code for the parts of OpenSSL used as well as that of the
29 covered work.
20*/ 30*/
21 31
22#include "config.h" 32#include "config.h"
23 33
24#include <cstdio> 34#include <cstdio>
28#include <errno.h> 38#include <errno.h>
29#include <netdb.h> 39#include <netdb.h>
30#include <sys/stat.h> 40#include <sys/stat.h>
31#include <sys/types.h> 41#include <sys/types.h>
32#include <unistd.h> 42#include <unistd.h>
43#include <pwd.h>
33 44
34#include "netcompat.h" 45#include "netcompat.h"
35 46
36#include <openssl/err.h> 47#include <openssl/err.h>
37#include <openssl/pem.h> 48#include <openssl/pem.h>
47char *thisnode; 58char *thisnode;
48char *identname; 59char *identname;
49 60
50struct configuration conf; 61struct configuration conf;
51 62
63u8
52u8 best_protocol (u8 protset) 64best_protocol (u8 protset)
53{ 65{
54 if (protset & PROT_IPv4 ) return PROT_IPv4; 66 if (protset & PROT_IPv4 ) return PROT_IPv4;
55 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 67 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
56 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 68 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
57 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 69 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 if (protset & PROT_DNSv4 ) return PROT_DNSv4; 70 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
59 71
60 return 0; 72 return 0;
61} 73}
62 74
75const char *
63const char *strprotocol (u8 protocol) 76strprotocol (u8 protocol)
64{ 77{
65 if (protocol & PROT_IPv4 ) return "rawip"; 78 if (protocol & PROT_IPv4 ) return "rawip";
66 if (protocol & PROT_ICMPv4) return "icmp"; 79 if (protocol & PROT_ICMPv4) return "icmp";
67 if (protocol & PROT_UDPv4 ) return "udp"; 80 if (protocol & PROT_UDPv4 ) return "udp";
68 if (protocol & PROT_TCPv4 ) return "tcp"; 81 if (protocol & PROT_TCPv4 ) return "tcp";
82 95
83 return false; 96 return false;
84} 97}
85 98
86bool 99bool
87conf_node::can_direct (struct conf_node *other) 100conf_node::may_direct (struct conf_node *other)
88{ 101{
89 if (match_list (allow_direct, other->nodename)) 102 if (match_list (allow_direct, other->nodename))
90 return true; 103 return true;
91 104
92 if (match_list (deny_direct, other->nodename)) 105 if (match_list (deny_direct, other->nodename))
93 return false; 106 return false;
94 107
95 return true; 108 return true;
96}
97
98void
99conf_node::print ()
100{
101 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n",
102 id,
103 id >> 8, id & 0xff,
104 compress ? 'Y' : 'N',
105 connectmode == C_ONDEMAND ? "ondemand" :
106 connectmode == C_NEVER ? "never" :
107 connectmode == C_ALWAYS ? "always" : "",
108 nodename,
109 hostname ? hostname : "",
110 hostname ? ":" : "",
111 hostname ? udp_port : 0
112 );
113} 109}
114 110
115conf_node::~conf_node () 111conf_node::~conf_node ()
116{ 112{
117#if 0 113#if 0
128 free (dns_hostname); 124 free (dns_hostname);
129#endif 125#endif
130#endif 126#endif
131} 127}
132 128
129void
133void configuration::init () 130configuration::init ()
134{ 131{
135 memset (this, 0, sizeof (*this)); 132 memset (this, 0, sizeof (*this));
136 133
137 mtu = DEFAULT_MTU; 134 mtu = DEFAULT_MTU;
135 nfmark = 0;
138 rekey = DEFAULT_REKEY; 136 rekey = DEFAULT_REKEY;
139 keepalive = DEFAULT_KEEPALIVE; 137 keepalive = DEFAULT_KEEPALIVE;
140 llevel = L_INFO; 138 llevel = L_INFO;
141 ip_proto = IPPROTO_GRE; 139 ip_proto = IPPROTO_GRE;
142#if ENABLE_ICMP 140#if ENABLE_ICMP
147 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm 145 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
148 default_node.connectmode = conf_node::C_ALWAYS; 146 default_node.connectmode = conf_node::C_ALWAYS;
149 default_node.compress = true; 147 default_node.compress = true;
150 default_node.protocols = 0; 148 default_node.protocols = 0;
151 default_node.max_retry = DEFAULT_MAX_RETRY; 149 default_node.max_retry = DEFAULT_MAX_RETRY;
150 default_node.max_ttl = DEFAULT_MAX_TTL;
151 default_node.max_queue = DEFAULT_MAX_QUEUE;
152 default_node.if_up_data = strdup (""); 152 default_node.if_up_data = strdup ("");
153 153
154#if ENABLE_DNS 154#if ENABLE_DNS
155 default_node.dns_port = 0; // default is 0 == client 155 default_node.dns_port = 0; // default is 0 == client
156 156
157 dns_case_preserving = true;
157 dns_forw_host = strdup ("127.0.0.1"); 158 dns_forw_host = strdup ("127.0.0.1");
158 dns_forw_port = 53; 159 dns_forw_port = 53;
159 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR; 160 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR;
160 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL; 161 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL;
161 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR; 162 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR;
162 dns_max_outstanding = DEFAULT_DNS_MAX_OUTSTANDING; 163 dns_max_outstanding = DEFAULT_DNS_MAX_OUTSTANDING;
163#endif 164#endif
164 165
165 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid"); 166 pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
167 seed_dev = strdup ("/dev/urandom");
168 reseed = DEFAULT_RESEED;
166} 169}
167 170
171void
168void configuration::cleanup() 172configuration::cleanup ()
169{ 173{
170 if (rsa_key) 174 if (rsa_key)
171 RSA_free (rsa_key); 175 RSA_free (rsa_key);
172 176
173 rsa_key = 0; 177 rsa_key = 0;
174 178
179 free (seed_dev); seed_dev = 0;
175 free (pidfilename); pidfilename = 0; 180 free (pidfilename); pidfilename = 0;
176 free (ifname); ifname = 0; 181 free (ifname); ifname = 0;
177#if ENABLE_HTTP_PROXY 182#if ENABLE_HTTP_PROXY
178 free (proxy_host); proxy_host = 0; 183 free (proxy_host); proxy_host = 0;
179 free (proxy_auth); proxy_auth = 0; 184 free (proxy_auth); proxy_auth = 0;
180#endif 185#endif
181#if ENABLE_DNS 186#if ENABLE_DNS
182 free (dns_forw_host); dns_forw_host = 0; 187 free (dns_forw_host); dns_forw_host = 0;
183#endif 188#endif
189 free (change_root); change_root = 0;
190 free (script_if_up); script_if_up = 0;
191 free (script_node_up); script_node_up = 0;
192 free (script_node_change); script_node_change = 0;
193 free (script_node_down); script_node_down = 0;
184} 194}
185 195
186void 196void
187configuration::clear () 197configuration::clear ()
188{ 198{
192 nodes.clear (); 202 nodes.clear ();
193 203
194 cleanup (); 204 cleanup ();
195 init (); 205 init ();
196} 206}
207
208//static bool
209//is_true (const char *name)
210//{
211 //re
212//}
197 213
198#define parse_bool(target,name,trueval,falseval) do { \ 214#define parse_bool(target,name,trueval,falseval) do { \
199 if (!strcmp (val, "yes")) target = trueval; \ 215 if (!strcmp (val, "yes")) target = trueval; \
200 else if (!strcmp (val, "no")) target = falseval; \ 216 else if (!strcmp (val, "no")) target = falseval; \
201 else if (!strcmp (val, "true")) target = trueval; \ 217 else if (!strcmp (val, "true")) target = trueval; \
202 else if (!strcmp (val, "false")) target = falseval; \ 218 else if (!strcmp (val, "false")) target = falseval; \
203 else if (!strcmp (val, "on")) target = trueval; \ 219 else if (!strcmp (val, "on")) target = trueval; \
204 else if (!strcmp (val, "off")) target = falseval; \ 220 else if (!strcmp (val, "off")) target = falseval; \
205 else \ 221 else \
206 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed. (ignored)"); \ 222 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed, ignored"); \
207} while (0) 223} while (0)
208 224
209const char * 225const char *
210configuration_parser::parse_line (char *line) 226configuration_parser::parse_line (char *line)
211{ 227{
229 return 0; /* comment: ignore */ 245 return 0; /* comment: ignore */
230 246
231 char *val = strtok (NULL, "\t\n\r ="); 247 char *val = strtok (NULL, "\t\n\r =");
232 248
233 if (!val || val[0] == '#') 249 if (!val || val[0] == '#')
234 return _("no value given for variable. (ignored)"); 250 return _("no value given for variable, ignored");
235 251
236 if (!strcmp (var, "on")) 252 else if (!strcmp (var, "on"))
237 { 253 {
238 if (!::thisnode 254 if (::thisnode
239 || (val[0] == '!' && strcmp (val + 1, ::thisnode)) 255 && ((val[0] == '!' && strcmp (val + 1, ::thisnode))
240 || !strcmp (val, ::thisnode)) 256 || !strcmp (val, ::thisnode)))
241 return parse_line (strtok (NULL, "\n\r")); 257 return parse_line (strtok (NULL, "\n\r"));
242 else 258 }
243 return 0; 259
260 else if (!strcmp (var, "include"))
261 {
262 char *fname = conf.config_filename (val);
263 parse_file (fname);
264 free (fname);
244 } 265 }
245 266
246 // truly global 267 // truly global
247 if (!strcmp (var, "loglevel")) 268 else if (!strcmp (var, "loglevel"))
248 { 269 {
249 loglevel l = string_to_loglevel (val); 270 loglevel l = string_to_loglevel (val);
250 271
251 if (l == L_NONE) 272 if (l == L_NONE)
252 return _("unknown loglevel. (skipping)"); 273 return _("unknown loglevel, ignored");
253 } 274 }
254 else if (!strcmp (var, "ip-proto")) 275 else if (!strcmp (var, "ip-proto"))
255 conf.ip_proto = atoi (val); 276 conf.ip_proto = atoi (val);
256 else if (!strcmp (var, "icmp-type")) 277 else if (!strcmp (var, "icmp-type"))
257 { 278 {
258#if ENABLE_ICMP 279#if ENABLE_ICMP
259 conf.icmp_type = atoi (val); 280 conf.icmp_type = atoi (val);
260#endif 281#endif
261 } 282 }
283 else if (!strcmp (var, "chuser"))
284 {
285 struct passwd *pw = getpwnam (val);
286 if (!pw)
287 return _("user specified for chuser not found");
262 288
263 // per config 289 conf.change_uid = pw->pw_uid;
290 conf.change_gid = pw->pw_gid;
291 }
292 else if (!strcmp (var, "chuid"))
293 conf.change_uid = atoi (val);
294 else if (!strcmp (var, "chgid"))
295 conf.change_gid = atoi (val);
296 else if (!strcmp (var, "chroot"))
297 free (conf.change_root), conf.change_root = strdup (val);
298
299 // per node
264 else if (!strcmp (var, "node")) 300 else if (!strcmp (var, "node"))
265 { 301 {
266 parse_argv (); 302 parse_argv ();
267 303
268 conf.default_node.id++; 304 conf.default_node.id++;
316 conf.rekey = atoi (val); 352 conf.rekey = atoi (val);
317 else if (!strcmp (var, "keepalive")) 353 else if (!strcmp (var, "keepalive"))
318 conf.keepalive = atoi (val); 354 conf.keepalive = atoi (val);
319 else if (!strcmp (var, "mtu")) 355 else if (!strcmp (var, "mtu"))
320 conf.mtu = atoi (val); 356 conf.mtu = atoi (val);
357 else if (!strcmp (var, "nfmark"))
358 conf.nfmark = atoi (val);
359 else if (!strcmp (var, "seed-device"))
360 free (conf.seed_dev), conf.seed_dev = strdup (val);
361 else if (!strcmp (var, "seed-interval"))
362 conf.reseed = atoi (val);
321 else if (!strcmp (var, "if-up")) 363 else if (!strcmp (var, "if-up"))
322 free (conf.script_if_up), conf.script_if_up = strdup (val); 364 free (conf.script_if_up), conf.script_if_up = strdup (val);
323 else if (!strcmp (var, "node-up")) 365 else if (!strcmp (var, "node-up"))
324 free (conf.script_node_up), conf.script_node_up = strdup (val); 366 free (conf.script_node_up), conf.script_node_up = strdup (val);
367 else if (!strcmp (var, "node-change"))
368 free (conf.script_node_change), conf.script_node_change = strdup (val);
325 else if (!strcmp (var, "node-down")) 369 else if (!strcmp (var, "node-down"))
326 free (conf.script_node_down), conf.script_node_down = strdup (val); 370 free (conf.script_node_down), conf.script_node_down = strdup (val);
327 else if (!strcmp (var, "pid-file")) 371 else if (!strcmp (var, "pid-file"))
328 free (conf.pidfilename), conf.pidfilename = strdup (val); 372 free (conf.pidfilename), conf.pidfilename = strdup (val);
329 else if (!strcmp (var, "dns-forw-host")) 373 else if (!strcmp (var, "dns-forw-host"))
358 } 402 }
359 else if (!strcmp (var, "dns-max-outstanding")) 403 else if (!strcmp (var, "dns-max-outstanding"))
360 { 404 {
361#if ENABLE_DNS 405#if ENABLE_DNS
362 conf.dns_max_outstanding = atoi (val); 406 conf.dns_max_outstanding = atoi (val);
407#endif
408 }
409 else if (!strcmp (var, "dns-case-preserving"))
410 {
411#if ENABLE_DNS
412 parse_bool (conf.dns_case_preserving, "dns-case-preserving", true, false);
363#endif 413#endif
364 } 414 }
365 else if (!strcmp (var, "http-proxy-host")) 415 else if (!strcmp (var, "http-proxy-host"))
366 { 416 {
367#if ENABLE_HTTP_PROXY 417#if ENABLE_HTTP_PROXY
423 else if (!strcmp (val, "always")) 473 else if (!strcmp (val, "always"))
424 node->connectmode = conf_node::C_ALWAYS; 474 node->connectmode = conf_node::C_ALWAYS;
425 else if (!strcmp (val, "disabled")) 475 else if (!strcmp (val, "disabled"))
426 node->connectmode = conf_node::C_DISABLED; 476 node->connectmode = conf_node::C_DISABLED;
427 else 477 else
428 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled'. (ignored)"); 478 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', ignored");
429 } 479 }
430 else if (!strcmp (var, "inherit-tos")) 480 else if (!strcmp (var, "inherit-tos"))
431 parse_bool (node->inherit_tos, "inherit-tos", true, false); 481 parse_bool (node->inherit_tos, "inherit-tos", true, false);
432 else if (!strcmp (var, "compress")) 482 else if (!strcmp (var, "compress"))
433 parse_bool (node->compress, "compress", true, false); 483 parse_bool (node->compress, "compress", true, false);
460 } 510 }
461 else if (!strcmp (var, "allow-direct")) 511 else if (!strcmp (var, "allow-direct"))
462 node->allow_direct.push_back (strdup (val)); 512 node->allow_direct.push_back (strdup (val));
463 else if (!strcmp (var, "deny-direct")) 513 else if (!strcmp (var, "deny-direct"))
464 node->deny_direct.push_back (strdup (val)); 514 node->deny_direct.push_back (strdup (val));
515 else if (!strcmp (var, "max-ttl"))
516 node->max_ttl = atof (val);
517 else if (!strcmp (var, "max-queue"))
518 node->max_queue = atoi (val);
465 519
466 // unknown or misplaced 520 // unknown or misplaced
467 else 521 else
468 return _("unknown configuration directive. (ignored)"); 522 return _("unknown configuration directive - ignored");
469 523
470 return 0; 524 return 0;
471} 525}
472 526
527void
528conf_node::finalise ()
529{
530 if (max_queue < 1)
531 {
532 slog (L_WARN, _("%s: max-queue value invalid, setting it to 1."), nodename);
533 max_queue = 1;
534 }
535
536 if (routerprio > 1 && (connectmode != C_ALWAYS && connectmode != C_DISABLED))
537 {
538 //slog (L_WARN, _("%s: has non-zero router-priority but either 'never' or 'ondemand' as connectmode, setting it to 'always'."), nodename);
539 connectmode = C_ALWAYS;
540 }
541}
542
543void
473void configuration_parser::parse_argv () 544configuration_parser::parse_argv ()
474{ 545{
475 for (int i = 0; i < argc; ++i) 546 for (int i = 0; i < argc; ++i)
476 { 547 {
477 char *v = argv [i]; 548 char *v = argv [i];
478 549
499 if (warn) 570 if (warn)
500 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v); 571 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v);
501 572
502 *v = 0; 573 *v = 0;
503 } 574 }
575 }
576}
577
578void
579configuration_parser::parse_file (const char *fname)
580{
581 if (FILE *f = fopen (fname, "r"))
582 {
583 char line [2048];
584 int lineno = 0;
585
586 while (fgets (line, sizeof (line), f))
587 {
588 lineno++;
589
590 const char *warn = parse_line (line);
591
592 if (warn)
593 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
594 }
595
596 fclose (f);
597
598 parse_argv ();
599 }
600 else
601 {
602 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
603 exit (EXIT_FAILURE);
504 } 604 }
505} 605}
506 606
507configuration_parser::configuration_parser (configuration &conf, 607configuration_parser::configuration_parser (configuration &conf,
508 bool need_keys, 608 bool need_keys,
509 int argc, 609 int argc,
510 char **argv) 610 char **argv)
511: conf (conf),need_keys (need_keys), argc (argc), argv (argv) 611: conf (conf),need_keys (need_keys), argc (argc), argv (argv)
512{ 612{
513 char *fname; 613 char *fname;
514 FILE *f;
515 614
516 conf.clear (); 615 conf.clear ();
616 node = &conf.default_node;
517 617
518 asprintf (&fname, "%s/gvpe.conf", confbase); 618 asprintf (&fname, "%s/gvpe.conf", confbase);
519 f = fopen (fname, "r"); 619 parse_file (fname);
520
521 if (f)
522 {
523 char line[16384];
524 int lineno = 0;
525 node = &conf.default_node;
526
527 while (fgets (line, sizeof (line), f))
528 {
529 lineno++;
530
531 const char *warn = parse_line (line);
532
533 if (warn)
534 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
535 }
536
537 fclose (f);
538
539 parse_argv ();
540 }
541 else
542 {
543 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
544 exit (EXIT_FAILURE);
545 }
546
547 free (fname); 620 free (fname);
548 621
549 fname = conf.config_filename (conf.prikeyfile, "hostkey"); 622 fname = conf.config_filename (conf.prikeyfile, "hostkey");
550 623
551 f = fopen (fname, "r"); 624 if (FILE *f = fopen (fname, "r"))
552 if (f)
553 { 625 {
554 conf.rsa_key = RSA_new (); 626 conf.rsa_key = RSA_new ();
555 627
556 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL)) 628 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL))
557 { 629 {
564 636
565 fclose (f); 637 fclose (f);
566 } 638 }
567 else 639 else
568 { 640 {
569 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
570
571 if (need_keys) 641 if (need_keys)
642 {
643 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
572 exit (EXIT_FAILURE); 644 exit (EXIT_FAILURE);
645 }
573 } 646 }
647
648 free (fname);
574 649
575 if (need_keys && ::thisnode 650 if (need_keys && ::thisnode
576 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key) 651 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key)
577 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 652 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0
578 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0) 653 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0)
579 { 654 {
580 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 655 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
581 exit (EXIT_FAILURE); 656 exit (EXIT_FAILURE);
582 } 657 }
583 658
584 free (fname); 659 fname = conf.config_filename (conf.pidfilename);
585} 660 free (conf.pidfilename); conf.pidfilename = fname;
586 661
662 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
663 (*i)->finalise ();
664}
665
666char *
587char *configuration::config_filename (const char *name, const char *dflt) 667configuration::config_filename (const char *name, const char *dflt)
588{ 668{
589 char *fname; 669 char *fname;
590 670
591 asprintf (&fname, name ? name : dflt, ::thisnode); 671 asprintf (&fname, name ? name : dflt, ::thisnode ? ::thisnode : "<unset>");
592 672
593 if (!ABSOLUTE_PATH (fname)) 673 if (!ABSOLUTE_PATH (fname))
594 { 674 {
595 char *rname = fname; 675 char *rname = fname;
596 asprintf (&fname, "%s/%s", confbase, rname); 676 asprintf (&fname, "%s/%s", confbase, rname);
597 free (rname); 677 free (rname);
598 } 678 }
599 679
600 return fname; 680 return fname;
681}
682
683void
684conf_node::print ()
685{
686 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %02x %s%s%d\n",
687 id,
688 id >> 8, id & 0xff,
689 compress ? 'Y' : 'N',
690 connectmode == C_ONDEMAND ? "ondemand"
691 : connectmode == C_NEVER ? "never"
692 : connectmode == C_ALWAYS ? "always"
693 : connectmode == C_DISABLED ? "disabled"
694 : "",
695 nodename,
696 protocols,
697 hostname ? hostname : "",
698 hostname ? ":" : "",
699 hostname ? udp_port : 0
700 );
601} 701}
602 702
603void 703void
604configuration::print () 704configuration::print ()
605{ 705{
612 printf (_("interface: %s\n"), ifname); 712 printf (_("interface: %s\n"), ifname);
613 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 713 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
614 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1); 714 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
615 printf ("\n"); 715 printf ("\n");
616 716
617 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 717 printf ("%4s %-17s %s %-8.8s %-10.10s %04s %s\n",
618 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 718 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Prot"), _("Host:Port"));
619 719
620 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i) 720 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i)
621 (*i)->print (); 721 (*i)->print ();
622 722
623 printf ("\n"); 723 printf ("\n");
633configuration::~configuration () 733configuration::~configuration ()
634{ 734{
635 cleanup (); 735 cleanup ();
636} 736}
637 737
638

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines