2 conf.c -- configuration storage & retrieval code
3 Copyright (C) 1998 Robert van der Meulen
4 1998-2002 Ivo Timmermans <ivo@o2w.nl>
5 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
6 2000 Cris van Pelt <tribbel@arise.dhs.org>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 $Id: conf.c,v 1.1 2002/04/28 12:46:25 zarq Exp $
34 #include <sys/types.h>
39 #include <utils.h> /* for cp */
43 #include "netutl.h" /* for str2address */
48 avl_tree_t *config_tree;
50 int pingtimeout = 0; /* seconds before timeout */
51 char *confbase = NULL; /* directory in which all config files are */
52 char *netname = NULL; /* name of the vpn network */
54 int config_compare(config_t *a, config_t *b)
58 result = strcasecmp(a->variable, b->variable);
63 result = a->line - b->line;
68 return strcmp(a->file, b->file);
71 void init_configuration(avl_tree_t **config_tree)
74 *config_tree = avl_alloc_tree((avl_compare_t)config_compare, (avl_action_t)free_config);
78 void exit_configuration(avl_tree_t **config_tree)
81 avl_delete_tree(*config_tree);
86 config_t *new_config(void)
90 cfg = (config_t *)xmalloc_and_zero(sizeof(*cfg));
95 void free_config(config_t *cfg)
108 void config_add(avl_tree_t *config_tree, config_t *cfg)
111 avl_insert(config_tree, cfg);
115 config_t *lookup_config(avl_tree_t *config_tree, char *variable)
117 config_t cfg, *found;
119 cfg.variable = variable;
123 found = avl_search_closest_greater(config_tree, &cfg);
128 if(strcasecmp(found->variable, variable))
134 config_t *lookup_config_next(avl_tree_t *config_tree, config_t *cfg)
139 node = avl_search_node(config_tree, cfg);
145 found = (config_t *)node->next->data;
146 if(!strcasecmp(found->variable, cfg->variable))
154 int get_config_bool(config_t *cfg, int *result)
160 if(!strcasecmp(cfg->value, "yes"))
165 else if(!strcasecmp(cfg->value, "no"))
171 syslog(LOG_ERR, _("\"yes\" or \"no\" expected for configuration variable %s in %s line %d"),
172 cfg->variable, cfg->file, cfg->line);
177 int get_config_int(config_t *cfg, int *result)
183 if(sscanf(cfg->value, "%d", result) == 1)
186 syslog(LOG_ERR, _("Integer expected for configuration variable %s in %s line %d"),
187 cfg->variable, cfg->file, cfg->line);
191 int get_config_string(config_t *cfg, char **result)
197 *result = xstrdup(cfg->value);
201 int get_config_address(config_t *cfg, struct addrinfo **result)
208 ai = str2addrinfo(cfg->value, NULL, 0);
216 syslog(LOG_ERR, _("Hostname or IP address expected for configuration variable %s in %s line %d"),
217 cfg->variable, cfg->file, cfg->line);
221 int get_config_port(config_t *cfg, port_t *result)
227 if(sscanf(cfg->value, "%hu", result) == 1)
229 *result = htons(*result);
233 syslog(LOG_ERR, _("Port number expected for configuration variable %s in %s line %d"),
234 cfg->variable, cfg->file, cfg->line);
238 int get_config_subnet(config_t *cfg, subnet_t **result)
245 subnet = str2net(cfg->value);
249 syslog(LOG_ERR, _("Subnet expected for configuration variable %s in %s line %d"),
250 cfg->variable, cfg->file, cfg->line);
254 /* Teach newbies what subnets are... */
256 if(((subnet->type == SUBNET_IPV4) && maskcheck((char *)&subnet->net.ipv4.address, subnet->net.ipv4.prefixlength, sizeof(ipv4_t)))
257 || ((subnet->type == SUBNET_IPV6) && maskcheck((char *)&subnet->net.ipv6.address, subnet->net.ipv6.prefixlength, sizeof(ipv6_t))))
259 syslog(LOG_ERR, _("Network address and prefix length do not match for configuration variable %s in %s line %d"),
260 cfg->variable, cfg->file, cfg->line);