#include "splay_tree.h"
#include "connection.h"
#include "conf.h"
+#include "list.h"
#include "logger.h"
#include "netutl.h" /* for str2address */
#include "protocol.h"
return true;
}
- logger(LOG_ERR, "\"yes\" or \"no\" expected for configuration variable %s in %s line %d",
+ logger(DEBUG_ALWAYS, LOG_ERR, "\"yes\" or \"no\" expected for configuration variable %s in %s line %d",
cfg->variable, cfg->file, cfg->line);
return false;
if(sscanf(cfg->value, "%d", result) == 1)
return true;
- logger(LOG_ERR, "Integer expected for configuration variable %s in %s line %d",
+ logger(DEBUG_ALWAYS, LOG_ERR, "Integer expected for configuration variable %s in %s line %d",
cfg->variable, cfg->file, cfg->line);
return false;
return true;
}
- logger(LOG_ERR, "Hostname or IP address expected for configuration variable %s in %s line %d",
+ logger(DEBUG_ALWAYS, LOG_ERR, "Hostname or IP address expected for configuration variable %s in %s line %d",
cfg->variable, cfg->file, cfg->line);
return false;
}
bool get_config_subnet(const config_t *cfg, subnet_t ** result) {
- subnet_t subnet = {0};
+ subnet_t subnet = {NULL};
if(!cfg)
return false;
if(!str2net(&subnet, cfg->value)) {
- logger(LOG_ERR, "Subnet expected for configuration variable %s in %s line %d",
+ logger(DEBUG_ALWAYS, LOG_ERR, "Subnet expected for configuration variable %s in %s line %d",
cfg->variable, cfg->file, cfg->line);
return false;
}
&& !maskcheck(&subnet.net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof subnet.net.ipv4.address))
|| ((subnet.type == SUBNET_IPV6)
&& !maskcheck(&subnet.net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof subnet.net.ipv6.address))) {
- logger(LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d",
+ logger(DEBUG_ALWAYS, LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d",
cfg->variable, cfg->file, cfg->line);
return false;
}
if(!*value) {
const char err[] = "No value for variable";
if (fname)
- logger(LOG_ERR, "%s `%s' on line %d while reading config file %s",
+ logger(DEBUG_ALWAYS, LOG_ERR, "%s `%s' on line %d while reading config file %s",
err, variable, lineno, fname);
else
- logger(LOG_ERR, "%s `%s' in command line option %d",
+ logger(DEBUG_ALWAYS, LOG_ERR, "%s `%s' in command line option %d",
err, variable, lineno);
return NULL;
}
fp = fopen(fname, "r");
if(!fp) {
- logger(LOG_ERR, "Cannot open config file %s: %s", fname, strerror(errno));
+ logger(DEBUG_ALWAYS, LOG_ERR, "Cannot open config file %s: %s", fname, strerror(errno));
return false;
}
}
}
-bool read_server_config() {
+bool read_server_config(void) {
char *fname;
bool x;
x = read_config_file(config_tree, fname);
if(!x) { /* System error: complain */
- logger(LOG_ERR, "Failed to read `%s': %s", fname, strerror(errno));
+ logger(DEBUG_ALWAYS, LOG_ERR, "Failed to read `%s': %s", fname, strerror(errno));
}
free(fname);
return x;
}
+bool append_config_file(const char *name, const char *key, const char *value) {
+ char *fname;
+ xasprintf(&fname, "%s/hosts/%s", confbase, name);
+
+ FILE *fp = fopen(fname, "a");
+
+ if(!fp) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Cannot open config file %s: %s", fname, strerror(errno));
+ } else {
+ fprintf(fp, "\n# The following line was automatically added by tinc\n%s = %s\n", key, value);
+ fclose(fp);
+ }
+
+ free(fname);
+
+ return fp;
+}
+
bool disable_old_keys(FILE *f) {
char buf[100];
long pos;