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.57 by root, Sat Dec 17 22:05:34 2011 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>
47char *thisnode; 57char *thisnode;
48char *identname; 58char *identname;
49 59
50struct configuration conf; 60struct configuration conf;
51 61
62u8
52u8 best_protocol (u8 protset) 63best_protocol (u8 protset)
53{ 64{
65#if 1//D2
66 if (protset & PROT_IPv42 ) return PROT_IPv42;
67#endif
54 if (protset & PROT_IPv4 ) return PROT_IPv4; 68 if (protset & PROT_IPv4 ) return PROT_IPv4;
55 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 69 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
56 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 70 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
57 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 71 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 if (protset & PROT_DNSv4 ) return PROT_DNSv4; 72 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
59 73
60 return 0; 74 return 0;
61} 75}
62 76
77const char *
63const char *strprotocol (u8 protocol) 78strprotocol (u8 protocol)
64{ 79{
80#if 1//D2
81 if (protocol & PROT_IPv42 ) return "rawip2";
82#endif
65 if (protocol & PROT_IPv4 ) return "rawip"; 83 if (protocol & PROT_IPv4 ) return "rawip";
66 if (protocol & PROT_ICMPv4) return "icmp"; 84 if (protocol & PROT_ICMPv4) return "icmp";
67 if (protocol & PROT_UDPv4 ) return "udp"; 85 if (protocol & PROT_UDPv4 ) return "udp";
68 if (protocol & PROT_TCPv4 ) return "tcp"; 86 if (protocol & PROT_TCPv4 ) return "tcp";
69 if (protocol & PROT_DNSv4 ) return "dns"; 87 if (protocol & PROT_DNSv4 ) return "dns";
82 100
83 return false; 101 return false;
84} 102}
85 103
86bool 104bool
87conf_node::can_direct (struct conf_node *other) 105conf_node::may_direct (struct conf_node *other)
88{ 106{
89 if (match_list (allow_direct, other->nodename)) 107 if (match_list (allow_direct, other->nodename))
90 return true; 108 return true;
91 109
92 if (match_list (deny_direct, other->nodename)) 110 if (match_list (deny_direct, other->nodename))
93 return false; 111 return false;
94 112
95 return true; 113 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} 114}
114 115
115conf_node::~conf_node () 116conf_node::~conf_node ()
116{ 117{
117#if 0 118#if 0
128 free (dns_hostname); 129 free (dns_hostname);
129#endif 130#endif
130#endif 131#endif
131} 132}
132 133
134void
133void configuration::init () 135configuration::init ()
134{ 136{
135 memset (this, 0, sizeof (*this)); 137 memset (this, 0, sizeof (*this));
136 138
137 mtu = DEFAULT_MTU; 139 mtu = DEFAULT_MTU;
140 nfmark = 0;
138 rekey = DEFAULT_REKEY; 141 rekey = DEFAULT_REKEY;
139 keepalive = DEFAULT_KEEPALIVE; 142 keepalive = DEFAULT_KEEPALIVE;
140 llevel = L_INFO; 143 llevel = L_INFO;
141 ip_proto = IPPROTO_GRE; 144 ip_proto = IPPROTO_GRE;
145#if 1 //D2
146 ip2_proto = 7;
147#endif
142#if ENABLE_ICMP 148#if ENABLE_ICMP
143 icmp_type = ICMP_ECHOREPLY; 149 icmp_type = ICMP_ECHOREPLY;
144#endif 150#endif
145 151
146 default_node.udp_port = DEFAULT_UDPPORT; 152 default_node.udp_port = DEFAULT_UDPPORT;
147 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm 153 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
148 default_node.connectmode = conf_node::C_ALWAYS; 154 default_node.connectmode = conf_node::C_ALWAYS;
149 default_node.compress = true; 155 default_node.compress = true;
150 default_node.protocols = 0; 156 default_node.protocols = 0;
151 default_node.max_retry = DEFAULT_MAX_RETRY; 157 default_node.max_retry = DEFAULT_MAX_RETRY;
158 default_node.max_ttl = DEFAULT_MAX_TTL;
159 default_node.max_queue = DEFAULT_MAX_QUEUE;
152 default_node.if_up_data = strdup (""); 160 default_node.if_up_data = strdup ("");
153 161
154#if ENABLE_DNS 162#if ENABLE_DNS
155 default_node.dns_port = 0; // default is 0 == client 163 default_node.dns_port = 0; // default is 0 == client
156 164
165 dns_case_preserving = true;
157 dns_forw_host = strdup ("127.0.0.1"); 166 dns_forw_host = strdup ("127.0.0.1");
158 dns_forw_port = 53; 167 dns_forw_port = 53;
159 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR; 168 dns_timeout_factor = DEFAULT_DNS_TIMEOUT_FACTOR;
160 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL; 169 dns_send_interval = DEFAULT_DNS_SEND_INTERVAL;
161 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR; 170 dns_overlap_factor = DEFAULT_DNS_OVERLAP_FACTOR;
163#endif 172#endif
164 173
165 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid"); 174 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
166} 175}
167 176
177void
168void configuration::cleanup() 178configuration::cleanup ()
169{ 179{
170 if (rsa_key) 180 if (rsa_key)
171 RSA_free (rsa_key); 181 RSA_free (rsa_key);
172 182
173 rsa_key = 0; 183 rsa_key = 0;
174 184
175 free (pidfilename); pidfilename = 0; 185 free (pidfilename); pidfilename = 0;
176 free (ifname); ifname = 0; 186 free (ifname); ifname = 0;
177#if ENABLE_HTTP_PROXY 187#if ENABLE_HTTP_PROXY
178 free (proxy_host); proxy_host = 0; 188 free (proxy_host); proxy_host = 0;
179 free (proxy_auth); proxy_auth = 0; 189 free (proxy_auth); proxy_auth = 0;
180#endif 190#endif
181#if ENABLE_DNS 191#if ENABLE_DNS
182 free (dns_forw_host); dns_forw_host = 0; 192 free (dns_forw_host); dns_forw_host = 0;
183#endif 193#endif
194 free (script_if_up); script_if_up = 0;
195 free (script_node_up); script_node_up = 0;
196 free (script_node_change); script_node_change = 0;
197 free (script_node_down); script_node_down = 0;
184} 198}
185 199
186void 200void
187configuration::clear () 201configuration::clear ()
188{ 202{
192 nodes.clear (); 206 nodes.clear ();
193 207
194 cleanup (); 208 cleanup ();
195 init (); 209 init ();
196} 210}
211
212//static bool
213//is_true (const char *name)
214//{
215 //re
216//}
197 217
198#define parse_bool(target,name,trueval,falseval) do { \ 218#define parse_bool(target,name,trueval,falseval) do { \
199 if (!strcmp (val, "yes")) target = trueval; \ 219 if (!strcmp (val, "yes")) target = trueval; \
200 else if (!strcmp (val, "no")) target = falseval; \ 220 else if (!strcmp (val, "no")) target = falseval; \
201 else if (!strcmp (val, "true")) target = trueval; \ 221 else if (!strcmp (val, "true")) target = trueval; \
202 else if (!strcmp (val, "false")) target = falseval; \ 222 else if (!strcmp (val, "false")) target = falseval; \
203 else if (!strcmp (val, "on")) target = trueval; \ 223 else if (!strcmp (val, "on")) target = trueval; \
204 else if (!strcmp (val, "off")) target = falseval; \ 224 else if (!strcmp (val, "off")) target = falseval; \
205 else \ 225 else \
206 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed. (ignored)"); \ 226 return _("illegal boolean value, only 'yes|true|on' or 'no|false|off' allowed, ignored"); \
207} while (0) 227} while (0)
208 228
209const char * 229const char *
210configuration_parser::parse_line (char *line) 230configuration_parser::parse_line (char *line)
211{ 231{
229 return 0; /* comment: ignore */ 249 return 0; /* comment: ignore */
230 250
231 char *val = strtok (NULL, "\t\n\r ="); 251 char *val = strtok (NULL, "\t\n\r =");
232 252
233 if (!val || val[0] == '#') 253 if (!val || val[0] == '#')
234 return _("no value given for variable. (ignored)"); 254 return _("no value given for variable, ignored");
235 255
236 if (!strcmp (var, "on")) 256 else if (!strcmp (var, "on"))
237 { 257 {
238 if (!::thisnode 258 if (::thisnode
239 || (val[0] == '!' && strcmp (val + 1, ::thisnode)) 259 && ((val[0] == '!' && strcmp (val + 1, ::thisnode))
240 || !strcmp (val, ::thisnode)) 260 || !strcmp (val, ::thisnode)))
241 return parse_line (strtok (NULL, "\n\r")); 261 return parse_line (strtok (NULL, "\n\r"));
242 else 262 }
243 return 0; 263
264 else if (!strcmp (var, "include"))
265 {
266 char *fname = conf.config_filename (val);
267 parse_file (fname);
268 free (fname);
244 } 269 }
245 270
246 // truly global 271 // truly global
247 if (!strcmp (var, "loglevel")) 272 else if (!strcmp (var, "loglevel"))
248 { 273 {
249 loglevel l = string_to_loglevel (val); 274 loglevel l = string_to_loglevel (val);
250 275
251 if (l == L_NONE) 276 if (l == L_NONE)
252 return _("unknown loglevel. (skipping)"); 277 return _("unknown loglevel, ignored");
253 } 278 }
254 else if (!strcmp (var, "ip-proto")) 279 else if (!strcmp (var, "ip-proto"))
255 conf.ip_proto = atoi (val); 280 conf.ip_proto = atoi (val);
281#if 1 //D2
282 else if (!strcmp (var, "ip2-proto"))
283 conf.ip2_proto = atoi (val);
284#endif
256 else if (!strcmp (var, "icmp-type")) 285 else if (!strcmp (var, "icmp-type"))
257 { 286 {
258#if ENABLE_ICMP 287#if ENABLE_ICMP
259 conf.icmp_type = atoi (val); 288 conf.icmp_type = atoi (val);
260#endif 289#endif
316 conf.rekey = atoi (val); 345 conf.rekey = atoi (val);
317 else if (!strcmp (var, "keepalive")) 346 else if (!strcmp (var, "keepalive"))
318 conf.keepalive = atoi (val); 347 conf.keepalive = atoi (val);
319 else if (!strcmp (var, "mtu")) 348 else if (!strcmp (var, "mtu"))
320 conf.mtu = atoi (val); 349 conf.mtu = atoi (val);
350 else if (!strcmp (var, "nfmark"))
351 conf.nfmark = atoi (val);
321 else if (!strcmp (var, "if-up")) 352 else if (!strcmp (var, "if-up"))
322 free (conf.script_if_up), conf.script_if_up = strdup (val); 353 free (conf.script_if_up), conf.script_if_up = strdup (val);
323 else if (!strcmp (var, "node-up")) 354 else if (!strcmp (var, "node-up"))
324 free (conf.script_node_up), conf.script_node_up = strdup (val); 355 free (conf.script_node_up), conf.script_node_up = strdup (val);
356 else if (!strcmp (var, "node-change"))
357 free (conf.script_node_change), conf.script_node_change = strdup (val);
325 else if (!strcmp (var, "node-down")) 358 else if (!strcmp (var, "node-down"))
326 free (conf.script_node_down), conf.script_node_down = strdup (val); 359 free (conf.script_node_down), conf.script_node_down = strdup (val);
327 else if (!strcmp (var, "pid-file")) 360 else if (!strcmp (var, "pid-file"))
328 free (conf.pidfilename), conf.pidfilename = strdup (val); 361 free (conf.pidfilename), conf.pidfilename = strdup (val);
329 else if (!strcmp (var, "dns-forw-host")) 362 else if (!strcmp (var, "dns-forw-host"))
358 } 391 }
359 else if (!strcmp (var, "dns-max-outstanding")) 392 else if (!strcmp (var, "dns-max-outstanding"))
360 { 393 {
361#if ENABLE_DNS 394#if ENABLE_DNS
362 conf.dns_max_outstanding = atoi (val); 395 conf.dns_max_outstanding = atoi (val);
396#endif
397 }
398 else if (!strcmp (var, "dns-case-preserving"))
399 {
400#if ENABLE_DNS
401 parse_bool (conf.dns_case_preserving, "dns-case-preserving", true, false);
363#endif 402#endif
364 } 403 }
365 else if (!strcmp (var, "http-proxy-host")) 404 else if (!strcmp (var, "http-proxy-host"))
366 { 405 {
367#if ENABLE_HTTP_PROXY 406#if ENABLE_HTTP_PROXY
423 else if (!strcmp (val, "always")) 462 else if (!strcmp (val, "always"))
424 node->connectmode = conf_node::C_ALWAYS; 463 node->connectmode = conf_node::C_ALWAYS;
425 else if (!strcmp (val, "disabled")) 464 else if (!strcmp (val, "disabled"))
426 node->connectmode = conf_node::C_DISABLED; 465 node->connectmode = conf_node::C_DISABLED;
427 else 466 else
428 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled'. (ignored)"); 467 return _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', ignored");
429 } 468 }
430 else if (!strcmp (var, "inherit-tos")) 469 else if (!strcmp (var, "inherit-tos"))
431 parse_bool (node->inherit_tos, "inherit-tos", true, false); 470 parse_bool (node->inherit_tos, "inherit-tos", true, false);
432 else if (!strcmp (var, "compress")) 471 else if (!strcmp (var, "compress"))
433 parse_bool (node->compress, "compress", true, false); 472 parse_bool (node->compress, "compress", true, false);
456 } 495 }
457 else if (!strcmp (var, "enable-rawip")) 496 else if (!strcmp (var, "enable-rawip"))
458 { 497 {
459 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v; 498 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v;
460 } 499 }
500#if 1//D2
501 else if (!strcmp (var, "enable-rawip2"))
502 {
503 u8 v; parse_bool (v, "enable-rawip2", PROT_IPv42, 0); node->protocols = (node->protocols & ~PROT_IPv42 ) | v;
504 }
505#endif
461 else if (!strcmp (var, "allow-direct")) 506 else if (!strcmp (var, "allow-direct"))
462 node->allow_direct.push_back (strdup (val)); 507 node->allow_direct.push_back (strdup (val));
463 else if (!strcmp (var, "deny-direct")) 508 else if (!strcmp (var, "deny-direct"))
464 node->deny_direct.push_back (strdup (val)); 509 node->deny_direct.push_back (strdup (val));
510 else if (!strcmp (var, "max-ttl"))
511 node->max_ttl = atof (val);
512 else if (!strcmp (var, "max-queue"))
513 node->max_queue = atoi (val);
465 514
466 // unknown or misplaced 515 // unknown or misplaced
467 else 516 else
468 return _("unknown configuration directive. (ignored)"); 517 return _("unknown configuration directive - ignored");
469 518
470 return 0; 519 return 0;
471} 520}
472 521
522void
523conf_node::finalise ()
524{
525 if (max_queue < 1)
526 {
527 slog (L_WARN, _("%s: max-queue value invalid, setting it to 1."), nodename);
528 max_queue = 1;
529 }
530
531 if (routerprio > 1 && (connectmode != C_ALWAYS && connectmode != C_DISABLED))
532 {
533 //slog (L_WARN, _("%s: has non-zero router-priority but either 'never' or 'ondemand' as connectmode, setting it to 'always'."), nodename);
534 connectmode = C_ALWAYS;
535 }
536}
537
538void
473void configuration_parser::parse_argv () 539configuration_parser::parse_argv ()
474{ 540{
475 for (int i = 0; i < argc; ++i) 541 for (int i = 0; i < argc; ++i)
476 { 542 {
477 char *v = argv [i]; 543 char *v = argv [i];
478 544
499 if (warn) 565 if (warn)
500 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v); 566 slog (L_WARN, _("%s, while parsing command line option '%s'."), warn, v);
501 567
502 *v = 0; 568 *v = 0;
503 } 569 }
570 }
571}
572
573void
574configuration_parser::parse_file (const char *fname)
575{
576 if (FILE *f = fopen (fname, "r"))
577 {
578 char line [2048];
579 int lineno = 0;
580
581 while (fgets (line, sizeof (line), f))
582 {
583 lineno++;
584
585 const char *warn = parse_line (line);
586
587 if (warn)
588 slog (L_WARN, _("%s, at '%s', line %d."), warn, fname, lineno);
589 }
590
591 fclose (f);
592
593 parse_argv ();
594 }
595 else
596 {
597 slog (L_ERR, _("unable to read config file '%s': %s"), fname, strerror (errno));
598 exit (EXIT_FAILURE);
504 } 599 }
505} 600}
506 601
507configuration_parser::configuration_parser (configuration &conf, 602configuration_parser::configuration_parser (configuration &conf,
508 bool need_keys, 603 bool need_keys,
509 int argc, 604 int argc,
510 char **argv) 605 char **argv)
511: conf (conf),need_keys (need_keys), argc (argc), argv (argv) 606: conf (conf),need_keys (need_keys), argc (argc), argv (argv)
512{ 607{
513 char *fname; 608 char *fname;
514 FILE *f;
515 609
516 conf.clear (); 610 conf.clear ();
611 node = &conf.default_node;
517 612
518 asprintf (&fname, "%s/gvpe.conf", confbase); 613 asprintf (&fname, "%s/gvpe.conf", confbase);
519 f = fopen (fname, "r"); 614 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); 615 free (fname);
548 616
549 fname = conf.config_filename (conf.prikeyfile, "hostkey"); 617 fname = conf.config_filename (conf.prikeyfile, "hostkey");
550 618
551 f = fopen (fname, "r"); 619 if (FILE *f = fopen (fname, "r"))
552 if (f)
553 { 620 {
554 conf.rsa_key = RSA_new (); 621 conf.rsa_key = RSA_new ();
555 622
556 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL)) 623 if (!PEM_read_RSAPrivateKey (f, &conf.rsa_key, NULL, NULL))
557 { 624 {
569 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno)); 636 slog (need_keys ? L_ERR : L_NOTICE, _("unable to open private rsa key file '%s': %s"), fname, strerror (errno));
570 637
571 if (need_keys) 638 if (need_keys)
572 exit (EXIT_FAILURE); 639 exit (EXIT_FAILURE);
573 } 640 }
641
642 free (fname);
574 643
575 if (need_keys && ::thisnode 644 if (need_keys && ::thisnode
576 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key) 645 && conf.rsa_key && conf.thisnode && conf.thisnode->rsa_key)
577 if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 646 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) 647 || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0)
579 { 648 {
580 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 649 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
581 exit (EXIT_FAILURE); 650 exit (EXIT_FAILURE);
582 } 651 }
583 652
584 free (fname); 653 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
654 (*i)->finalise ();
585} 655}
586 656
657char *
587char *configuration::config_filename (const char *name, const char *dflt) 658configuration::config_filename (const char *name, const char *dflt)
588{ 659{
589 char *fname; 660 char *fname;
590 661
591 asprintf (&fname, name ? name : dflt, ::thisnode); 662 asprintf (&fname, name ? name : dflt, ::thisnode);
592 663
596 asprintf (&fname, "%s/%s", confbase, rname); 667 asprintf (&fname, "%s/%s", confbase, rname);
597 free (rname); 668 free (rname);
598 } 669 }
599 670
600 return fname; 671 return fname;
672}
673
674void
675conf_node::print ()
676{
677 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %02x %s%s%d\n",
678 id,
679 id >> 8, id & 0xff,
680 compress ? 'Y' : 'N',
681 connectmode == C_ONDEMAND ? "ondemand"
682 : connectmode == C_NEVER ? "never"
683 : connectmode == C_ALWAYS ? "always"
684 : connectmode == C_DISABLED ? "disabled"
685 : "",
686 nodename,
687 protocols,
688 hostname ? hostname : "",
689 hostname ? ":" : "",
690 hostname ? udp_port : 0
691 );
601} 692}
602 693
603void 694void
604configuration::print () 695configuration::print ()
605{ 696{
612 printf (_("interface: %s\n"), ifname); 703 printf (_("interface: %s\n"), ifname);
613 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 704 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
614 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1); 705 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
615 printf ("\n"); 706 printf ("\n");
616 707
617 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 708 printf ("%4s %-17s %s %-8.8s %-10.10s %04s %s\n",
618 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 709 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Prot"), _("Host:Port"));
619 710
620 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i) 711 for (node_vector::iterator i = nodes.begin (); i != nodes.end (); ++i)
621 (*i)->print (); 712 (*i)->print ();
622 713
623 printf ("\n"); 714 printf ("\n");
633configuration::~configuration () 724configuration::~configuration ()
634{ 725{
635 cleanup (); 726 cleanup ();
636} 727}
637 728
638

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines