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.53 by root, Tue Feb 8 23:13:48 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 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{
54 if (protset & PROT_IPv4 ) return PROT_IPv4; 65 if (protset & PROT_IPv4 ) return PROT_IPv4;
55 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 66 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
56 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 67 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
57 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 68 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 if (protset & PROT_DNSv4 ) return PROT_DNSv4; 69 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
59 70
60 return 0; 71 return 0;
61} 72}
62 73
74const char *
63const char *strprotocol (u8 protocol) 75strprotocol (u8 protocol)
64{ 76{
65 if (protocol & PROT_IPv4 ) return "rawip"; 77 if (protocol & PROT_IPv4 ) return "rawip";
66 if (protocol & PROT_ICMPv4) return "icmp"; 78 if (protocol & PROT_ICMPv4) return "icmp";
67 if (protocol & PROT_UDPv4 ) return "udp"; 79 if (protocol & PROT_UDPv4 ) return "udp";
68 if (protocol & PROT_TCPv4 ) return "tcp"; 80 if (protocol & PROT_TCPv4 ) return "tcp";
69 if (protocol & PROT_DNSv4 ) return "dns"; 81 if (protocol & PROT_DNSv4 ) return "dns";
70 82
71 return "<unknown>"; 83 return "<unknown>";
72} 84}
73 85
86static bool
87match_list (const vector<const char *> &list, const char *str)
88{
89 for (vector<const char *>::const_iterator i = list.end (); i-- > list.begin (); )
90 if ((*i)[0] == '*' && !(*i)[1])
91 return true;
92 else if (!strcmp (*i, str))
93 return true;
94
95 return false;
96}
97
98bool
99conf_node::may_direct (struct conf_node *other)
100{
101 if (match_list (allow_direct, other->nodename))
102 return true;
103
104 if (match_list (deny_direct, other->nodename))
105 return false;
106
107 return true;
108}
109
74void 110void
75conf_node::print () 111conf_node::print ()
76{ 112{
77 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n", 113 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n",
78 id, 114 id,
79 id >> 8, id & 0xff, 115 id >> 8, id & 0xff,
80 compress ? 'Y' : 'N', 116 compress ? 'Y' : 'N',
81 connectmode == C_ONDEMAND ? "ondemand" : 117 connectmode == C_ONDEMAND ? "ondemand"
82 connectmode == C_NEVER ? "never" : 118 : connectmode == C_NEVER ? "never"
83 connectmode == C_ALWAYS ? "always" : "", 119 : connectmode == C_ALWAYS ? "always"
120 : connectmode == C_DISABLED ? "disabled"
121 : "",
84 nodename, 122 nodename,
85 hostname ? hostname : "", 123 hostname ? hostname : "",
86 hostname ? ":" : "", 124 hostname ? ":" : "",
87 hostname ? udp_port : 0 125 hostname ? udp_port : 0
88 ); 126 );
104 free (dns_hostname); 142 free (dns_hostname);
105#endif 143#endif
106#endif 144#endif
107} 145}
108 146
147void
109void configuration::init () 148configuration::init ()
110{ 149{
111 memset (this, 0, sizeof (*this)); 150 memset (this, 0, sizeof (*this));
112 151
113 mtu = DEFAULT_MTU; 152 mtu = DEFAULT_MTU;
153 nfmark = 0;
114 rekey = DEFAULT_REKEY; 154 rekey = DEFAULT_REKEY;
115 keepalive = DEFAULT_KEEPALIVE; 155 keepalive = DEFAULT_KEEPALIVE;
116 llevel = L_INFO; 156 llevel = L_INFO;
117 ip_proto = IPPROTO_GRE; 157 ip_proto = IPPROTO_GRE;
118#if ENABLE_ICMP 158#if ENABLE_ICMP
123 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm 163 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
124 default_node.connectmode = conf_node::C_ALWAYS; 164 default_node.connectmode = conf_node::C_ALWAYS;
125 default_node.compress = true; 165 default_node.compress = true;
126 default_node.protocols = 0; 166 default_node.protocols = 0;
127 default_node.max_retry = DEFAULT_MAX_RETRY; 167 default_node.max_retry = DEFAULT_MAX_RETRY;
168 default_node.max_ttl = DEFAULT_MAX_TTL;
169 default_node.max_queue = DEFAULT_MAX_QUEUE;
128 default_node.if_up_data = strdup (""); 170 default_node.if_up_data = strdup ("");
129 171
130#if ENABLE_DNS 172#if ENABLE_DNS
131 default_node.dns_port = 0; // default is 0 == client 173 default_node.dns_port = 0; // default is 0 == client
132 174
139#endif 181#endif
140 182
141 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid"); 183 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
142} 184}
143 185
186void
144void configuration::cleanup() 187configuration::cleanup ()
145{ 188{
146 if (rsa_key) 189 if (rsa_key)
147 RSA_free (rsa_key); 190 RSA_free (rsa_key);
148 191
149 rsa_key = 0; 192 rsa_key = 0;
150 193
151 free (pidfilename); pidfilename = 0; 194 free (pidfilename); pidfilename = 0;
152 free (ifname); ifname = 0; 195 free (ifname); ifname = 0;
153#if ENABLE_HTTP_PROXY 196#if ENABLE_HTTP_PROXY
154 free (proxy_host); proxy_host = 0; 197 free (proxy_host); proxy_host = 0;
155 free (proxy_auth); proxy_auth = 0; 198 free (proxy_auth); proxy_auth = 0;
156#endif 199#endif
157#if ENABLE_DNS 200#if ENABLE_DNS
158 free (dns_forw_host); dns_forw_host = 0; 201 free (dns_forw_host); dns_forw_host = 0;
159#endif 202#endif
203 free (script_if_up); script_if_up = 0;
204 free (script_node_up); script_node_up = 0;
205 free (script_node_change); script_node_change = 0;
206 free (script_node_down); script_node_down = 0;
160} 207}
161 208
162void 209void
163configuration::clear () 210configuration::clear ()
164{ 211{
292 conf.rekey = atoi (val); 339 conf.rekey = atoi (val);
293 else if (!strcmp (var, "keepalive")) 340 else if (!strcmp (var, "keepalive"))
294 conf.keepalive = atoi (val); 341 conf.keepalive = atoi (val);
295 else if (!strcmp (var, "mtu")) 342 else if (!strcmp (var, "mtu"))
296 conf.mtu = atoi (val); 343 conf.mtu = atoi (val);
344 else if (!strcmp (var, "nfmark"))
345 conf.nfmark = atoi (val);
297 else if (!strcmp (var, "if-up")) 346 else if (!strcmp (var, "if-up"))
298 free (conf.script_if_up), conf.script_if_up = strdup (val); 347 free (conf.script_if_up), conf.script_if_up = strdup (val);
299 else if (!strcmp (var, "node-up")) 348 else if (!strcmp (var, "node-up"))
300 free (conf.script_node_up), conf.script_node_up = strdup (val); 349 free (conf.script_node_up), conf.script_node_up = strdup (val);
350 else if (!strcmp (var, "node-change"))
351 free (conf.script_node_change), conf.script_node_change = strdup (val);
301 else if (!strcmp (var, "node-down")) 352 else if (!strcmp (var, "node-down"))
302 free (conf.script_node_down), conf.script_node_down = strdup (val); 353 free (conf.script_node_down), conf.script_node_down = strdup (val);
303 else if (!strcmp (var, "pid-file")) 354 else if (!strcmp (var, "pid-file"))
304 free (conf.pidfilename), conf.pidfilename = strdup (val); 355 free (conf.pidfilename), conf.pidfilename = strdup (val);
305 else if (!strcmp (var, "dns-forw-host")) 356 else if (!strcmp (var, "dns-forw-host"))
432 } 483 }
433 else if (!strcmp (var, "enable-rawip")) 484 else if (!strcmp (var, "enable-rawip"))
434 { 485 {
435 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v; 486 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v;
436 } 487 }
488 else if (!strcmp (var, "allow-direct"))
489 node->allow_direct.push_back (strdup (val));
490 else if (!strcmp (var, "deny-direct"))
491 node->deny_direct.push_back (strdup (val));
492 else if (!strcmp (var, "max-ttl"))
493 node->max_ttl = atof (val);
494 else if (!strcmp (var, "max-queue"))
495 node->max_queue = atoi (val);
437 496
438 // unknown or misplaced 497 // unknown or misplaced
439 else 498 else
440 return _("unknown configuration directive. (ignored)"); 499 return _("unknown configuration directive. (ignored)");
441 500
442 return 0; 501 return 0;
443} 502}
444 503
504void
505conf_node::finalise ()
506{
507 if (max_queue < 1)
508 {
509 slog (L_WARN, _("%s: max-queue value invalid, setting it to 1."), nodename);
510 max_queue = 1;
511 }
512
513 if (routerprio > 1 && (connectmode != C_ALWAYS && connectmode != C_DISABLED))
514 {
515 //slog (L_WARN, _("%s: has non-zero router-priority but either 'never' or 'ondemand' as connectmode, setting it to 'always'."), nodename);
516 connectmode = C_ALWAYS;
517 }
518}
519
520void
445void configuration_parser::parse_argv () 521configuration_parser::parse_argv ()
446{ 522{
447 for (int i = 0; i < argc; ++i) 523 for (int i = 0; i < argc; ++i)
448 { 524 {
449 char *v = argv [i]; 525 char *v = argv [i];
450 526
552 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 628 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
553 exit (EXIT_FAILURE); 629 exit (EXIT_FAILURE);
554 } 630 }
555 631
556 free (fname); 632 free (fname);
557}
558 633
634 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
635 (*i)->finalise ();
636}
637
638char *
559char *configuration::config_filename (const char *name, const char *dflt) 639configuration::config_filename (const char *name, const char *dflt)
560{ 640{
561 char *fname; 641 char *fname;
562 642
563 asprintf (&fname, name ? name : dflt, ::thisnode); 643 asprintf (&fname, name ? name : dflt, ::thisnode);
564 644
605configuration::~configuration () 685configuration::~configuration ()
606{ 686{
607 cleanup (); 687 cleanup ();
608} 688}
609 689
610

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines