Split setup_myself() into two functions, one for reloading configuration.
This commit is contained in:
parent
4591e96c76
commit
c678e7c4fb
2 changed files with 110 additions and 96 deletions
|
@ -150,6 +150,7 @@ extern void send_packet(struct node_t *, vpn_packet_t *);
|
||||||
extern void receive_tcppacket(struct connection_t *, const char *, int);
|
extern void receive_tcppacket(struct connection_t *, const char *, int);
|
||||||
extern void broadcast_packet(const struct node_t *, vpn_packet_t *);
|
extern void broadcast_packet(const struct node_t *, vpn_packet_t *);
|
||||||
extern char *get_name(void);
|
extern char *get_name(void);
|
||||||
|
extern bool setup_myself_reloadable(void);
|
||||||
extern bool setup_network(void);
|
extern bool setup_network(void);
|
||||||
extern void setup_outgoing_connection(struct outgoing_t *);
|
extern void setup_outgoing_connection(struct outgoing_t *);
|
||||||
extern void try_outgoing_connections(void);
|
extern void try_outgoing_connections(void);
|
||||||
|
|
203
src/net_setup.c
203
src/net_setup.c
|
@ -384,67 +384,12 @@ char *get_name(void) {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
bool setup_myself_reloadable(void) {
|
||||||
Configure node_t myself and set up the local sockets (listen only)
|
|
||||||
*/
|
|
||||||
static bool setup_myself(void) {
|
|
||||||
config_t *cfg;
|
|
||||||
subnet_t *subnet;
|
|
||||||
char *name, *hostname, *mode, *afname, *cipher, *digest, *type;
|
|
||||||
char *fname = NULL;
|
|
||||||
char *address = NULL;
|
|
||||||
char *proxy = NULL;
|
char *proxy = NULL;
|
||||||
|
char *mode = NULL;
|
||||||
|
char *afname = NULL;
|
||||||
char *space;
|
char *space;
|
||||||
char *envp[5];
|
|
||||||
struct addrinfo *ai, *aip, hint = {0};
|
|
||||||
bool choice;
|
bool choice;
|
||||||
int i, err;
|
|
||||||
int replaywin_int;
|
|
||||||
|
|
||||||
myself = new_node();
|
|
||||||
myself->connection = new_connection();
|
|
||||||
|
|
||||||
myself->hostname = xstrdup("MYSELF");
|
|
||||||
myself->connection->hostname = xstrdup("MYSELF");
|
|
||||||
|
|
||||||
myself->connection->options = 0;
|
|
||||||
myself->connection->protocol_major = PROT_MAJOR;
|
|
||||||
myself->connection->protocol_minor = PROT_MINOR;
|
|
||||||
|
|
||||||
myself->options |= PROT_MINOR << 24;
|
|
||||||
|
|
||||||
if(!(name = get_name())) {
|
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
myself->name = name;
|
|
||||||
myself->connection->name = xstrdup(name);
|
|
||||||
xasprintf(&fname, "%s/hosts/%s", confbase, name);
|
|
||||||
read_config_options(config_tree, name);
|
|
||||||
read_config_file(config_tree, fname);
|
|
||||||
free(fname);
|
|
||||||
|
|
||||||
get_config_bool(lookup_config(config_tree, "ExperimentalProtocol"), &experimental);
|
|
||||||
|
|
||||||
if(experimental && !read_ecdsa_private_key())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(!read_rsa_private_key())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(!get_config_string(lookup_config(config_tree, "Port"), &myport))
|
|
||||||
myport = xstrdup("655");
|
|
||||||
|
|
||||||
if(!atoi(myport)) {
|
|
||||||
struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM);
|
|
||||||
sockaddr_t sa;
|
|
||||||
if(!ai || !ai->ai_addr)
|
|
||||||
return false;
|
|
||||||
free(myport);
|
|
||||||
memcpy(&sa, ai->ai_addr, ai->ai_addrlen);
|
|
||||||
sockaddr2str(&sa, NULL, &myport);
|
|
||||||
}
|
|
||||||
|
|
||||||
get_config_string(lookup_config(config_tree, "Proxy"), &proxy);
|
get_config_string(lookup_config(config_tree, "Proxy"), &proxy);
|
||||||
if(proxy) {
|
if(proxy) {
|
||||||
|
@ -508,21 +453,6 @@ static bool setup_myself(void) {
|
||||||
free(proxy);
|
free(proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read in all the subnets specified in the host configuration file */
|
|
||||||
|
|
||||||
cfg = lookup_config(config_tree, "Subnet");
|
|
||||||
|
|
||||||
while(cfg) {
|
|
||||||
if(!get_config_subnet(cfg, &subnet))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
subnet_add(myself, subnet);
|
|
||||||
|
|
||||||
cfg = lookup_config_next(config_tree, cfg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check some options */
|
|
||||||
|
|
||||||
if(get_config_bool(lookup_config(config_tree, "IndirectData"), &choice) && choice)
|
if(get_config_bool(lookup_config(config_tree, "IndirectData"), &choice) && choice)
|
||||||
myself->options |= OPTION_INDIRECT;
|
myself->options |= OPTION_INDIRECT;
|
||||||
|
|
||||||
|
@ -533,10 +463,7 @@ static bool setup_myself(void) {
|
||||||
myself->options |= OPTION_INDIRECT;
|
myself->options |= OPTION_INDIRECT;
|
||||||
|
|
||||||
get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
|
get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
|
||||||
get_config_bool(lookup_config(config_tree, "StrictSubnets"), &strictsubnets);
|
|
||||||
get_config_bool(lookup_config(config_tree, "TunnelServer"), &tunnelserver);
|
|
||||||
get_config_bool(lookup_config(config_tree, "LocalDiscovery"), &localdiscovery);
|
get_config_bool(lookup_config(config_tree, "LocalDiscovery"), &localdiscovery);
|
||||||
strictsubnets |= tunnelserver;
|
|
||||||
|
|
||||||
if(get_config_string(lookup_config(config_tree, "Mode"), &mode)) {
|
if(get_config_string(lookup_config(config_tree, "Mode"), &mode)) {
|
||||||
if(!strcasecmp(mode, "router"))
|
if(!strcasecmp(mode, "router"))
|
||||||
|
@ -608,6 +535,111 @@ static bool setup_myself(void) {
|
||||||
} else
|
} else
|
||||||
maxtimeout = 900;
|
maxtimeout = 900;
|
||||||
|
|
||||||
|
if(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) {
|
||||||
|
if(!strcasecmp(afname, "IPv4"))
|
||||||
|
addressfamily = AF_INET;
|
||||||
|
else if(!strcasecmp(afname, "IPv6"))
|
||||||
|
addressfamily = AF_INET6;
|
||||||
|
else if(!strcasecmp(afname, "any"))
|
||||||
|
addressfamily = AF_UNSPEC;
|
||||||
|
else {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Invalid address family!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
free(afname);
|
||||||
|
}
|
||||||
|
|
||||||
|
get_config_bool(lookup_config(config_tree, "Hostnames"), &hostnames);
|
||||||
|
|
||||||
|
if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime))
|
||||||
|
keylifetime = 3600;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Configure node_t myself and set up the local sockets (listen only)
|
||||||
|
*/
|
||||||
|
static bool setup_myself(void) {
|
||||||
|
config_t *cfg;
|
||||||
|
subnet_t *subnet;
|
||||||
|
char *name, *hostname, *cipher, *digest, *type;
|
||||||
|
char *fname = NULL;
|
||||||
|
char *address = NULL;
|
||||||
|
char *envp[5];
|
||||||
|
struct addrinfo *ai, *aip, hint = {0};
|
||||||
|
int i, err;
|
||||||
|
int replaywin_int;
|
||||||
|
|
||||||
|
myself = new_node();
|
||||||
|
myself->connection = new_connection();
|
||||||
|
|
||||||
|
myself->hostname = xstrdup("MYSELF");
|
||||||
|
myself->connection->hostname = xstrdup("MYSELF");
|
||||||
|
|
||||||
|
myself->connection->options = 0;
|
||||||
|
myself->connection->protocol_major = PROT_MAJOR;
|
||||||
|
myself->connection->protocol_minor = PROT_MINOR;
|
||||||
|
|
||||||
|
myself->options |= PROT_MINOR << 24;
|
||||||
|
|
||||||
|
if(!(name = get_name())) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
myself->name = name;
|
||||||
|
myself->connection->name = xstrdup(name);
|
||||||
|
xasprintf(&fname, "%s/hosts/%s", confbase, name);
|
||||||
|
read_config_options(config_tree, name);
|
||||||
|
read_config_file(config_tree, fname);
|
||||||
|
free(fname);
|
||||||
|
|
||||||
|
get_config_bool(lookup_config(config_tree, "ExperimentalProtocol"), &experimental);
|
||||||
|
|
||||||
|
if(experimental && !read_ecdsa_private_key())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!read_rsa_private_key())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!get_config_string(lookup_config(config_tree, "Port"), &myport))
|
||||||
|
myport = xstrdup("655");
|
||||||
|
|
||||||
|
if(!atoi(myport)) {
|
||||||
|
struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM);
|
||||||
|
sockaddr_t sa;
|
||||||
|
if(!ai || !ai->ai_addr)
|
||||||
|
return false;
|
||||||
|
free(myport);
|
||||||
|
memcpy(&sa, ai->ai_addr, ai->ai_addrlen);
|
||||||
|
sockaddr2str(&sa, NULL, &myport);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read in all the subnets specified in the host configuration file */
|
||||||
|
|
||||||
|
cfg = lookup_config(config_tree, "Subnet");
|
||||||
|
|
||||||
|
while(cfg) {
|
||||||
|
if(!get_config_subnet(cfg, &subnet))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
subnet_add(myself, subnet);
|
||||||
|
|
||||||
|
cfg = lookup_config_next(config_tree, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check some options */
|
||||||
|
|
||||||
|
if(!setup_myself_reloadable())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
get_config_bool(lookup_config(config_tree, "StrictSubnets"), &strictsubnets);
|
||||||
|
get_config_bool(lookup_config(config_tree, "TunnelServer"), &tunnelserver);
|
||||||
|
strictsubnets |= tunnelserver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
|
if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
|
||||||
if(udp_rcvbuf <= 0) {
|
if(udp_rcvbuf <= 0) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "UDPRcvBuf cannot be negative!");
|
logger(DEBUG_ALWAYS, LOG_ERR, "UDPRcvBuf cannot be negative!");
|
||||||
|
@ -630,22 +662,6 @@ static bool setup_myself(void) {
|
||||||
replaywin = (unsigned)replaywin_int;
|
replaywin = (unsigned)replaywin_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) {
|
|
||||||
if(!strcasecmp(afname, "IPv4"))
|
|
||||||
addressfamily = AF_INET;
|
|
||||||
else if(!strcasecmp(afname, "IPv6"))
|
|
||||||
addressfamily = AF_INET6;
|
|
||||||
else if(!strcasecmp(afname, "any"))
|
|
||||||
addressfamily = AF_UNSPEC;
|
|
||||||
else {
|
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Invalid address family!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
free(afname);
|
|
||||||
}
|
|
||||||
|
|
||||||
get_config_bool(lookup_config(config_tree, "Hostnames"), &hostnames);
|
|
||||||
|
|
||||||
/* Generate packet encryption key */
|
/* Generate packet encryption key */
|
||||||
|
|
||||||
if(!get_config_string(lookup_config(config_tree, "Cipher"), &cipher))
|
if(!get_config_string(lookup_config(config_tree, "Cipher"), &cipher))
|
||||||
|
@ -656,9 +672,6 @@ static bool setup_myself(void) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime))
|
|
||||||
keylifetime = 3600;
|
|
||||||
|
|
||||||
regenerate_key();
|
regenerate_key();
|
||||||
|
|
||||||
/* Check if we want to use message authentication codes... */
|
/* Check if we want to use message authentication codes... */
|
||||||
|
|
Loading…
Reference in a new issue