char *proxyuser;
char *proxypass;
proxytype_t proxytype;
+int autoconnect;
char *scriptinterpreter;
char *scriptextension;
result = rsa_read_pem_public_key(&c->rsa, fp);
fclose(fp);
- if(!result)
+ if(!result)
logger(DEBUG_ALWAYS, LOG_ERR, "Reading RSA public key file `%s' failed: %s", fname, strerror(errno));
free(fname);
return result;
result = ecdsa_read_pem_private_key(&myself->connection->ecdsa, fp);
fclose(fp);
- if(!result)
+ if(!result)
logger(DEBUG_ALWAYS, LOG_ERR, "Reading ECDSA private key file `%s' failed: %s", fname, strerror(errno));
free(fname);
return result;
result = rsa_read_pem_private_key(&myself->connection->rsa, fp);
fclose(fp);
- if(!result)
+ if(!result)
logger(DEBUG_ALWAYS, LOG_ERR, "Reading RSA private key file `%s' failed: %s", fname, strerror(errno));
free(fname);
return result;
timeout_set(&keyexpire_event, keyexpire_handler, NULL);
}
- event_add(&keyexpire_event, &(struct timeval){keylifetime, 0});
+ event_add(&keyexpire_event, &(struct timeval){keylifetime, rand() % 100000});
}
/*
closedir(dir);
}
+void load_all_nodes(void) {
+ DIR *dir;
+ struct dirent *ent;
+ char *dname;
+
+ xasprintf(&dname, "%s" SLASH "hosts", confbase);
+ dir = opendir(dname);
+ if(!dir) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Could not open %s: %s", dname, strerror(errno));
+ free(dname);
+ return;
+ }
+
+ while((ent = readdir(dir))) {
+ if(!check_id(ent->d_name))
+ continue;
+
+ node_t *n = lookup_node(ent->d_name);
+ if(n)
+ continue;
+
+ n = new_node();
+ n->name = xstrdup(ent->d_name);
+ node_add(n);
+ }
+
+ closedir(dir);
+}
+
+
char *get_name(void) {
char *name = NULL;
char *envname = getenv(name + 1);
if(!envname) {
if(strcmp(name + 1, "HOST")) {
- fprintf(stderr, "Invalid Name: environment variable %s does not exist\n", name + 1);
+ logger(DEBUG_ALWAYS, LOG_ERR, "Invalid Name: environment variable %s does not exist\n", name + 1);
return false;
}
- envname = alloca(32);
+ char envname[32];
if(gethostname(envname, 32)) {
- fprintf(stderr, "Could not get hostname: %s\n", strerror(errno));
+ logger(DEBUG_ALWAYS, LOG_ERR, "Could not get hostname: %s\n", strerror(errno));
return false;
}
envname[31] = 0;
scriptinterpreter = NULL;
get_config_string(lookup_config(config_tree, "ScriptsInterpreter"), &scriptinterpreter);
-
+
free(scriptextension);
if(!get_config_string(lookup_config(config_tree, "ScriptsExtension"), &scriptextension))
#ifdef HAVE_MINGW
get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
get_config_bool(lookup_config(config_tree, "LocalDiscovery"), &localdiscovery);
-
+
if(get_config_string(lookup_config(config_tree, "Mode"), &rmode)) {
if(!strcasecmp(rmode, "router"))
routing_mode = RMODE_ROUTER;
if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime))
keylifetime = 3600;
+ get_config_int(lookup_config(config_tree, "AutoConnect"), &autoconnect);
+
return true;
}
return false;
}
replaywin = (unsigned)replaywin_int;
+ sptps_replaywin = replaywin;
}
/* Generate packet encryption key */
return false;
}
+ free(cipher);
+
regenerate_key();
/* Check if we want to use message authentication codes... */
return false;
}
+ free(digest);
+
/* Compression */
if(get_config_int(lookup_config(config_tree, "Compression"), &myself->incompression)) {
if(strictsubnets)
load_all_subnets();
+ else if(autoconnect)
+ load_all_nodes();
/* Open device */
listen_socket[i].tcp = i + 3;
#ifdef FD_CLOEXEC
- fcntl(i + 3, F_SETFD, FD_CLOEXEC);
+ fcntl(i + 3, F_SETFD, FD_CLOEXEC);
#endif
listen_socket[i].udp = setup_vpn_in_socket(&sa);