diff options
Diffstat (limited to 'daemon/daemon.c')
| -rw-r--r-- | daemon/daemon.c | 26 | 
1 files changed, 25 insertions, 1 deletions
| diff --git a/daemon/daemon.c b/daemon/daemon.c index 5d4279259ed6..f480c94e61f6 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -77,6 +77,7 @@  #include "util/storage/lookup3.h"  #include "util/storage/slabhash.h"  #include "util/tcp_conn_limit.h" +#include "util/edns.h"  #include "services/listen_dnsport.h"  #include "services/cache/rrset.h"  #include "services/cache/infra.h" @@ -290,6 +291,15 @@ daemon_init(void)  		free(daemon);  		return NULL;  	} +	if(!(daemon->env->edns_tags = edns_tags_create())) { +		auth_zones_delete(daemon->env->auth_zones); +		acl_list_delete(daemon->acl); +		tcl_list_delete(daemon->tcl); +		edns_known_options_delete(daemon->env); +		free(daemon->env); +		free(daemon); +		return NULL; +	}  	return daemon;	  } @@ -298,6 +308,8 @@ daemon_open_shared_ports(struct daemon* daemon)  {  	log_assert(daemon);  	if(daemon->cfg->port != daemon->listening_port) { +		char** resif = NULL; +		int num_resif = 0;  		size_t i;  		struct listen_port* p0;  		daemon->reuseport = 0; @@ -308,15 +320,18 @@ daemon_open_shared_ports(struct daemon* daemon)  			free(daemon->ports);  			daemon->ports = NULL;  		} +		if(!resolve_interface_names(daemon->cfg, &resif, &num_resif)) +			return 0;  		/* see if we want to reuseport */  #ifdef SO_REUSEPORT  		if(daemon->cfg->so_reuseport && daemon->cfg->num_threads > 0)  			daemon->reuseport = 1;  #endif  		/* try to use reuseport */ -		p0 = listening_ports_open(daemon->cfg, &daemon->reuseport); +		p0 = listening_ports_open(daemon->cfg, resif, num_resif, &daemon->reuseport);  		if(!p0) {  			listening_ports_free(p0); +			config_del_strarray(resif, num_resif);  			return 0;  		}  		if(daemon->reuseport) { @@ -330,6 +345,7 @@ daemon_open_shared_ports(struct daemon* daemon)  		if(!(daemon->ports = (struct listen_port**)calloc(  			daemon->num_ports, sizeof(*daemon->ports)))) {  			listening_ports_free(p0); +			config_del_strarray(resif, num_resif);  			return 0;  		}  		daemon->ports[0] = p0; @@ -338,16 +354,19 @@ daemon_open_shared_ports(struct daemon* daemon)  			for(i=1; i<daemon->num_ports; i++) {  				if(!(daemon->ports[i]=  					listening_ports_open(daemon->cfg, +						resif, num_resif,  						&daemon->reuseport))  					|| !daemon->reuseport ) {  					for(i=0; i<daemon->num_ports; i++)  						listening_ports_free(daemon->ports[i]);  					free(daemon->ports);  					daemon->ports = NULL; +					config_del_strarray(resif, num_resif);  					return 0;  				}  			}  		} +		config_del_strarray(resif, num_resif);  		daemon->listening_port = daemon->cfg->port;  	}  	if(!daemon->cfg->remote_control_enable && daemon->rc_port) { @@ -619,6 +638,10 @@ daemon_fork(struct daemon* daemon)  		&daemon->use_rpz))  		fatal_exit("auth_zones could not be setup"); +	/* Set-up EDNS tags */ +	if(!edns_tags_apply_cfg(daemon->env->edns_tags, daemon->cfg)) +		fatal_exit("Could not set up EDNS tags"); +  	/* setup modules */  	daemon_setup_modules(daemon); @@ -750,6 +773,7 @@ daemon_delete(struct daemon* daemon)  		rrset_cache_delete(daemon->env->rrset_cache);  		infra_delete(daemon->env->infra_cache);  		edns_known_options_delete(daemon->env); +		edns_tags_delete(daemon->env->edns_tags);  		auth_zones_delete(daemon->env->auth_zones);  	}  	ub_randfree(daemon->rand); | 
