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.41 by pcg, Tue Apr 26 00:55:55 2005 UTC vs.
Revision 1.59 by root, Tue Dec 4 10:29:43 2012 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";
69 if (protocol & PROT_DNSv4 ) return "dns"; 82 if (protocol & PROT_DNSv4 ) return "dns";
70 83
71 return "<unknown>"; 84 return "<unknown>";
72} 85}
73 86
74void 87static bool
75conf_node::print () 88match_list (const vector<const char *> &list, const char *str)
76{ 89{
77 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n", 90 for (vector<const char *>::const_iterator i = list.end (); i-- > list.begin (); )
78 id, 91 if ((*i)[0] == '*' && !(*i)[1])
79 id >> 8, id & 0xff, 92 return true;
80 compress ? 'Y' : 'N', 93 else if (!strcmp (*i, str))
81 connectmode == C_ONDEMAND ? "ondemand" : 94 return true;
82 connectmode == C_NEVER ? "never" : 95
83 connectmode == C_ALWAYS ? "always" : "", 96 return false;
84 nodename, 97}
85 hostname ? hostname : "", 98
86 hostname ? ":" : "", 99bool
87 hostname ? udp_port : 0 100conf_node::may_direct (struct conf_node *other)
88 ); 101{
102 if (match_list (allow_direct, other->nodename))
103 return true;
104
105 if (match_list (deny_direct, other->nodename))
106 return false;
107
108 return true;
89} 109}
90 110
91conf_node::~conf_node () 111conf_node::~conf_node ()
92{ 112{
93#if 0 113#if 0
104 free (dns_hostname); 124 free (dns_hostname);
105#endif 125#endif
106#endif 126#endif
107} 127}
108 128
129void
109void configuration::init () 130configuration::init ()
110{ 131{
111 memset (this, 0, sizeof (*this)); 132 memset (this, 0, sizeof (*this));
112 133
113 mtu = DEFAULT_MTU; 134 mtu = DEFAULT_MTU;
135 nfmark = 0;
114 rekey = DEFAULT_REKEY; 136 rekey = DEFAULT_REKEY;
115 keepalive = DEFAULT_KEEPALIVE; 137 keepalive = DEFAULT_KEEPALIVE;
116 llevel = L_INFO; 138 llevel = L_INFO;
117 ip_proto = IPPROTO_GRE; 139 ip_proto = IPPROTO_GRE;
118#if ENABLE_ICMP 140#if ENABLE_ICMP
123 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm 145 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
124 default_node.connectmode = conf_node::C_ALWAYS; 146 default_node.connectmode = conf_node::C_ALWAYS;
125 default_node.compress = true; 147 default_node.compress = true;
126 default_node.protocols = 0; 148 default_node.protocols = 0;
127 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;
128 default_node.if_up_data = strdup (""); 152 default_node.if_up_data = strdup ("");
129 153
130#if ENABLE_DNS 154#if ENABLE_DNS
131 default_node.dns_port = 0; // default is 0 == client 155 default_node.dns_port = 0; // default is 0 == client
132 156
157 dns_case_preserving = true;
133 dns_forw_host = strdup ("127.0.0.1"); 158 dns_forw_host = strdup ("127.0.0.1");
134 dns_forw_port = 53; 159 dns_forw_port = 53;
135 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR; 160 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR;
136 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL; 161 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL;
137 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR; 162 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR;
139#endif 164#endif
140 165
141 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid"); 166 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
142} 167}
143 168
169void
144void configuration::cleanup() 170configuration::cleanup ()
145{ 171{
146 if (rsa_key) 172 if (rsa_key)
147 RSA_free (rsa_key); 173 RSA_free (rsa_key);
148 174
149 rsa_key = 0; 175 rsa_key = 0;
150 176
151 free (pidfilename); pidfilename = 0; 177 free (pidfilename); pidfilename = 0;
152 free (ifname); ifname = 0; 178 free (ifname); ifname = 0;
153#if ENABLE_HTTP_PROXY 179#if ENABLE_HTTP_PROXY
154 free (proxy_host); proxy_host = 0; 180 free (proxy_host); proxy_host = 0;
155 free (proxy_auth); proxy_auth = 0; 181 free (proxy_auth); proxy_auth = 0;
156#endif 182#endif
157#if ENABLE_DNS 183#if ENABLE_DNS
158 free (dns_forw_host); dns_forw_host = 0; 184 free (dns_forw_host); dns_forw_host = 0;
159#endif 185#endif
186 free (change_root); change_root = 0;
187 free (script_if_up); script_if_up = 0;
188 free (script_node_up); script_node_up = 0;
189 free (script_node_change); script_node_change = 0;
190 free (script_node_down); script_node_down = 0;
160} 191}
161 192
162void 193void
163configuration::clear () 194configuration::clear ()
164{ 195{
168 nodes.clear (); 199 nodes.clear ();
169 200
170 cleanup (); 201 cleanup ();
171 init (); 202 init ();
172} 203}
204
205//static bool
206//is_true (const char *name)
207//{
208 //re
209//}
173 210
174#define parse_bool(target,name,trueval,falseval) do { \ 211#define parse_bool(target,name,trueval,falseval) do { \
175 if (!strcmp (val, "yes")) target = trueval; \ 212 if (!strcmp (val, "yes")) target = trueval; \
176 else if (!strcmp (val, "no")) target = falseval; \ 213 else if (!strcmp (val, "no")) target = falseval; \
177 else if (!strcmp (val, "true")) target = trueval; \ 214 else if (!strcmp (val, "true")) target = trueval; \
178 else if (!strcmp (val, "false")) target = falseval; \ 215 else if (!strcmp (val, "false")) target = falseval; \
179 else if (!strcmp (val, "on")) target = trueval; \ 216 else if (!strcmp (val, "on")) target = trueval; \
180 else if (!strcmp (val, "off")) target = falseval; \ 217 else if (!strcmp (val, "off")) target = falseval; \
181 else \ 218 else \
182 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed. (ignored)"); \ 219 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed, ignored"); \
183} while (0) 220} while (0)
184 221
185const char * 222const char *
186configuration_parser::parse_line (char *line) 223configuration_parser::parse_line (char *line)
187{ 224{
205 return 0; /* comment: ignore */ 242 return 0; /* comment: ignore */
206 243
207 char *val = strtok (NULL, "\t\n\r ="); 244 char *val = strtok (NULL, "\t\n\r =");
208 245
209 if (!val || val[0] == '#') 246 if (!val || val[0] == '#')
210 return _("no value given for variable. (ignored)"); 247 return _("no value given for variable, ignored");
211 248
212 if (!strcmp (var, "on")) 249 else if (!strcmp (var, "on"))
213 { 250 {
214 if (!::thisnode 251 if (::thisnode
215 || (val[0] == '!' && strcmp (val + 1, ::thisnode)) 252 && ((val[0] == '!' && strcmp (val + 1, ::thisnode))
216 || !strcmp (val, ::thisnode)) 253 || !strcmp (val, ::thisnode)))
217 return parse_line (strtok (NULL, "\n\r")); 254 return parse_line (strtok (NULL, "\n\r"));
218 else 255 }
219 return 0; 256
257 else if (!strcmp (var, "include"))
258 {
259 char *fname = conf.config_filename (val);
260 parse_file (fname);
261 free (fname);
220 } 262 }
221 263
222 // truly global 264 // truly global
223 if (!strcmp (var, "loglevel")) 265 else if (!strcmp (var, "loglevel"))
224 { 266 {
225 loglevel l = string_to_loglevel (val); 267 loglevel l = string_to_loglevel (val);
226 268
227 if (l == L_NONE) 269 if (l == L_NONE)
228 return _("unknown loglevel. (skipping)"); 270 return _("unknown loglevel, ignored");
229 } 271 }
230 else if (!strcmp (var, "ip-proto")) 272 else if (!strcmp (var, "ip-proto"))
231 conf.ip_proto = atoi (val); 273 conf.ip_proto = atoi (val);
232 else if (!strcmp (var, "icmp-type")) 274 else if (!strcmp (var, "icmp-type"))
233 { 275 {
234#if ENABLE_ICMP 276#if ENABLE_ICMP
235 conf.icmp_type = atoi (val); 277 conf.icmp_type = atoi (val);
236#endif 278#endif
237 } 279 }
280 else if (!strcmp (var, "chuser"))
281 {
282 struct passwd *pw = getpwnam (val);
283 if (!pw)
284 return _("user specified for chuser not found");
238 285
239 // per config 286 conf.change_uid = pw->pw_uid;
287 conf.change_gid = pw->pw_gid;
288 }
289 else if (!strcmp (var, "chuid"))
290 conf.change_uid = atoi (val);
291 else if (!strcmp (var, "chgid"))
292 conf.change_gid = atoi (val);
293 else if (!strcmp (var, "chroot"))
294 free (conf.change_root), conf.change_root = strdup (val);
295
296 // per node
240 else if (!strcmp (var, "node")) 297 else if (!strcmp (var, "node"))
241 { 298 {
242 parse_argv (); 299 parse_argv ();
243 300
244 conf.default_node.id++; 301 conf.default_node.id++;
292 conf.rekey = atoi (val); 349 conf.rekey = atoi (val);
293 else if (!strcmp (var, "keepalive")) 350 else if (!strcmp (var, "keepalive"))
294 conf.keepalive = atoi (val); 351 conf.keepalive = atoi (val);
295 else if (!strcmp (var, "mtu")) 352 else if (!strcmp (var, "mtu"))
296 conf.mtu = atoi (val); 353 conf.mtu = atoi (val);
354 else if (!strcmp (var, "nfmark"))
355 conf.nfmark = atoi (val);
297 else if (!strcmp (var, "if-up")) 356 else if (!strcmp (var, "if-up"))
298 free (conf.script_if_up), conf.script_if_up = strdup (val); 357 free (conf.script_if_up), conf.script_if_up = strdup (val);
299 else if (!strcmp (var, "node-up")) 358 else if (!strcmp (var, "node-up"))
300 free (conf.script_node_up), conf.script_node_up = strdup (val); 359 free (conf.script_node_up), conf.script_node_up = strdup (val);
360 else if (!strcmp (var, "node-change"))
361 free (conf.script_node_change), conf.script_node_change = strdup (val);
301 else if (!strcmp (var, "node-down")) 362 else if (!strcmp (var, "node-down"))
302 free (conf.script_node_down), conf.script_node_down = strdup (val); 363 free (conf.script_node_down), conf.script_node_down = strdup (val);
303 else if (!strcmp (var, "pid-file")) 364 else if (!strcmp (var, "pid-file"))
304 free (conf.pidfilename), conf.pidfilename = strdup (val); 365 free (conf.pidfilename), conf.pidfilename = strdup (val);
305 else if (!strcmp (var, "dns-forw-host")) 366 else if (!strcmp (var, "dns-forw-host"))
334 } 395 }
335 else if (!strcmp (var, "dns-max-outstanding")) 396 else if (!strcmp (var, "dns-max-outstanding"))
336 { 397 {
337#if ENABLE_DNS 398#if ENABLE_DNS
338 conf.dns_max_outstanding = atoi (val); 399 conf.dns_max_outstanding = atoi (val);
400#endif
401 }
402 else if (!strcmp (var, "dns-case-preserving"))
403 {
404#if ENABLE_DNS
405 parse_bool (conf.dns_case_preserving, "dns-case-preserving", true, false);
339#endif 406#endif
340 } 407 }
341 else if (!strcmp (var, "http-proxy-host")) 408 else if (!strcmp (var, "http-proxy-host"))
342 { 409 {
343#if ENABLE_HTTP_PROXY 410#if ENABLE_HTTP_PROXY
399 else if (!strcmp (val, "always")) 466 else if (!strcmp (val, "always"))
400 node->connectmode = conf_node::C_ALWAYS; 467 node->connectmode = conf_node::C_ALWAYS;
401 else if (!strcmp (val, "disabled")) 468 else if (!strcmp (val, "disabled"))
402 node->connectmode = conf_node::C_DISABLED; 469 node->connectmode = conf_node::C_DISABLED;
403 else 470 else
404 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled'. (ignored)"); 471 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', ignored");
405 } 472 }
406 else if (!strcmp (var, "inherit-tos")) 473 else if (!strcmp (var, "inherit-tos"))
407 parse_bool (node->inherit_tos, "inherit-tos", true, false); 474 parse_bool (node->inherit_tos, "inherit-tos", true, false);
408 else if (!strcmp (var, "compress")) 475 else if (!strcmp (var, "compress"))
409 parse_bool (node->compress, "compress", true, false); 476 parse_bool (node->compress, "compress", true, false);
432 } 499 }
433 else if (!strcmp (var, "enable-rawip")) 500 else if (!strcmp (var, "enable-rawip"))
434 { 501 {
435 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v; 502 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v;
436 } 503 }
504 else if (!strcmp (var, "allow-direct"))
505 node->allow_direct.push_back (strdup (val));
506 else if (!strcmp (var, "deny-direct"))
507 node->deny_direct.push_back (strdup (val));
508 else if (!strcmp (var, "max-ttl"))
509 node->max_ttl = atof (val);
510 else if (!strcmp (var, "max-queue"))
511 node->max_queue = atoi (val);
437 512
438 // unknown or misplaced 513 // unknown or misplaced
439 else 514 else
440 return _("unknown configuration directive. (ignored)"); 515 return _("unknown configuration directive - ignored");
441 516
442 return 0; 517 return 0;
443} 518}
444 519
520void
521conf_node::finalise ()
522{
523 if (max_queue < 1)
524 {
525 slog (L_WARN, _("%s: max-queue value invalid, setting it to 1."), nodename);
526 max_queue = 1;
527 }
528
529 if (routerprio > 1 && (connectmode != C_ALWAYS && connectmode != C_DISABLED))
530 {
531 //slog (L_WARN, _("%s: has non-zero router-priority but either 'never' or 'ondemand' as connectmode, setting it to 'always'."), nodename);
532 connectmode = C_ALWAYS;
533 }
534}
535
536void
445void configuration_parser::parse_argv () 537configuration_parser::parse_argv ()
446{ 538{
447 for (int i = 0; i < argc; ++i) 539 for (int i = 0; i < argc; ++i)
448 { 540 {
449 char *v = argv [i]; 541 char *v = argv [i];
450 542
471 if (warn) 563 if (warn)
472 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v); 564 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v);
473 565
474 *v = 0; 566 *v = 0;
475 } 567 }
568 }
569}
570
571void
572configuration_parser::parse_file (const char *fname)
573{
574 if (FILE *f = fopen (fname, "r"))
575 {
576 char line [2048];
577 int lineno = 0;
578
579 while (fgets (line, sizeof (line), f))
580 {
581 lineno++;
582
583 const char *warn = parse_line (line);
584
585 if (warn)
586 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
587 }
588
589 fclose (f);
590
591 parse_argv ();
592 }
593 else
594 {
595 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
596 exit (EXIT_FAILURE);
476 } 597 }
477} 598}
478 599
479configuration_parser::configuration_parser (configuration &conf, 600configuration_parser::configuration_parser (configuration &conf,
480 bool need_keys, 601 bool need_keys,
481 int argc, 602 int argc,
482 char **argv) 603 char **argv)
483: conf (conf),need_keys (need_keys), argc (argc), argv (argv) 604: conf (conf),need_keys (need_keys), argc (argc), argv (argv)
484{ 605{
485 char *fname; 606 char *fname;
486 FILE *f;
487 607
488 conf.clear (); 608 conf.clear ();
609 node = &conf.default_node;
489 610
490 asprintf (&fname, "%s/gvpe.conf", confbase); 611 asprintf (&fname, "%s/gvpe.conf", confbase);
491 f = fopen (fname, "r"); 612 parse_file (fname);
492
493 if (f)
494 {
495 char line[16384];
496 int lineno = 0;
497 node = &conf.default_node;
498
499 while (fgets (line, sizeof (line), f))
500 {
501 lineno++;
502
503 const char *warn = parse_line (line);
504
505 if (warn)
506 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
507 }
508
509 fclose (f);
510
511 parse_argv ();
512 }
513 else
514 {
515 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
516 exit (EXIT_FAILURE);
517 }
518
519 free (fname); 613 free (fname);
520 614
521 fname = conf.config_filename (conf.prikeyfile, "hostkey"); 615 fname = conf.config_filename (conf.prikeyfile, "hostkey");
522 616
523 f = fopen (fname, "r"); 617 if (FILE *f = fopen (fname, "r"))
524 if (f)
525 { 618 {
526 conf.rsa_key = RSA_new (); 619 conf.rsa_key = RSA_new ();
527 620
528 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL)) 621 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL))
529 { 622 {
541 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 634 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
542 635
543 if (need_keys) 636 if (need_keys)
544 exit (EXIT_FAILURE); 637 exit (EXIT_FAILURE);
545 } 638 }
639
640 free (fname);
546 641
547 if (need_keys && ::thisnode 642 if (need_keys && ::thisnode
548 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key) 643 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key)
549 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 644 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0
550 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0) 645 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0)
551 { 646 {
552 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 647 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
553 exit (EXIT_FAILURE); 648 exit (EXIT_FAILURE);
554 } 649 }
555 650
556 free (fname); 651 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
652 (*i)->finalise ();
557} 653}
558 654
655char *
559char *configuration::config_filename (const char *name, const char *dflt) 656configuration::config_filename (const char *name, const char *dflt)
560{ 657{
561 char *fname; 658 char *fname;
562 659
563 asprintf (&fname, name ? name : dflt, ::thisnode); 660 asprintf (&fname, name ? name : dflt, ::thisnode);
564 661
568 asprintf (&fname, "%s/%s", confbase, rname); 665 asprintf (&fname, "%s/%s", confbase, rname);
569 free (rname); 666 free (rname);
570 } 667 }
571 668
572 return fname; 669 return fname;
670}
671
672void
673conf_node::print ()
674{
675 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %02x %s%s%d\n",
676 id,
677 id >> 8, id & 0xff,
678 compress ? 'Y' : 'N',
679 connectmode == C_ONDEMAND ? "ondemand"
680 : connectmode == C_NEVER ? "never"
681 : connectmode == C_ALWAYS ? "always"
682 : connectmode == C_DISABLED ? "disabled"
683 : "",
684 nodename,
685 protocols,
686 hostname ? hostname : "",
687 hostname ? ":" : "",
688 hostname ? udp_port : 0
689 );
573} 690}
574 691
575void 692void
576configuration::print () 693configuration::print ()
577{ 694{
584 printf (_("interface: %s\n"), ifname); 701 printf (_("interface: %s\n"), ifname);
585 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 702 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
586 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1); 703 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
587 printf ("\n"); 704 printf ("\n");
588 705
589 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 706 printf ("%4s %-17s %s %-8.8s %-10.10s %04s %s\n",
590 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 707 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Prot"), _("Host:Port"));
591 708
592 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i) 709 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i)
593 (*i)->print (); 710 (*i)->print ();
594 711
595 printf ("\n"); 712 printf ("\n");
605configuration::~configuration () 722configuration::~configuration ()
606{ 723{
607 cleanup (); 724 cleanup ();
608} 725}
609 726
610

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines