Browse Source

smartdns: refactor config code.

Nick Peng 1 year ago
parent
commit
a9437ec8f0
7 changed files with 346 additions and 376 deletions
  1. 19 19
      src/dns_client.c
  2. 138 174
      src/dns_conf.c
  3. 80 75
      src/dns_conf.h
  4. 51 51
      src/dns_server.c
  5. 4 4
      src/lib/nftset.c
  6. 52 51
      src/smartdns.c
  7. 2 2
      src/util.c

+ 19 - 19
src/dns_client.c

@@ -972,12 +972,12 @@ static int _dns_client_set_trusted_cert(SSL_CTX *ssl_ctx)
 		return -1;
 		return -1;
 	}
 	}
 
 
-	if (dns_conf_ca_file[0]) {
-		cafile = dns_conf_ca_file;
+	if (dns_conf.ca_file[0]) {
+		cafile = dns_conf.ca_file;
 	}
 	}
 
 
-	if (dns_conf_ca_path[0]) {
-		capath = dns_conf_ca_path;
+	if (dns_conf.ca_path[0]) {
+		capath = dns_conf.ca_path;
 	}
 	}
 
 
 	if (cafile == NULL && capath == NULL) {
 	if (cafile == NULL && capath == NULL) {
@@ -1853,8 +1853,8 @@ static int _dns_client_recv(struct dns_server_info *server_info, unsigned char *
 		char host_name[DNS_MAX_CNAME_LEN];
 		char host_name[DNS_MAX_CNAME_LEN];
 		tlog(TLOG_INFO, "decode failed, packet len = %d, tc = %d, id = %d, from = %s\n", inpacket_len, packet->head.tc,
 		tlog(TLOG_INFO, "decode failed, packet len = %d, tc = %d, id = %d, from = %s\n", inpacket_len, packet->head.tc,
 			 packet->head.id, get_host_by_addr(host_name, sizeof(host_name), from));
 			 packet->head.id, get_host_by_addr(host_name, sizeof(host_name), from));
-		if (dns_save_fail_packet) {
-			dns_packet_save(dns_save_fail_packet_dir, "client", host_name, inpacket, inpacket_len);
+		if (dns_conf.dns_save_fail_packet) {
+			dns_packet_save(dns_conf.dns_save_fail_packet_dir, "client", host_name, inpacket, inpacket_len);
 		}
 		}
 		return -1;
 		return -1;
 	}
 	}
@@ -1986,9 +1986,9 @@ static int _dns_client_create_socket_udp_proxy(struct dns_server_info *server_in
 
 
 	set_fd_nonblock(fd, 1);
 	set_fd_nonblock(fd, 1);
 	set_sock_keepalive(fd, 30, 3, 5);
 	set_sock_keepalive(fd, 30, 3, 5);
-	if (dns_socket_buff_size > 0) {
-		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
-		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	if (dns_conf.dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
 	}
 	}
 
 
 	ret = proxy_conn_connect(proxy);
 	ret = proxy_conn_connect(proxy);
@@ -2091,9 +2091,9 @@ static int _dns_client_create_socket_udp(struct dns_server_info *server_info)
 		setsockopt(server_info->fd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof(on));
 		setsockopt(server_info->fd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof(on));
 	}
 	}
 
 
-	if (dns_socket_buff_size > 0) {
-		setsockopt(server_info->fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
-		setsockopt(server_info->fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	if (dns_conf.dns_socket_buff_size > 0) {
+		setsockopt(server_info->fd, SOL_SOCKET, SO_SNDBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
+		setsockopt(server_info->fd, SOL_SOCKET, SO_RCVBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
 	}
 	}
 
 
 	return 0;
 	return 0;
@@ -2233,9 +2233,9 @@ static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info)
 	setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes));
 	setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes));
 	setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes));
 	setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes));
 	set_sock_keepalive(fd, 30, 3, 5);
 	set_sock_keepalive(fd, 30, 3, 5);
-	if (dns_socket_buff_size > 0) {
-		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
-		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	if (dns_conf.dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
 	}
 	}
 
 
 	if (proxy) {
 	if (proxy) {
@@ -2357,9 +2357,9 @@ static int _DNS_client_create_socket_tls(struct dns_server_info *server_info, ch
 	set_sock_keepalive(fd, 30, 3, 5);
 	set_sock_keepalive(fd, 30, 3, 5);
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
-	if (dns_socket_buff_size > 0) {
-		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
-		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	if (dns_conf.dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
 	}
 	}
 
 
 	if (proxy) {
 	if (proxy) {
@@ -4762,7 +4762,7 @@ static int _dns_client_add_mdns_server(void)
 	struct ifaddrs *ifaddr = NULL;
 	struct ifaddrs *ifaddr = NULL;
 	struct ifaddrs *ifa = NULL;
 	struct ifaddrs *ifa = NULL;
 
 
-	if (dns_conf_mdns_lookup != 1) {
+	if (dns_conf.mdns_lookup != 1) {
 		return 0;
 		return 0;
 	}
 	}
 
 

+ 138 - 174
src/dns_conf.c

@@ -44,15 +44,12 @@ struct dns_nftset_table {
 	DECLARE_HASHTABLE(nftset, 8);
 	DECLARE_HASHTABLE(nftset, 8);
 };
 };
 static struct dns_nftset_table dns_nftset_table;
 static struct dns_nftset_table dns_nftset_table;
-
 struct dns_domain_set_name_table dns_domain_set_name_table;
 struct dns_domain_set_name_table dns_domain_set_name_table;
-
 struct dns_ip_set_name_table dns_ip_set_name_table;
 struct dns_ip_set_name_table dns_ip_set_name_table;
 
 
 /* dns groups */
 /* dns groups */
 struct dns_group_table dns_group_table;
 struct dns_group_table dns_group_table;
 struct dns_proxy_table dns_proxy_table;
 struct dns_proxy_table dns_proxy_table;
-
 struct dns_ptr_table dns_ptr_table;
 struct dns_ptr_table dns_ptr_table;
 
 
 static char dns_conf_dnsmasq_lease_file[DNS_MAX_PATH];
 static char dns_conf_dnsmasq_lease_file[DNS_MAX_PATH];
@@ -64,17 +61,6 @@ int dns_hosts_record_num;
 /* SRV-HOST */
 /* SRV-HOST */
 struct dns_srv_record_table dns_conf_srv_record_table;
 struct dns_srv_record_table dns_conf_srv_record_table;
 
 
-/* server ip/port  */
-struct dns_bind_ip dns_conf_bind_ip[DNS_MAX_BIND_IP];
-int dns_conf_bind_ip_num = 0;
-int dns_conf_tcp_idle_time = 120;
-char dns_conf_bind_ca_file[DNS_MAX_PATH];
-char dns_conf_bind_ca_key_file[DNS_MAX_PATH];
-char dns_conf_bind_ca_key_pass[DNS_MAX_PATH];
-char dns_conf_need_cert = 0;
-
-int dns_conf_max_query_limit = DNS_MAX_QUERY_LIMIT;
-
 static struct config_enum_list dns_conf_response_mode_enum[] = {
 static struct config_enum_list dns_conf_response_mode_enum[] = {
 	{"first-ping", DNS_RESPONSE_MODE_FIRST_PING_IP},
 	{"first-ping", DNS_RESPONSE_MODE_FIRST_PING_IP},
 	{"fastest-ip", DNS_RESPONSE_MODE_FASTEST_IP},
 	{"fastest-ip", DNS_RESPONSE_MODE_FASTEST_IP},
@@ -104,39 +90,10 @@ struct dns_domain_check_orders dns_conf_default_check_orders = {
 			{.type = DOMAIN_CHECK_TCP, .tcp_port = 443},
 			{.type = DOMAIN_CHECK_TCP, .tcp_port = 443},
 		},
 		},
 };
 };
+
 static int dns_has_cap_ping = 0;
 static int dns_has_cap_ping = 0;
 int dns_ping_cap_force_enable = 0;
 int dns_ping_cap_force_enable = 0;
 
 
-/* logging */
-int dns_conf_log_level = TLOG_ERROR;
-char dns_conf_log_file[DNS_MAX_PATH];
-size_t dns_conf_log_size = 1024 * 1024;
-int dns_conf_log_num = 8;
-int dns_conf_log_file_mode;
-int dns_conf_log_console;
-int dns_conf_log_syslog;
-
-/* CA file */
-char dns_conf_ca_file[DNS_MAX_PATH];
-char dns_conf_ca_path[DNS_MAX_PATH];
-
-char dns_conf_cache_file[DNS_MAX_PATH];
-char dns_conf_data_dir[DNS_MAX_PATH];
-int dns_conf_cache_persist = 2;
-int dns_conf_cache_checkpoint_time = DNS_DEFAULT_CHECKPOINT_TIME;
-
-/* auditing */
-int dns_conf_audit_enable = 0;
-int dns_conf_audit_log_SOA;
-int dns_conf_audit_syslog;
-char dns_conf_audit_file[DNS_MAX_PATH];
-size_t dns_conf_audit_size = 1024 * 1024;
-int dns_conf_audit_num = 2;
-int dns_conf_audit_file_mode;
-int dns_conf_audit_console;
-int dns_conf_audit_syslog;
-
-/* address rules */
 struct dns_conf_group_info {
 struct dns_conf_group_info {
 	struct list_head list;
 	struct list_head list;
 	const char *group_name;
 	const char *group_name;
@@ -145,36 +102,15 @@ struct dns_conf_group_info {
 struct dns_conf_group_info *dns_conf_current_group_info;
 struct dns_conf_group_info *dns_conf_current_group_info;
 struct dns_conf_group_info *dns_conf_default_group_info;
 struct dns_conf_group_info *dns_conf_default_group_info;
 static LIST_HEAD(dns_conf_group_info_list);
 static LIST_HEAD(dns_conf_group_info_list);
-
 struct dns_conf_rule dns_conf_rule;
 struct dns_conf_rule dns_conf_rule;
-struct dns_conf_client_rule dns_conf_client_rule;
-
-static int dns_conf_expand_ptr_from_address = 0;
-int dns_conf_local_ttl;
-int dns_conf_nftset_debug_enable;
-int dns_conf_mdns_lookup;
-int dns_conf_local_ptr_enable = 1;
-int dns_conf_acl_enable;
-
-char dns_conf_user[DNS_CONF_USERNAME_LEN];
-
-int dns_save_fail_packet;
-char dns_save_fail_packet_dir[DNS_MAX_PATH];
-char dns_resolv_file[DNS_MAX_PATH];
-int dns_no_pidfile;
-int dns_no_daemon;
-int dns_restart_on_crash;
-size_t dns_socket_buff_size;
-
 struct hash_table conf_file_table;
 struct hash_table conf_file_table;
 struct conf_file_path {
 struct conf_file_path {
 	struct hlist_node node;
 	struct hlist_node node;
 	char file[DNS_MAX_PATH];
 	char file[DNS_MAX_PATH];
 };
 };
-
 struct dns_conf_plugin_table dns_conf_plugin_table;
 struct dns_conf_plugin_table dns_conf_plugin_table;
 
 
-char dns_conf_sni_proxy_ip[DNS_MAX_IPLEN];
+struct dns_config dns_conf;
 
 
 static int _conf_domain_rule_nameserver(const char *domain, const char *group_name);
 static int _conf_domain_rule_nameserver(const char *domain, const char *group_name);
 static int _conf_domain_rule_group(const char *domain, const char *group_name);
 static int _conf_domain_rule_group(const char *domain, const char *group_name);
@@ -604,7 +540,7 @@ static int _config_rule_group_setup_value(struct dns_conf_group_info *group_info
 	}
 	}
 
 
 	memset(soa_table, 0, soa_talbe_size);
 	memset(soa_table, 0, soa_talbe_size);
-	memcpy(&group_rule->check_orders, &dns_conf_default_check_orders, sizeof(group_rule->check_orders));
+	memcpy(&group_rule->check_orders, &dns_conf.default_check_orders, sizeof(group_rule->check_orders));
 	group_rule->dualstack_ip_selection = 1;
 	group_rule->dualstack_ip_selection = 1;
 	group_rule->dns_dualstack_ip_selection_threshold = 10;
 	group_rule->dns_dualstack_ip_selection_threshold = 10;
 	group_rule->dns_rr_ttl_min = 600;
 	group_rule->dns_rr_ttl_min = 600;
@@ -612,7 +548,7 @@ static int _config_rule_group_setup_value(struct dns_conf_group_info *group_info
 	group_rule->dns_serve_expired_ttl = 24 * 3600 * 3;
 	group_rule->dns_serve_expired_ttl = 24 * 3600 * 3;
 	group_rule->dns_serve_expired_reply_ttl = 3;
 	group_rule->dns_serve_expired_reply_ttl = 3;
 	group_rule->dns_max_reply_ip_num = DNS_MAX_REPLY_IP_NUM;
 	group_rule->dns_max_reply_ip_num = DNS_MAX_REPLY_IP_NUM;
-	group_rule->dns_response_mode = dns_conf_default_response_mode;
+	group_rule->dns_response_mode = dns_conf.default_response_mode;
 
 
 	return 0;
 	return 0;
 }
 }
@@ -901,7 +837,7 @@ static void _config_srv_record_table_destroy(void)
 
 
 static int _config_server(int argc, char *argv[], dns_server_type_t type, int default_port)
 static int _config_server(int argc, char *argv[], dns_server_type_t type, int default_port)
 {
 {
-	int index = dns_conf_server_num;
+	int index = dns_conf.server_num;
 	struct dns_servers *server = NULL;
 	struct dns_servers *server = NULL;
 	int port = -1;
 	int port = -1;
 	char *ip = NULL;
 	char *ip = NULL;
@@ -960,7 +896,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 		return 0;
 		return 0;
 	}
 	}
 
 
-	server = &dns_conf_servers[index];
+	server = &dns_conf.servers[index];
 	server->spki[0] = '\0';
 	server->spki[0] = '\0';
 	server->path[0] = '\0';
 	server->path[0] = '\0';
 	server->hostname[0] = '\0';
 	server->hostname[0] = '\0';
@@ -1181,7 +1117,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 		}
 		}
 	}
 	}
 
 
-	dns_conf_server_num++;
+	dns_conf.server_num++;
 	tlog(TLOG_DEBUG, "add server %s, flag: %X, ttl: %d", ip, result_flag, ttl);
 	tlog(TLOG_DEBUG, "add server %s, flag: %X, ttl: %d", ip, result_flag, ttl);
 
 
 	if (is_bootstrap_dns) {
 	if (is_bootstrap_dns) {
@@ -1208,8 +1144,8 @@ static int _config_update_bootstrap_dns_rule(void)
 		return 0;
 		return 0;
 	}
 	}
 
 
-	for (int i = 0; i < dns_conf_server_num; i++) {
-		server = &dns_conf_servers[i];
+	for (int i = 0; i < dns_conf.server_num; i++) {
+		server = &dns_conf.servers[i];
 		if (check_is_ipaddr(server->server) == 0) {
 		if (check_is_ipaddr(server->server) == 0) {
 			continue;
 			continue;
 		}
 		}
@@ -2312,7 +2248,7 @@ static int _conf_domain_rule_address(char *domain, const char *domain_address)
 		}
 		}
 
 
 		/* add PTR */
 		/* add PTR */
-		if (dns_conf_expand_ptr_from_address == 1 && ip[0] != '\0' && _conf_ptr_add(domain, ip, 0) != 0) {
+		if (dns_conf.expand_ptr_from_address == 1 && ip[0] != '\0' && _conf_ptr_add(domain, ip, 0) != 0) {
 			goto errout;
 			goto errout;
 		}
 		}
 
 
@@ -2794,7 +2730,7 @@ static int _config_speed_check_mode_parser(struct dns_domain_check_orders *check
 			}
 			}
 			check_orders->orders[order].type = DOMAIN_CHECK_ICMP;
 			check_orders->orders[order].type = DOMAIN_CHECK_ICMP;
 			check_orders->orders[order].tcp_port = 0;
 			check_orders->orders[order].tcp_port = 0;
-			dns_conf_has_icmp_check = 1;
+			dns_conf.has_icmp_check = 1;
 		} else if (strstr(field, "tcp") == field) {
 		} else if (strstr(field, "tcp") == field) {
 			char *port_str = strstr(field, ":");
 			char *port_str = strstr(field, ":");
 			if (port_str) {
 			if (port_str) {
@@ -2806,7 +2742,7 @@ static int _config_speed_check_mode_parser(struct dns_domain_check_orders *check
 
 
 			check_orders->orders[order].type = DOMAIN_CHECK_TCP;
 			check_orders->orders[order].type = DOMAIN_CHECK_TCP;
 			check_orders->orders[order].tcp_port = port;
 			check_orders->orders[order].tcp_port = port;
-			dns_conf_has_tcp_check = 1;
+			dns_conf.has_tcp_check = 1;
 		} else if (strncmp(field, "none", sizeof("none")) == 0) {
 		} else if (strncmp(field, "none", sizeof("none")) == 0) {
 			for (i = order; i < DOMAIN_CHECK_NUM; i++) {
 			for (i = order; i < DOMAIN_CHECK_NUM; i++) {
 				check_orders->orders[i].type = DOMAIN_CHECK_NONE;
 				check_orders->orders[i].type = DOMAIN_CHECK_NONE;
@@ -3041,7 +2977,7 @@ static int _bind_is_ip_valid(const char *ip)
 
 
 static int _config_bind_ip(int argc, char *argv[], DNS_BIND_TYPE type)
 static int _config_bind_ip(int argc, char *argv[], DNS_BIND_TYPE type)
 {
 {
-	int index = dns_conf_bind_ip_num;
+	int index = dns_conf.bind_ip_num;
 	struct dns_bind_ip *bind_ip = NULL;
 	struct dns_bind_ip *bind_ip = NULL;
 	char *ip = NULL;
 	char *ip = NULL;
 	int opt = 0;
 	int opt = 0;
@@ -3089,8 +3025,8 @@ static int _config_bind_ip(int argc, char *argv[], DNS_BIND_TYPE type)
 		return -1;
 		return -1;
 	}
 	}
 
 
-	for (i = 0; i < dns_conf_bind_ip_num; i++) {
-		bind_ip = &dns_conf_bind_ip[i];
+	for (i = 0; i < dns_conf.bind_ip_num; i++) {
+		bind_ip = &dns_conf.bind_ip[i];
 		if (bind_ip->type != type) {
 		if (bind_ip->type != type) {
 			continue;
 			continue;
 		}
 		}
@@ -3103,7 +3039,7 @@ static int _config_bind_ip(int argc, char *argv[], DNS_BIND_TYPE type)
 		return 0;
 		return 0;
 	}
 	}
 
 
-	bind_ip = &dns_conf_bind_ip[index];
+	bind_ip = &dns_conf.bind_ip[index];
 	bind_ip->type = type;
 	bind_ip->type = type;
 	bind_ip->flags = 0;
 	bind_ip->flags = 0;
 	safe_strncpy(bind_ip->ip, ip, DNS_MAX_IPLEN);
 	safe_strncpy(bind_ip->ip, ip, DNS_MAX_IPLEN);
@@ -3211,13 +3147,13 @@ static int _config_bind_ip(int argc, char *argv[], DNS_BIND_TYPE type)
 	/* add new server */
 	/* add new server */
 	bind_ip->flags = server_flag;
 	bind_ip->flags = server_flag;
 	bind_ip->group = group;
 	bind_ip->group = group;
-	dns_conf_bind_ip_num++;
+	dns_conf.bind_ip_num++;
 	if (bind_ip->type == DNS_BIND_TYPE_TLS || bind_ip->type == DNS_BIND_TYPE_HTTPS) {
 	if (bind_ip->type == DNS_BIND_TYPE_TLS || bind_ip->type == DNS_BIND_TYPE_HTTPS) {
 		if (bind_ip->ssl_cert_file == NULL || bind_ip->ssl_cert_key_file == NULL) {
 		if (bind_ip->ssl_cert_file == NULL || bind_ip->ssl_cert_key_file == NULL) {
-			bind_ip->ssl_cert_file = dns_conf_bind_ca_file;
-			bind_ip->ssl_cert_key_file = dns_conf_bind_ca_key_file;
-			bind_ip->ssl_cert_key_pass = dns_conf_bind_ca_key_pass;
-			dns_conf_need_cert = 1;
+			bind_ip->ssl_cert_file = dns_conf.bind_ca_file;
+			bind_ip->ssl_cert_key_file = dns_conf.bind_ca_key_file;
+			bind_ip->ssl_cert_key_pass = dns_conf.bind_ca_key_pass;
+			dns_conf.need_cert = 1;
 		}
 		}
 	}
 	}
 	tlog(TLOG_DEBUG, "bind ip %s, type: %d, flag: %X", ip, type, server_flag);
 	tlog(TLOG_DEBUG, "bind ip %s, type: %d, flag: %X", ip, type, server_flag);
@@ -3601,7 +3537,7 @@ static radix_node_t *_create_client_rules_node(const char *addr)
 		return NULL;
 		return NULL;
 	}
 	}
 
 
-	node = radix_lookup(dns_conf_client_rule.rule, &prefix);
+	node = radix_lookup(dns_conf.client_rule.rule, &prefix);
 	return node;
 	return node;
 }
 }
 
 
@@ -3690,8 +3626,8 @@ static struct client_roue_group_mac *_config_client_rule_group_mac_new(uint8_t m
 	memcpy(group_mac->mac, mac, 6);
 	memcpy(group_mac->mac, mac, 6);
 
 
 	key = jhash(mac, 6, 0);
 	key = jhash(mac, 6, 0);
-	hash_add(dns_conf_client_rule.mac, &group_mac->node, key);
-	dns_conf_client_rule.mac_num++;
+	hash_add(dns_conf.client_rule.mac, &group_mac->node, key);
+	dns_conf.client_rule.mac_num++;
 
 
 	return group_mac;
 	return group_mac;
 }
 }
@@ -3702,7 +3638,7 @@ struct client_roue_group_mac *dns_server_rule_group_mac_get(const uint8_t mac[6]
 	uint32_t key;
 	uint32_t key;
 
 
 	key = jhash(mac, 6, 0);
 	key = jhash(mac, 6, 0);
-	hash_for_each_possible(dns_conf_client_rule.mac, group_mac, node, key)
+	hash_for_each_possible(dns_conf.client_rule.mac, group_mac, node, key)
 	{
 	{
 		if (memcmp(group_mac->mac, mac, 6) == 0) {
 		if (memcmp(group_mac->mac, mac, 6) == 0) {
 			return group_mac;
 			return group_mac;
@@ -5941,19 +5877,19 @@ static int _config_log_level(void *data, int argc, char *argv[])
 	char *value = argv[1];
 	char *value = argv[1];
 
 
 	if (strncasecmp("debug", value, MAX_LINE_LEN) == 0) {
 	if (strncasecmp("debug", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_DEBUG;
+		dns_conf.log_level = TLOG_DEBUG;
 	} else if (strncasecmp("info", value, MAX_LINE_LEN) == 0) {
 	} else if (strncasecmp("info", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_INFO;
+		dns_conf.log_level = TLOG_INFO;
 	} else if (strncasecmp("notice", value, MAX_LINE_LEN) == 0) {
 	} else if (strncasecmp("notice", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_NOTICE;
+		dns_conf.log_level = TLOG_NOTICE;
 	} else if (strncasecmp("warn", value, MAX_LINE_LEN) == 0) {
 	} else if (strncasecmp("warn", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_WARN;
+		dns_conf.log_level = TLOG_WARN;
 	} else if (strncasecmp("error", value, MAX_LINE_LEN) == 0) {
 	} else if (strncasecmp("error", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_ERROR;
+		dns_conf.log_level = TLOG_ERROR;
 	} else if (strncasecmp("fatal", value, MAX_LINE_LEN) == 0) {
 	} else if (strncasecmp("fatal", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_FATAL;
+		dns_conf.log_level = TLOG_FATAL;
 	} else if (strncasecmp("off", value, MAX_LINE_LEN) == 0) {
 	} else if (strncasecmp("off", value, MAX_LINE_LEN) == 0) {
-		dns_conf_log_level = TLOG_OFF;
+		dns_conf.log_level = TLOG_OFF;
 	} else {
 	} else {
 		return -1;
 		return -1;
 	}
 	}
@@ -5984,7 +5920,7 @@ static void _config_setup_smartdns_domain(void)
 		}
 		}
 	}
 	}
 
 
-	if (dns_conf_resolv_hostname == 1) {
+	if (dns_conf.resolv_hostname == 1) {
 		/* add hostname to rule table */
 		/* add hostname to rule table */
 		if (hostname[0] != '\0') {
 		if (hostname[0] != '\0') {
 			_config_domain_rule_flag_set(hostname, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
 			_config_domain_rule_flag_set(hostname, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
@@ -5999,9 +5935,9 @@ static void _config_setup_smartdns_domain(void)
 	}
 	}
 
 
 	/* add server name to rule table */
 	/* add server name to rule table */
-	if (dns_conf_server_name[0] != '\0' &&
-		strncmp(dns_conf_server_name, "smartdns", DNS_MAX_SERVER_NAME_LEN - 1) != 0) {
-		_config_domain_rule_flag_set(dns_conf_server_name, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
+	if (dns_conf.server_name[0] != '\0' &&
+		strncmp(dns_conf.server_name, "smartdns", DNS_MAX_SERVER_NAME_LEN - 1) != 0) {
+		_config_domain_rule_flag_set(dns_conf.server_name, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
 	}
 	}
 
 
 	_config_domain_rule_flag_set("smartdns", DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
 	_config_domain_rule_flag_set("smartdns", DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
@@ -6009,7 +5945,7 @@ static void _config_setup_smartdns_domain(void)
 
 
 static int _dns_conf_setup_mdns(void)
 static int _dns_conf_setup_mdns(void)
 {
 {
-	if (dns_conf_mdns_lookup != 1) {
+	if (dns_conf.mdns_lookup != 1) {
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -6017,23 +5953,23 @@ static int _dns_conf_setup_mdns(void)
 }
 }
 
 
 static struct config_item _config_item[] = {
 static struct config_item _config_item[] = {
-	CONF_STRING("server-name", (char *)dns_conf_server_name, DNS_MAX_SERVER_NAME_LEN),
-	CONF_YESNO("resolv-hostname", &dns_conf_resolv_hostname),
+	CONF_STRING("server-name", (char *)dns_conf.server_name, DNS_MAX_SERVER_NAME_LEN),
+	CONF_YESNO("resolv-hostname", &dns_conf.resolv_hostname),
 	CONF_CUSTOM("bind", _config_bind_ip_udp, NULL),
 	CONF_CUSTOM("bind", _config_bind_ip_udp, NULL),
 	CONF_CUSTOM("bind-tcp", _config_bind_ip_tcp, NULL),
 	CONF_CUSTOM("bind-tcp", _config_bind_ip_tcp, NULL),
 	CONF_CUSTOM("bind-tls", _config_bind_ip_tls, NULL),
 	CONF_CUSTOM("bind-tls", _config_bind_ip_tls, NULL),
 	CONF_CUSTOM("bind-https", _config_bind_ip_https, NULL),
 	CONF_CUSTOM("bind-https", _config_bind_ip_https, NULL),
-	CONF_CUSTOM("bind-cert-file", _config_option_parser_filepath, &dns_conf_bind_ca_file),
-	CONF_CUSTOM("bind-cert-key-file", _config_option_parser_filepath, &dns_conf_bind_ca_key_file),
-	CONF_STRING("bind-cert-key-pass", dns_conf_bind_ca_key_pass, DNS_MAX_PATH),
+	CONF_CUSTOM("bind-cert-file", _config_option_parser_filepath, &dns_conf.bind_ca_file),
+	CONF_CUSTOM("bind-cert-key-file", _config_option_parser_filepath, &dns_conf.bind_ca_key_file),
+	CONF_STRING("bind-cert-key-pass", dns_conf.bind_ca_key_pass, DNS_MAX_PATH),
 	CONF_CUSTOM("server", _config_server_udp, NULL),
 	CONF_CUSTOM("server", _config_server_udp, NULL),
 	CONF_CUSTOM("server-tcp", _config_server_tcp, NULL),
 	CONF_CUSTOM("server-tcp", _config_server_tcp, NULL),
 	CONF_CUSTOM("server-tls", _config_server_tls, NULL),
 	CONF_CUSTOM("server-tls", _config_server_tls, NULL),
 	CONF_CUSTOM("server-https", _config_server_https, NULL),
 	CONF_CUSTOM("server-https", _config_server_https, NULL),
-	CONF_YESNO("mdns-lookup", &dns_conf_mdns_lookup),
-	CONF_YESNO("local-ptr-enable", &dns_conf_local_ptr_enable),
+	CONF_YESNO("mdns-lookup", &dns_conf.mdns_lookup),
+	CONF_YESNO("local-ptr-enable", &dns_conf.local_ptr_enable),
 	CONF_CUSTOM("nameserver", _config_nameserver, NULL),
 	CONF_CUSTOM("nameserver", _config_nameserver, NULL),
-	CONF_YESNO("expand-ptr-from-address", &dns_conf_expand_ptr_from_address),
+	CONF_YESNO("expand-ptr-from-address", &dns_conf.expand_ptr_from_address),
 	CONF_CUSTOM("address", _config_address, NULL),
 	CONF_CUSTOM("address", _config_address, NULL),
 	CONF_CUSTOM("cname", _config_cname, NULL),
 	CONF_CUSTOM("cname", _config_cname, NULL),
 	CONF_CUSTOM("srv-record", _config_srv_record, NULL),
 	CONF_CUSTOM("srv-record", _config_srv_record, NULL),
@@ -6043,17 +5979,17 @@ static struct config_item _config_item[] = {
 	CONF_CUSTOM("ipset", _config_ipset, NULL),
 	CONF_CUSTOM("ipset", _config_ipset, NULL),
 	CONF_CUSTOM("ipset-no-speed", _config_ipset_no_speed, NULL),
 	CONF_CUSTOM("ipset-no-speed", _config_ipset_no_speed, NULL),
 	CONF_YESNO_FUNC("nftset-timeout", _dns_conf_group_yesno, group_member(ipset_nftset.nftset_timeout_enable)),
 	CONF_YESNO_FUNC("nftset-timeout", _dns_conf_group_yesno, group_member(ipset_nftset.nftset_timeout_enable)),
-	CONF_YESNO("nftset-debug", &dns_conf_nftset_debug_enable),
+	CONF_YESNO("nftset-debug", &dns_conf.nftset_debug_enable),
 	CONF_CUSTOM("nftset", _config_nftset, NULL),
 	CONF_CUSTOM("nftset", _config_nftset, NULL),
 	CONF_CUSTOM("nftset-no-speed", _config_nftset_no_speed, NULL),
 	CONF_CUSTOM("nftset-no-speed", _config_nftset_no_speed, NULL),
 	CONF_CUSTOM("speed-check-mode", _config_speed_check_mode, NULL),
 	CONF_CUSTOM("speed-check-mode", _config_speed_check_mode, NULL),
-	CONF_INT("tcp-idle-time", &dns_conf_tcp_idle_time, 0, 3600),
-	CONF_SSIZE("cache-size", &dns_conf_cachesize, -1, CONF_INT_MAX),
-	CONF_SSIZE("cache-mem-size", &dns_conf_cache_max_memsize, 0, CONF_INT_MAX),
-	CONF_CUSTOM("cache-file", _config_option_parser_filepath, (char *)&dns_conf_cache_file),
-	CONF_CUSTOM("data-dir", _config_option_parser_filepath, (char *)&dns_conf_data_dir),
-	CONF_YESNO("cache-persist", &dns_conf_cache_persist),
-	CONF_INT("cache-checkpoint-time", &dns_conf_cache_checkpoint_time, 0, 3600 * 24 * 7),
+	CONF_INT("tcp-idle-time", &dns_conf.tcp_idle_time, 0, 3600),
+	CONF_SSIZE("cache-size", &dns_conf.cachesize, -1, CONF_INT_MAX),
+	CONF_SSIZE("cache-mem-size", &dns_conf.cache_max_memsize, 0, CONF_INT_MAX),
+	CONF_CUSTOM("cache-file", _config_option_parser_filepath, (char *)&dns_conf.cache_file),
+	CONF_CUSTOM("data-dir", _config_option_parser_filepath, (char *)&dns_conf.data_dir),
+	CONF_YESNO("cache-persist", &dns_conf.cache_persist),
+	CONF_INT("cache-checkpoint-time", &dns_conf.cache_checkpoint_time, 0, 3600 * 24 * 7),
 	CONF_YESNO_FUNC("prefetch-domain", _dns_conf_group_yesno, group_member(dns_prefetch)),
 	CONF_YESNO_FUNC("prefetch-domain", _dns_conf_group_yesno, group_member(dns_prefetch)),
 	CONF_YESNO_FUNC("serve-expired", _dns_conf_group_yesno, group_member(dns_serve_expired)),
 	CONF_YESNO_FUNC("serve-expired", _dns_conf_group_yesno, group_member(dns_serve_expired)),
 	CONF_INT_FUNC("serve-expired-ttl", _dns_conf_group_int, group_member(dns_serve_expired_ttl), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("serve-expired-ttl", _dns_conf_group_int, group_member(dns_serve_expired_ttl), 0, CONF_INT_MAX),
@@ -6068,28 +6004,28 @@ static struct config_item _config_item[] = {
 				  group_member(dns_dualstack_ip_selection_threshold), 0, 1000),
 				  group_member(dns_dualstack_ip_selection_threshold), 0, 1000),
 	CONF_CUSTOM("dns64", _config_dns64, NULL),
 	CONF_CUSTOM("dns64", _config_dns64, NULL),
 	CONF_CUSTOM("log-level", _config_log_level, NULL),
 	CONF_CUSTOM("log-level", _config_log_level, NULL),
-	CONF_CUSTOM("log-file", _config_option_parser_filepath, (char *)dns_conf_log_file),
-	CONF_SIZE("log-size", &dns_conf_log_size, 0, 1024 * 1024 * 1024),
-	CONF_INT("log-num", &dns_conf_log_num, 0, 1024),
-	CONF_YESNO("log-console", &dns_conf_log_console),
-	CONF_YESNO("log-syslog", &dns_conf_log_syslog),
-	CONF_INT_BASE("log-file-mode", &dns_conf_log_file_mode, 0, 511, 8),
-	CONF_YESNO("audit-enable", &dns_conf_audit_enable),
-	CONF_YESNO("audit-SOA", &dns_conf_audit_log_SOA),
-	CONF_CUSTOM("audit-file", _config_option_parser_filepath, (char *)&dns_conf_audit_file),
-	CONF_INT_BASE("audit-file-mode", &dns_conf_audit_file_mode, 0, 511, 8),
-	CONF_SIZE("audit-size", &dns_conf_audit_size, 0, 1024 * 1024 * 1024),
-	CONF_INT("audit-num", &dns_conf_audit_num, 0, 1024),
-	CONF_YESNO("audit-console", &dns_conf_audit_console),
-	CONF_YESNO("audit-syslog", &dns_conf_audit_syslog),
-	CONF_YESNO("acl-enable", &dns_conf_acl_enable),
+	CONF_CUSTOM("log-file", _config_option_parser_filepath, (char *)dns_conf.log_file),
+	CONF_SIZE("log-size", &dns_conf.log_size, 0, 1024 * 1024 * 1024),
+	CONF_INT("log-num", &dns_conf.log_num, 0, 1024),
+	CONF_YESNO("log-console", &dns_conf.log_console),
+	CONF_YESNO("log-syslog", &dns_conf.log_syslog),
+	CONF_INT_BASE("log-file-mode", &dns_conf.log_file_mode, 0, 511, 8),
+	CONF_YESNO("audit-enable", &dns_conf.audit_enable),
+	CONF_YESNO("audit-SOA", &dns_conf.audit_log_SOA),
+	CONF_CUSTOM("audit-file", _config_option_parser_filepath, (char *)&dns_conf.audit_file),
+	CONF_INT_BASE("audit-file-mode", &dns_conf.audit_file_mode, 0, 511, 8),
+	CONF_SIZE("audit-size", &dns_conf.audit_size, 0, 1024 * 1024 * 1024),
+	CONF_INT("audit-num", &dns_conf.audit_num, 0, 1024),
+	CONF_YESNO("audit-console", &dns_conf.audit_console),
+	CONF_YESNO("audit-syslog", &dns_conf.audit_syslog),
+	CONF_YESNO("acl-enable", &dns_conf.acl_enable),
 	CONF_INT_FUNC("rr-ttl", _dns_conf_group_int, group_member(dns_rr_ttl), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl", _dns_conf_group_int, group_member(dns_rr_ttl), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl-min", _dns_conf_group_int, group_member(dns_rr_ttl_min), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl-min", _dns_conf_group_int, group_member(dns_rr_ttl_min), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl-max", _dns_conf_group_int, group_member(dns_rr_ttl_max), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl-max", _dns_conf_group_int, group_member(dns_rr_ttl_max), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl-reply-max", _dns_conf_group_int, group_member(dns_rr_ttl_reply_max), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("rr-ttl-reply-max", _dns_conf_group_int, group_member(dns_rr_ttl_reply_max), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("local-ttl", _dns_conf_group_int, group_member(dns_local_ttl), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("local-ttl", _dns_conf_group_int, group_member(dns_local_ttl), 0, CONF_INT_MAX),
 	CONF_INT_FUNC("max-reply-ip-num", _dns_conf_group_int, group_member(dns_max_reply_ip_num), 1, CONF_INT_MAX),
 	CONF_INT_FUNC("max-reply-ip-num", _dns_conf_group_int, group_member(dns_max_reply_ip_num), 1, CONF_INT_MAX),
-	CONF_INT("max-query-limit", &dns_conf_max_query_limit, 0, CONF_INT_MAX),
+	CONF_INT("max-query-limit", &dns_conf.max_query_limit, 0, CONF_INT_MAX),
 	CONF_ENUM_FUNC("response-mode", _dns_conf_group_enum, group_member(dns_response_mode),
 	CONF_ENUM_FUNC("response-mode", _dns_conf_group_enum, group_member(dns_response_mode),
 				   &dns_conf_response_mode_enum),
 				   &dns_conf_response_mode_enum),
 	CONF_YESNO_FUNC("force-AAAA-SOA", _dns_conf_group_yesno, group_member(force_AAAA_SOA)),
 	CONF_YESNO_FUNC("force-AAAA-SOA", _dns_conf_group_yesno, group_member(force_AAAA_SOA)),
@@ -6112,17 +6048,18 @@ static struct config_item _config_item[] = {
 	CONF_CUSTOM("group-end", _config_group_end, NULL),
 	CONF_CUSTOM("group-end", _config_group_end, NULL),
 	CONF_CUSTOM("group-match", _config_group_match, NULL),
 	CONF_CUSTOM("group-match", _config_group_match, NULL),
 	CONF_CUSTOM("client-rules", _config_client_rules, NULL),
 	CONF_CUSTOM("client-rules", _config_client_rules, NULL),
-	CONF_STRING("ca-file", (char *)&dns_conf_ca_file, DNS_MAX_PATH),
-	CONF_STRING("ca-path", (char *)&dns_conf_ca_path, DNS_MAX_PATH),
-	CONF_STRING("user", (char *)&dns_conf_user, sizeof(dns_conf_user)),
-	CONF_YESNO("debug-save-fail-packet", &dns_save_fail_packet),
-	CONF_YESNO("no-pidfile", &dns_no_pidfile),
-	CONF_YESNO("no-daemon", &dns_no_daemon),
-	CONF_YESNO("restart-on-crash", &dns_restart_on_crash),
-	CONF_SIZE("socket-buff-size", &dns_socket_buff_size, 0, 1024 * 1024 * 8),
+	CONF_STRING("ca-file", (char *)&dns_conf.ca_file, DNS_MAX_PATH),
+	CONF_STRING("ca-path", (char *)&dns_conf.ca_path, DNS_MAX_PATH),
+	CONF_STRING("user", (char *)&dns_conf.user, sizeof(dns_conf.user)),
+	CONF_YESNO("debug-save-fail-packet", &dns_conf.dns_save_fail_packet),
+	CONF_YESNO("no-pidfile", &dns_conf.dns_no_pidfile),
+	CONF_YESNO("no-daemon", &dns_conf.dns_no_daemon),
+	CONF_YESNO("restart-on-crash", &dns_conf.dns_restart_on_crash),
+	CONF_SIZE("socket-buff-size", &dns_conf.dns_socket_buff_size, 0, 1024 * 1024 * 8),
 	CONF_CUSTOM("plugin", _config_plugin, NULL),
 	CONF_CUSTOM("plugin", _config_plugin, NULL),
-	CONF_STRING("resolv-file", (char *)&dns_resolv_file, sizeof(dns_resolv_file)),
-	CONF_STRING("debug-save-fail-packet-dir", (char *)&dns_save_fail_packet_dir, sizeof(dns_save_fail_packet_dir)),
+	CONF_STRING("resolv-file", (char *)&dns_conf.dns_resolv_file, sizeof(dns_conf.dns_resolv_file)),
+	CONF_STRING("debug-save-fail-packet-dir", (char *)&dns_conf.dns_save_fail_packet_dir,
+				sizeof(dns_conf.dns_save_fail_packet_dir)),
 	CONF_CUSTOM("conf-file", config_additional_file, NULL),
 	CONF_CUSTOM("conf-file", config_additional_file, NULL),
 	CONF_END(),
 	CONF_END(),
 };
 };
@@ -6288,30 +6225,30 @@ int config_additional_file(void *data, int argc, char *argv[])
 
 
 const char *dns_conf_get_cache_dir(void)
 const char *dns_conf_get_cache_dir(void)
 {
 {
-	if (dns_conf_cache_file[0] == '\0') {
+	if (dns_conf.cache_file[0] == '\0') {
 		return SMARTDNS_CACHE_FILE;
 		return SMARTDNS_CACHE_FILE;
 	}
 	}
 
 
-	return dns_conf_cache_file;
+	return dns_conf.cache_file;
 }
 }
 
 
 const char *dns_conf_get_data_dir(void)
 const char *dns_conf_get_data_dir(void)
 {
 {
-	if (dns_conf_data_dir[0] == '\0') {
+	if (dns_conf.data_dir[0] == '\0') {
 		return SMARTDNS_DATA_DIR;
 		return SMARTDNS_DATA_DIR;
 	}
 	}
 
 
-	return dns_conf_data_dir;
+	return dns_conf.data_dir;
 }
 }
 
 
 static int _dns_server_load_conf_init(void)
 static int _dns_server_load_conf_init(void)
 {
 {
-	dns_conf_client_rule.rule = New_Radix();
-	if (dns_conf_client_rule.rule == NULL) {
+	dns_conf.client_rule.rule = New_Radix();
+	if (dns_conf.client_rule.rule == NULL) {
 		tlog(TLOG_WARN, "init client rule radix tree failed.");
 		tlog(TLOG_WARN, "init client rule radix tree failed.");
 		return -1;
 		return -1;
 	}
 	}
-	hash_init(dns_conf_client_rule.mac);
+	hash_init(dns_conf.client_rule.mac);
 	hash_init(dns_conf_rule.group);
 	hash_init(dns_conf_rule.group);
 	dns_conf_rule.default_conf = _config_rule_group_new("");
 	dns_conf_rule.default_conf = _config_rule_group_new("");
 	if (dns_conf_rule.default_conf == NULL) {
 	if (dns_conf_rule.default_conf == NULL) {
@@ -6340,8 +6277,8 @@ static int _dns_server_load_conf_init(void)
 
 
 static void dns_server_bind_destroy(void)
 static void dns_server_bind_destroy(void)
 {
 {
-	for (int i = 0; i < dns_conf_bind_ip_num; i++) {
-		struct dns_bind_ip *bind_ip = &dns_conf_bind_ip[i];
+	for (int i = 0; i < dns_conf.bind_ip_num; i++) {
+		struct dns_bind_ip *bind_ip = &dns_conf.bind_ip[i];
 
 
 		if (bind_ip->nftset_ipset_rule.ipset) {
 		if (bind_ip->nftset_ipset_rule.ipset) {
 			_dns_rule_put(&bind_ip->nftset_ipset_rule.ipset->head);
 			_dns_rule_put(&bind_ip->nftset_ipset_rule.ipset->head);
@@ -6363,8 +6300,8 @@ static void dns_server_bind_destroy(void)
 			_dns_rule_put(&bind_ip->nftset_ipset_rule.nftset_ip6->head);
 			_dns_rule_put(&bind_ip->nftset_ipset_rule.nftset_ip6->head);
 		}
 		}
 	}
 	}
-	memset(dns_conf_bind_ip, 0, sizeof(dns_conf_bind_ip));
-	dns_conf_bind_ip_num = 0;
+	memset(dns_conf.bind_ip, 0, sizeof(dns_conf.bind_ip));
+	dns_conf.bind_ip_num = 0;
 }
 }
 
 
 static void _config_client_rule_destroy_mac(void)
 static void _config_client_rule_destroy_mac(void)
@@ -6373,7 +6310,7 @@ static void _config_client_rule_destroy_mac(void)
 	unsigned int i;
 	unsigned int i;
 	struct client_roue_group_mac *group_mac = NULL;
 	struct client_roue_group_mac *group_mac = NULL;
 
 
-	hash_for_each_safe(dns_conf_client_rule.mac, i, tmp, group_mac, node)
+	hash_for_each_safe(dns_conf.client_rule.mac, i, tmp, group_mac, node)
 	{
 	{
 		hlist_del_init(&group_mac->node);
 		hlist_del_init(&group_mac->node);
 		_config_client_rules_free(group_mac->rules);
 		_config_client_rules_free(group_mac->rules);
@@ -6383,7 +6320,7 @@ static void _config_client_rule_destroy_mac(void)
 
 
 static void _config_client_rule_destroy(void)
 static void _config_client_rule_destroy(void)
 {
 {
-	Destroy_Radix(dns_conf_client_rule.rule, _config_client_rule_iter_free_cb, NULL);
+	Destroy_Radix(dns_conf.client_rule.rule, _config_client_rule_iter_free_cb, NULL);
 	_config_client_rule_destroy_mac();
 	_config_client_rule_destroy_mac();
 }
 }
 
 
@@ -6427,17 +6364,19 @@ void dns_server_load_exit(void)
 	_config_plugin_table_destroy();
 	_config_plugin_table_destroy();
 	_config_plugin_table_conf_destroy();
 	_config_plugin_table_conf_destroy();
 
 
-	dns_conf_server_num = 0;
+	dns_conf.server_num = 0;
 	dns_server_bind_destroy();
 	dns_server_bind_destroy();
 
 
-	if (dns_conf_log_syslog == 1 || dns_conf_audit_syslog == 1) {
+	if (dns_conf.log_syslog == 1 || dns_conf.audit_syslog == 1) {
 		closelog();
 		closelog();
 	}
 	}
+
+	memset(&dns_conf, 0, sizeof(dns_conf));
 }
 }
 
 
 static int _config_add_default_server_if_needed(void)
 static int _config_add_default_server_if_needed(void)
 {
 {
-	if (dns_conf_bind_ip_num > 0) {
+	if (dns_conf.bind_ip_num > 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -6470,11 +6409,11 @@ static int _dns_conf_speed_check_mode_verify(void)
 					check_orders->orders[j - 1].tcp_port = 0;
 					check_orders->orders[j - 1].tcp_port = 0;
 					print_log = 1;
 					print_log = 1;
 				}
 				}
-				dns_conf_has_icmp_check = 1;
+				dns_conf.has_icmp_check = 1;
 			}
 			}
 
 
 			if (check_orders->orders[i].type == DOMAIN_CHECK_TCP) {
 			if (check_orders->orders[i].type == DOMAIN_CHECK_TCP) {
-				dns_conf_has_tcp_check = 1;
+				dns_conf.has_tcp_check = 1;
 			}
 			}
 		}
 		}
 	}
 	}
@@ -6525,15 +6464,40 @@ static void _config_file_hash_table_destroy(void)
 	hash_table_free(conf_file_table, free);
 	hash_table_free(conf_file_table, free);
 }
 }
 
 
+static void _dns_conf_default_value_init(void)
+{
+	dns_conf.max_query_limit = DNS_MAX_QUERY_LIMIT;
+	dns_conf.tcp_idle_time = 120;
+	dns_conf.local_ptr_enable = 1;
+	dns_conf.audit_size = 1024 * 1024;
+	dns_conf.cache_checkpoint_time = DNS_DEFAULT_CHECKPOINT_TIME;
+	dns_conf.cache_persist = 2;
+	dns_conf.log_num = 8;
+	dns_conf.log_size = 1024 * 1024;
+	dns_conf.log_level = TLOG_ERROR;
+	dns_conf.resolv_hostname = 1;
+	dns_conf.cachesize = -1;
+	dns_conf.cache_max_memsize = -1;
+	dns_conf.default_check_orders.orders[0].type = DOMAIN_CHECK_ICMP;
+	dns_conf.default_check_orders.orders[0].tcp_port = 0;
+	dns_conf.default_check_orders.orders[1].type = DOMAIN_CHECK_TCP;
+	dns_conf.default_check_orders.orders[1].tcp_port = 80;
+	dns_conf.default_check_orders.orders[2].type = DOMAIN_CHECK_TCP;
+	dns_conf.default_check_orders.orders[2].tcp_port = 443;
+	dns_conf.default_response_mode = DNS_RESPONSE_MODE_FIRST_PING_IP;
+}
+
 static int _dns_conf_load_pre(void)
 static int _dns_conf_load_pre(void)
 {
 {
+	_dns_conf_default_value_init();
+
 	if (_dns_server_load_conf_init() != 0) {
 	if (_dns_server_load_conf_init() != 0) {
 		goto errout;
 		goto errout;
 	}
 	}
 
 
 	_dns_ping_cap_check();
 	_dns_ping_cap_check();
 
 
-	safe_strncpy(dns_save_fail_packet_dir, SMARTDNS_DEBUG_DIR, sizeof(dns_save_fail_packet_dir));
+	safe_strncpy(dns_conf.dns_save_fail_packet_dir, SMARTDNS_DEBUG_DIR, sizeof(dns_conf.dns_save_fail_packet_dir));
 
 
 	hash_table_init(conf_file_table, 8, malloc);
 	hash_table_init(conf_file_table, 8, malloc);
 
 
@@ -6546,24 +6510,24 @@ errout:
 static void _dns_conf_auto_set_cache_size(void)
 static void _dns_conf_auto_set_cache_size(void)
 {
 {
 	uint64_t memsize = get_system_mem_size();
 	uint64_t memsize = get_system_mem_size();
-	if (dns_conf_cachesize >= 0) {
+	if (dns_conf.cachesize >= 0) {
 		return;
 		return;
 	}
 	}
 
 
 	if (memsize <= 16 * 1024 * 1024) {
 	if (memsize <= 16 * 1024 * 1024) {
-		dns_conf_cachesize = 2048; /* 1MB memory */
+		dns_conf.cachesize = 2048; /* 1MB memory */
 	} else if (memsize <= 32 * 1024 * 1024) {
 	} else if (memsize <= 32 * 1024 * 1024) {
-		dns_conf_cachesize = 8192; /* 4MB memory*/
+		dns_conf.cachesize = 8192; /* 4MB memory*/
 	} else if (memsize <= 64 * 1024 * 1024) {
 	} else if (memsize <= 64 * 1024 * 1024) {
-		dns_conf_cachesize = 16384; /* 8MB memory*/
+		dns_conf.cachesize = 16384; /* 8MB memory*/
 	} else if (memsize <= 128 * 1024 * 1024) {
 	} else if (memsize <= 128 * 1024 * 1024) {
-		dns_conf_cachesize = 32768; /* 16MB memory*/
+		dns_conf.cachesize = 32768; /* 16MB memory*/
 	} else if (memsize <= 256 * 1024 * 1024) {
 	} else if (memsize <= 256 * 1024 * 1024) {
-		dns_conf_cachesize = 65536; /* 32MB memory*/
+		dns_conf.cachesize = 65536; /* 32MB memory*/
 	} else if (memsize <= 512 * 1024 * 1024) {
 	} else if (memsize <= 512 * 1024 * 1024) {
-		dns_conf_cachesize = 131072; /* 64MB memory*/
+		dns_conf.cachesize = 131072; /* 64MB memory*/
 	} else {
 	} else {
-		dns_conf_cachesize = 262144; /* 128MB memory*/
+		dns_conf.cachesize = 262144; /* 128MB memory*/
 	}
 	}
 }
 }
 
 
@@ -6575,7 +6539,7 @@ static void _dns_conf_group_post(void)
 
 
 	hash_for_each_safe(dns_conf_rule.group, i, tmp, group, node)
 	hash_for_each_safe(dns_conf_rule.group, i, tmp, group, node)
 	{
 	{
-		if (dns_conf_cachesize == 0 && group->dns_response_mode == DNS_RESPONSE_MODE_FASTEST_RESPONSE) {
+		if (dns_conf.cachesize == 0 && group->dns_response_mode == DNS_RESPONSE_MODE_FASTEST_RESPONSE) {
 			group->dns_response_mode = DNS_RESPONSE_MODE_FASTEST_IP;
 			group->dns_response_mode = DNS_RESPONSE_MODE_FASTEST_IP;
 			tlog(TLOG_WARN, "force set response of group %s to %s as cache size is 0", group->group_name,
 			tlog(TLOG_WARN, "force set response of group %s to %s as cache size is 0", group->group_name,
 				 dns_conf_response_mode_enum[group->dns_response_mode].name);
 				 dns_conf_response_mode_enum[group->dns_response_mode].name);
@@ -6604,8 +6568,8 @@ static int _dns_conf_load_post(void)
 
 
 	_dns_conf_setup_mdns();
 	_dns_conf_setup_mdns();
 
 
-	if (dns_resolv_file[0] == '\0') {
-		safe_strncpy(dns_resolv_file, DNS_RESOLV_FILE, sizeof(dns_resolv_file));
+	if (dns_conf.dns_resolv_file[0] == '\0') {
+		safe_strncpy(dns_conf.dns_resolv_file, DNS_RESOLV_FILE, sizeof(dns_conf.dns_resolv_file));
 	}
 	}
 
 
 	_dns_conf_group_post();
 	_dns_conf_group_post();
@@ -6622,7 +6586,7 @@ static int _dns_conf_load_post(void)
 
 
 	_config_current_group_pop_all();
 	_config_current_group_pop_all();
 
 
-	if (dns_conf_log_syslog == 0 && dns_conf_audit_syslog == 0) {
+	if (dns_conf.log_syslog == 0 && dns_conf.audit_syslog == 0) {
 		closelog();
 		closelog();
 	}
 	}
 
 

+ 80 - 75
src/dns_conf.h

@@ -651,9 +651,6 @@ struct dns_srv_record_table {
 };
 };
 extern struct dns_srv_record_table dns_conf_srv_record_table;
 extern struct dns_srv_record_table dns_conf_srv_record_table;
 
 
-extern struct dns_bind_ip dns_conf_bind_ip[DNS_MAX_BIND_IP];
-extern int dns_conf_bind_ip_num;
-
 struct dns_conf_plugin {
 struct dns_conf_plugin {
 	struct hlist_node node;
 	struct hlist_node node;
 	char name[DNS_MAX_CNAME_LEN];
 	char name[DNS_MAX_CNAME_LEN];
@@ -674,82 +671,90 @@ struct dns_conf_plugin_table {
 	DECLARE_HASHTABLE(plugins_conf, 4);
 	DECLARE_HASHTABLE(plugins_conf, 4);
 };
 };
 extern struct dns_conf_plugin_table dns_conf_plugin_table;
 extern struct dns_conf_plugin_table dns_conf_plugin_table;
+extern char dns_conf_exist_bootstrap_dns;
+extern int dns_ping_cap_force_enable;
 
 
-extern char dns_conf_bind_ca_file[DNS_MAX_PATH];
-extern char dns_conf_bind_ca_key_file[DNS_MAX_PATH];
-extern char dns_conf_bind_ca_key_pass[DNS_MAX_PATH];
-extern char dns_conf_need_cert;
+struct dns_config {
+	struct dns_bind_ip bind_ip[DNS_MAX_BIND_IP];
+	int bind_ip_num;
+
+	char bind_ca_file[DNS_MAX_PATH];
+	char bind_ca_key_file[DNS_MAX_PATH];
+	char bind_ca_key_pass[DNS_MAX_PATH];
+	char need_cert;
+	int tcp_idle_time;
+	ssize_t cachesize;
+	ssize_t cache_max_memsize;
+	struct dns_servers servers[DNS_MAX_SERVERS];
+	int server_num;
 
 
-extern int dns_conf_tcp_idle_time;
-extern ssize_t dns_conf_cachesize;
-extern ssize_t dns_conf_cache_max_memsize;
-extern struct dns_servers dns_conf_servers[DNS_MAX_SERVERS];
-extern int dns_conf_server_num;
+	/* proxy servers */
+	struct dns_proxy_servers proxy_servers[PROXY_MAX_SERVERS];
+	int proxy_server_num;
+
+	int log_level;
+	char log_file[DNS_MAX_PATH];
+	size_t log_size;
+	int log_num;
+	int log_file_mode;
+	int log_console;
+	int log_syslog;
+
+	char ca_file[DNS_MAX_PATH];
+	char ca_path[DNS_MAX_PATH];
+
+	char cache_file[DNS_MAX_PATH];
+	char var_libdir[DNS_MAX_PATH];
+	int cache_persist;
+	int cache_checkpoint_time;
+
+	char data_dir[DNS_MAX_PATH];
+
+	struct dns_domain_check_orders default_check_orders;
+	int has_icmp_check;
+	int has_tcp_check;
+
+	struct dns_server_groups server_groups[DNS_NAX_GROUP_NUMBER];
+	int server_group_num;
+
+	int audit_enable;
+	int audit_log_SOA;
+	char audit_file[DNS_MAX_PATH];
+	size_t audit_size;
+	int audit_num;
+	int audit_file_mode;
+	int audit_console;
+	int audit_syslog;
+
+	char server_name[DNS_MAX_SERVER_NAME_LEN];
+	struct dns_conf_domain_rule domain_rule;
+	struct dns_conf_client_rule client_rule;
 
 
-extern char dns_conf_exist_bootstrap_dns;
+	int max_query_limit;
+	enum response_mode_type default_response_mode;
+	int nftset_debug_enable;
+	int local_ttl;
+	int mdns_lookup;
+	int local_ptr_enable;
+	int acl_enable;
 
 
-/* proxy servers */
-extern struct dns_proxy_servers dns_conf_proxy_servers[PROXY_MAX_SERVERS];
-extern int dns_conf_proxy_server_num;
-
-extern int dns_conf_log_level;
-extern char dns_conf_log_file[DNS_MAX_PATH];
-extern size_t dns_conf_log_size;
-extern int dns_conf_log_num;
-extern int dns_conf_log_file_mode;
-extern int dns_conf_log_console;
-extern int dns_conf_log_syslog;
-
-extern char dns_conf_ca_file[DNS_MAX_PATH];
-extern char dns_conf_ca_path[DNS_MAX_PATH];
-
-extern char dns_conf_cache_file[DNS_MAX_PATH];
-extern char dns_conf_var_libdir[DNS_MAX_PATH];
-extern int dns_conf_cache_persist;
-extern int dns_conf_cache_checkpoint_time;
-
-extern struct dns_domain_check_orders dns_conf_default_check_orders;
-extern int dns_conf_has_icmp_check;
-extern int dns_conf_has_tcp_check;
-
-extern struct dns_server_groups dns_conf_server_groups[DNS_NAX_GROUP_NUMBER];
-extern int dns_conf_server_group_num;
-
-extern int dns_conf_audit_enable;
-extern int dns_conf_audit_log_SOA;
-extern int dns_conf_audit_syslog;
-extern char dns_conf_audit_file[DNS_MAX_PATH];
-extern size_t dns_conf_audit_size;
-extern int dns_conf_audit_num;
-extern int dns_conf_audit_file_mode;
-extern int dns_conf_audit_console;
-extern int dns_conf_audit_syslog;
-
-extern char dns_conf_server_name[DNS_MAX_SERVER_NAME_LEN];
-extern struct dns_conf_domain_rule dns_conf_domain_rule;
-extern struct dns_conf_client_rule dns_conf_client_rule;
-
-extern int dns_conf_max_query_limit;
-extern enum response_mode_type dns_conf_default_response_mode;
-extern int dns_conf_nftset_debug_enable;
-extern int dns_conf_local_ttl;
-extern int dns_conf_mdns_lookup;
-extern int dns_conf_local_ptr_enable;
-extern int dns_conf_acl_enable;
-
-extern char dns_conf_user[DNS_CONF_USERNAME_LEN];
-
-extern char dns_conf_sni_proxy_ip[DNS_MAX_IPLEN];
-
-extern int dns_save_fail_packet;
-extern char dns_save_fail_packet_dir[DNS_MAX_PATH];
-extern char dns_resolv_file[DNS_MAX_PATH];
-
-extern int dns_no_pidfile;
-extern int dns_no_daemon;
-extern int dns_restart_on_crash;
-extern size_t dns_socket_buff_size;
-extern int dns_ping_cap_force_enable;
+	char user[DNS_CONF_USERNAME_LEN];
+
+	char sni_proxy_ip[DNS_MAX_IPLEN];
+	int resolv_hostname;
+
+	int expand_ptr_from_address;
+
+	int dns_save_fail_packet;
+	char dns_save_fail_packet_dir[DNS_MAX_PATH];
+	char dns_resolv_file[DNS_MAX_PATH];
+
+	int dns_no_pidfile;
+	int dns_no_daemon;
+	int dns_restart_on_crash;
+	size_t dns_socket_buff_size;
+};
+extern struct dns_config dns_conf;
 
 
 void dns_server_load_exit(void);
 void dns_server_load_exit(void);
 
 

+ 51 - 51
src/dns_server.c

@@ -552,7 +552,7 @@ static int _dns_server_get_reply_ttl(struct dns_request *request, int ttl)
 {
 {
 	int reply_ttl = ttl;
 	int reply_ttl = ttl;
 
 
-	if ((request->passthrough == 0 || request->passthrough == 2) && dns_conf_cachesize > 0 &&
+	if ((request->passthrough == 0 || request->passthrough == 2) && dns_conf.cachesize > 0 &&
 		request->check_order_list->orders[0].type != DOMAIN_CHECK_NONE) {
 		request->check_order_list->orders[0].type != DOMAIN_CHECK_NONE) {
 		reply_ttl = request->conf->dns_serve_expired_reply_ttl;
 		reply_ttl = request->conf->dns_serve_expired_reply_ttl;
 		if (reply_ttl < 2) {
 		if (reply_ttl < 2) {
@@ -853,7 +853,7 @@ static void _dns_server_audit_log(struct dns_server_post_context *context)
 	struct dns_request *request = context->request;
 	struct dns_request *request = context->request;
 	int has_soa = request->has_soa;
 	int has_soa = request->has_soa;
 
 
-	if (dns_audit == NULL || !dns_conf_audit_enable || context->do_audit == 0) {
+	if (dns_audit == NULL || !dns_conf.audit_enable || context->do_audit == 0) {
 		return;
 		return;
 	}
 	}
 
 
@@ -927,7 +927,7 @@ static void _dns_server_audit_log(struct dns_server_post_context *context)
 	}
 	}
 
 
 	if (has_soa && ip_num == 0) {
 	if (has_soa && ip_num == 0) {
-		if (!dns_conf_audit_log_SOA) {
+		if (!dns_conf.audit_log_SOA) {
 			return;
 			return;
 		}
 		}
 
 
@@ -945,7 +945,7 @@ static void _dns_server_audit_log(struct dns_server_post_context *context)
 		safe_strncpy(req_host, "API", MAX_IP_LEN);
 		safe_strncpy(req_host, "API", MAX_IP_LEN);
 	}
 	}
 
 
-	if (dns_conf_audit_syslog == 0) {
+	if (dns_conf.audit_syslog == 0) {
 		snprintf(req_time, sizeof(req_time), "[%.4d-%.2d-%.2d %.2d:%.2d:%.2d,%.3d] ", tm.year, tm.mon, tm.mday, tm.hour,
 		snprintf(req_time, sizeof(req_time), "[%.4d-%.2d-%.2d %.2d:%.2d:%.2d,%.3d] ", tm.year, tm.mon, tm.mday, tm.hour,
 				 tm.min, tm.sec, tm.usec / 1000);
 				 tm.min, tm.sec, tm.usec / 1000);
 	}
 	}
@@ -3100,8 +3100,8 @@ static struct dns_request *_dns_server_new_request(void)
 	request->qclass = DNS_C_IN;
 	request->qclass = DNS_C_IN;
 	request->result_callback = NULL;
 	request->result_callback = NULL;
 	request->conf = dns_server_get_default_rule_group();
 	request->conf = dns_server_get_default_rule_group();
-	request->check_order_list = &dns_conf_default_check_orders;
-	request->response_mode = dns_conf_default_response_mode;
+	request->check_order_list = &dns_conf.default_check_orders;
+	request->response_mode = dns_conf.default_response_mode;
 	request->query_time = get_utc_time_ms();
 	request->query_time = get_utc_time_ms();
 	INIT_LIST_HEAD(&request->list);
 	INIT_LIST_HEAD(&request->list);
 	INIT_LIST_HEAD(&request->pending_list);
 	INIT_LIST_HEAD(&request->pending_list);
@@ -3458,7 +3458,7 @@ static struct dns_client_rules *_dns_server_get_client_rules_by_mac(uint8_t *net
 	int ret = 0;
 	int ret = 0;
 	struct neighbor_enum_args args;
 	struct neighbor_enum_args args;
 
 
-	if (dns_conf_client_rule.mac_num == 0) {
+	if (dns_conf.client_rule.mac_num == 0) {
 		return NULL;
 		return NULL;
 	}
 	}
 
 
@@ -3539,7 +3539,7 @@ static struct dns_client_rules *_dns_server_get_client_rules(struct sockaddr_sto
 		return NULL;
 		return NULL;
 	}
 	}
 
 
-	node = radix_search_best(dns_conf_client_rule.rule, &prefix);
+	node = radix_search_best(dns_conf.client_rule.rule, &prefix);
 	if (node == NULL) {
 	if (node == NULL) {
 		return NULL;
 		return NULL;
 	}
 	}
@@ -4857,7 +4857,7 @@ static int _dns_server_reply_request_eth_ip(struct dns_request *request)
 	}
 	}
 
 
 	request->rcode = DNS_RC_NOERROR;
 	request->rcode = DNS_RC_NOERROR;
-	request->ip_ttl = dns_conf_local_ttl;
+	request->ip_ttl = dns_conf.local_ttl;
 	request->has_ip = 1;
 	request->has_ip = 1;
 
 
 	struct dns_server_post_context context;
 	struct dns_server_post_context context;
@@ -4899,7 +4899,7 @@ errout:
 
 
 static void _dns_server_set_request_mdns(struct dns_request *request)
 static void _dns_server_set_request_mdns(struct dns_request *request)
 {
 {
-	if (dns_conf_mdns_lookup != 1) {
+	if (dns_conf.mdns_lookup != 1) {
 		return;
 		return;
 	}
 	}
 
 
@@ -5109,7 +5109,7 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
 		goto out;
 		goto out;
 	}
 	}
 
 
-	if (dns_conf_local_ptr_enable == 0) {
+	if (dns_conf.local_ptr_enable == 0) {
 		goto out;
 		goto out;
 	}
 	}
 
 
@@ -5132,7 +5132,7 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
 		goto out;
 		goto out;
 	}
 	}
 
 
-	if (dns_conf_mdns_lookup) {
+	if (dns_conf.mdns_lookup) {
 		_dns_server_set_request_mdns(request);
 		_dns_server_set_request_mdns(request);
 		goto errout;
 		goto errout;
 	}
 	}
@@ -5154,7 +5154,7 @@ out:
 	}
 	}
 
 
 	char full_hostname[DNS_MAX_CNAME_LEN];
 	char full_hostname[DNS_MAX_CNAME_LEN];
-	if (dns_conf_server_name[0] == 0) {
+	if (dns_conf.server_name[0] == 0) {
 		char hostname[DNS_MAX_CNAME_LEN];
 		char hostname[DNS_MAX_CNAME_LEN];
 		char domainname[DNS_MAX_CNAME_LEN];
 		char domainname[DNS_MAX_CNAME_LEN];
 
 
@@ -5182,7 +5182,7 @@ out:
 		}
 		}
 	} else {
 	} else {
 		/* return configured server name */
 		/* return configured server name */
-		safe_strncpy(full_hostname, dns_conf_server_name, DNS_MAX_CNAME_LEN);
+		safe_strncpy(full_hostname, dns_conf.server_name, DNS_MAX_CNAME_LEN);
 	}
 	}
 
 
 	request->has_ptr = 1;
 	request->has_ptr = 1;
@@ -5205,8 +5205,8 @@ static int _dns_server_get_local_ttl(struct dns_request *request)
 		}
 		}
 	}
 	}
 
 
-	if (dns_conf_local_ttl > 0) {
-		return dns_conf_local_ttl;
+	if (dns_conf.local_ttl > 0) {
+		return dns_conf.local_ttl;
 	}
 	}
 
 
 	if (request->conf->dns_rr_ttl > 0) {
 	if (request->conf->dns_rr_ttl > 0) {
@@ -5426,7 +5426,7 @@ static void _dns_server_get_domain_rule_by_domain_ext(struct dns_conf_group *con
 	/* find domain rule */
 	/* find domain rule */
 	art_substring_walk(&conf->domain_rule.tree, (unsigned char *)domain_key, domain_len, _dns_server_get_rules,
 	art_substring_walk(&conf->domain_rule.tree, (unsigned char *)domain_key, domain_len, _dns_server_get_rules,
 					   &walk_args);
 					   &walk_args);
-	if (likely(dns_conf_log_level > TLOG_DEBUG) || out_log == 0) {
+	if (likely(dns_conf.log_level > TLOG_DEBUG) || out_log == 0) {
 		return;
 		return;
 	}
 	}
 
 
@@ -6437,11 +6437,11 @@ void dns_server_check_ipv6_ready(void)
 	static int is_tcp_check_set;
 	static int is_tcp_check_set;
 
 
 	if (do_get_conf == 0) {
 	if (do_get_conf == 0) {
-		if (dns_conf_has_icmp_check == 1) {
+		if (dns_conf.has_icmp_check == 1) {
 			is_icmp_check_set = 1;
 			is_icmp_check_set = 1;
 		}
 		}
 
 
-		if (dns_conf_has_tcp_check == 1) {
+		if (dns_conf.has_tcp_check == 1) {
 			is_tcp_check_set = 1;
 			is_tcp_check_set = 1;
 		}
 		}
 
 
@@ -6491,7 +6491,7 @@ static void _dns_server_request_set_client(struct dns_request *request, struct d
 static int _dns_server_request_set_client_rules(struct dns_request *request, struct dns_client_rules *client_rule)
 static int _dns_server_request_set_client_rules(struct dns_request *request, struct dns_client_rules *client_rule)
 {
 {
 	if (client_rule == NULL) {
 	if (client_rule == NULL) {
-		if (_dns_server_has_bind_flag(request, BIND_FLAG_ACL) == 0 || dns_conf_acl_enable) {
+		if (_dns_server_has_bind_flag(request, BIND_FLAG_ACL) == 0 || dns_conf.acl_enable) {
 			request->send_tick = get_tick_count();
 			request->send_tick = get_tick_count();
 			request->rcode = DNS_RC_REFUSED;
 			request->rcode = DNS_RC_REFUSED;
 			request->no_cache = 1;
 			request->no_cache = 1;
@@ -6718,7 +6718,7 @@ static int _dns_server_process_host(struct dns_request *request)
 	}
 	}
 
 
 	request->rcode = DNS_RC_NOERROR;
 	request->rcode = DNS_RC_NOERROR;
-	request->ip_ttl = dns_conf_local_ttl;
+	request->ip_ttl = dns_conf.local_ttl;
 	request->has_ip = 1;
 	request->has_ip = 1;
 
 
 	struct dns_server_post_context context;
 	struct dns_server_post_context context;
@@ -6763,7 +6763,7 @@ static int _dns_server_mdns_query_setup(struct dns_request *request, const char
 										char **request_domain, char *domain_buffer, int domain_buffer_len)
 										char **request_domain, char *domain_buffer, int domain_buffer_len)
 {
 {
 
 
-	if (dns_conf_mdns_lookup != 1) {
+	if (dns_conf.mdns_lookup != 1) {
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -7203,8 +7203,8 @@ static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *in
 	if (decode_len < 0) {
 	if (decode_len < 0) {
 		tlog(TLOG_DEBUG, "decode failed.\n");
 		tlog(TLOG_DEBUG, "decode failed.\n");
 		ret = RECV_ERROR_INVALID_PACKET;
 		ret = RECV_ERROR_INVALID_PACKET;
-		if (dns_save_fail_packet) {
-			dns_packet_save(dns_save_fail_packet_dir, "server", name, inpacket, inpacket_len);
+		if (dns_conf.dns_save_fail_packet) {
+			dns_packet_save(dns_conf.dns_save_fail_packet_dir, "server", name, inpacket, inpacket_len);
 		}
 		}
 		goto errout;
 		goto errout;
 	}
 	}
@@ -7241,12 +7241,12 @@ static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *in
 	tlog(TLOG_DEBUG, "query %s from %s, qtype: %d, id: %d, query-num: %ld", request->domain, name, request->qtype,
 	tlog(TLOG_DEBUG, "query %s from %s, qtype: %d, id: %d, query-num: %ld", request->domain, name, request->qtype,
 		 request->id, atomic_read(&server.request_num));
 		 request->id, atomic_read(&server.request_num));
 
 
-	if (atomic_read(&server.request_num) > dns_conf_max_query_limit && dns_conf_max_query_limit > 0) {
+	if (atomic_read(&server.request_num) > dns_conf.max_query_limit && dns_conf.max_query_limit > 0) {
 		static time_t last_log_time = 0;
 		static time_t last_log_time = 0;
 		time_t now = time(NULL);
 		time_t now = time(NULL);
 		if (now - last_log_time > 120) {
 		if (now - last_log_time > 120) {
 			last_log_time = now;
 			last_log_time = now;
-			tlog(TLOG_WARN, "maximum number of dns queries reached, max: %d", dns_conf_max_query_limit);
+			tlog(TLOG_WARN, "maximum number of dns queries reached, max: %d", dns_conf.max_query_limit);
 		}
 		}
 		request->rcode = DNS_RC_REFUSED;
 		request->rcode = DNS_RC_REFUSED;
 		ret = 0;
 		ret = 0;
@@ -7515,7 +7515,7 @@ static int _dns_server_tcp_accept(struct dns_server_conn_tcp_server *tcpserver,
 	tcpclient->head.server_flags = tcpserver->head.server_flags;
 	tcpclient->head.server_flags = tcpserver->head.server_flags;
 	tcpclient->head.dns_group = tcpserver->head.dns_group;
 	tcpclient->head.dns_group = tcpserver->head.dns_group;
 	tcpclient->head.ipset_nftset_rule = tcpserver->head.ipset_nftset_rule;
 	tcpclient->head.ipset_nftset_rule = tcpserver->head.ipset_nftset_rule;
-	tcpclient->conn_idle_timeout = dns_conf_tcp_idle_time;
+	tcpclient->conn_idle_timeout = dns_conf.tcp_idle_time;
 
 
 	atomic_set(&tcpclient->head.refcnt, 0);
 	atomic_set(&tcpclient->head.refcnt, 0);
 	memcpy(&tcpclient->addr, &addr, addr_len);
 	memcpy(&tcpclient->addr, &addr, addr_len);
@@ -8143,7 +8143,7 @@ static int _dns_server_tls_accept(struct dns_server_conn_tls_server *tls_server,
 	tls_client->tcp.head.server_flags = tls_server->head.server_flags;
 	tls_client->tcp.head.server_flags = tls_server->head.server_flags;
 	tls_client->tcp.head.dns_group = tls_server->head.dns_group;
 	tls_client->tcp.head.dns_group = tls_server->head.dns_group;
 	tls_client->tcp.head.ipset_nftset_rule = tls_server->head.ipset_nftset_rule;
 	tls_client->tcp.head.ipset_nftset_rule = tls_server->head.ipset_nftset_rule;
-	tls_client->tcp.conn_idle_timeout = dns_conf_tcp_idle_time;
+	tls_client->tcp.conn_idle_timeout = dns_conf.tcp_idle_time;
 
 
 	atomic_set(&tls_client->tcp.head.refcnt, 0);
 	atomic_set(&tls_client->tcp.head.refcnt, 0);
 	memcpy(&tls_client->tcp.addr, &addr, addr_len);
 	memcpy(&tls_client->tcp.addr, &addr, addr_len);
@@ -8455,9 +8455,9 @@ static void _dns_server_check_need_exit(void)
 static void _dns_server_save_cache_to_file(void)
 static void _dns_server_save_cache_to_file(void)
 {
 {
 	time_t now;
 	time_t now;
-	int check_time = dns_conf_cache_checkpoint_time;
+	int check_time = dns_conf.cache_checkpoint_time;
 
 
-	if (dns_conf_cache_persist == 0 || dns_conf_cachesize <= 0 || dns_conf_cache_checkpoint_time <= 0) {
+	if (dns_conf.cache_persist == 0 || dns_conf.cachesize <= 0 || dns_conf.cache_checkpoint_time <= 0) {
 		return;
 		return;
 	}
 	}
 
 
@@ -8816,9 +8816,9 @@ static int _dns_create_socket(const char *host_ip, int type)
 	}
 	}
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
-	if (dns_socket_buff_size > 0) {
-		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
-		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_socket_buff_size, sizeof(dns_socket_buff_size));
+	if (dns_conf.dns_socket_buff_size > 0) {
+		setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
+		setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &dns_conf.dns_socket_buff_size, sizeof(dns_conf.dns_socket_buff_size));
 	}
 	}
 
 
 	if (ifname != NULL) {
 	if (ifname != NULL) {
@@ -9057,8 +9057,8 @@ static int _dns_server_socket(void)
 {
 {
 	int i = 0;
 	int i = 0;
 
 
-	for (i = 0; i < dns_conf_bind_ip_num; i++) {
-		struct dns_bind_ip *bind_ip = &dns_conf_bind_ip[i];
+	for (i = 0; i < dns_conf.bind_ip_num; i++) {
+		struct dns_bind_ip *bind_ip = &dns_conf.bind_ip[i];
 		tlog(TLOG_INFO, "bind ip %s, type %d", bind_ip->ip, bind_ip->type);
 		tlog(TLOG_INFO, "bind ip %s, type %d", bind_ip->ip, bind_ip->type);
 
 
 		switch (bind_ip->type) {
 		switch (bind_ip->type) {
@@ -9104,32 +9104,32 @@ static int _dns_server_audit_init(void)
 	char *audit_file = SMARTDNS_AUDIT_FILE;
 	char *audit_file = SMARTDNS_AUDIT_FILE;
 	unsigned int tlog_flag = 0;
 	unsigned int tlog_flag = 0;
 
 
-	if (dns_conf_audit_enable == 0) {
+	if (dns_conf.audit_enable == 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
-	if (dns_conf_audit_file[0] != 0) {
-		audit_file = dns_conf_audit_file;
+	if (dns_conf.audit_file[0] != 0) {
+		audit_file = dns_conf.audit_file;
 	}
 	}
 
 
-	if (dns_conf_audit_syslog) {
+	if (dns_conf.audit_syslog) {
 		tlog_flag |= TLOG_SEGMENT;
 		tlog_flag |= TLOG_SEGMENT;
 	}
 	}
 
 
-	dns_audit = tlog_open(audit_file, dns_conf_audit_size, dns_conf_audit_num, 0, tlog_flag);
+	dns_audit = tlog_open(audit_file, dns_conf.audit_size, dns_conf.audit_num, 0, tlog_flag);
 	if (dns_audit == NULL) {
 	if (dns_audit == NULL) {
 		return -1;
 		return -1;
 	}
 	}
 
 
-	if (dns_conf_audit_syslog) {
+	if (dns_conf.audit_syslog) {
 		tlog_reg_output_func(dns_audit, _dns_server_audit_syslog);
 		tlog_reg_output_func(dns_audit, _dns_server_audit_syslog);
 	}
 	}
 
 
-	if (dns_conf_audit_file_mode > 0) {
-		tlog_set_permission(dns_audit, dns_conf_audit_file_mode, dns_conf_audit_file_mode);
+	if (dns_conf.audit_file_mode > 0) {
+		tlog_set_permission(dns_audit, dns_conf.audit_file_mode, dns_conf.audit_file_mode);
 	}
 	}
 
 
-	if (dns_conf_audit_console != 0) {
+	if (dns_conf.audit_console != 0) {
 		tlog_logscreen(dns_audit, 1);
 		tlog_logscreen(dns_audit, 1);
 	}
 	}
 
 
@@ -9199,7 +9199,7 @@ static int _dns_server_local_addr_cache_init(void)
 	server.local_addr_cache.fd_netlink = -1;
 	server.local_addr_cache.fd_netlink = -1;
 	server.local_addr_cache.addr = NULL;
 	server.local_addr_cache.addr = NULL;
 
 
-	if (dns_conf_local_ptr_enable == 0) {
+	if (dns_conf.local_ptr_enable == 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -9256,21 +9256,21 @@ errout:
 
 
 static int _dns_server_cache_init(void)
 static int _dns_server_cache_init(void)
 {
 {
-	if (dns_cache_init(dns_conf_cachesize, dns_conf_cache_max_memsize, _dns_server_cache_expired) != 0) {
+	if (dns_cache_init(dns_conf.cachesize, dns_conf.cache_max_memsize, _dns_server_cache_expired) != 0) {
 		tlog(TLOG_ERROR, "init cache failed.");
 		tlog(TLOG_ERROR, "init cache failed.");
 		return -1;
 		return -1;
 	}
 	}
 
 
 	const char *dns_cache_file = dns_conf_get_cache_dir();
 	const char *dns_cache_file = dns_conf_get_cache_dir();
-	if (dns_conf_cache_persist == 2) {
+	if (dns_conf.cache_persist == 2) {
 		uint64_t freespace = get_free_space(dns_cache_file);
 		uint64_t freespace = get_free_space(dns_cache_file);
 		if (freespace >= CACHE_AUTO_ENABLE_SIZE) {
 		if (freespace >= CACHE_AUTO_ENABLE_SIZE) {
 			tlog(TLOG_INFO, "auto enable cache persist.");
 			tlog(TLOG_INFO, "auto enable cache persist.");
-			dns_conf_cache_persist = 1;
+			dns_conf.cache_persist = 1;
 		}
 		}
 	}
 	}
 
 
-	if (dns_conf_cachesize <= 0 || dns_conf_cache_persist == 0) {
+	if (dns_conf.cachesize <= 0 || dns_conf.cache_persist == 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -9286,7 +9286,7 @@ static int _dns_server_cache_save(int check_lock)
 {
 {
 	const char *dns_cache_file = dns_conf_get_cache_dir();
 	const char *dns_cache_file = dns_conf_get_cache_dir();
 
 
-	if (dns_conf_cache_persist == 0 || dns_conf_cachesize <= 0) {
+	if (dns_conf.cache_persist == 0 || dns_conf.cachesize <= 0) {
 		if (access(dns_cache_file, F_OK) == 0) {
 		if (access(dns_cache_file, F_OK) == 0) {
 			unlink(dns_cache_file);
 			unlink(dns_cache_file);
 		}
 		}
@@ -9392,7 +9392,7 @@ int dns_server_init(void)
 
 
 	if (_dns_server_local_addr_cache_init() != 0) {
 	if (_dns_server_local_addr_cache_init() != 0) {
 		tlog(TLOG_WARN, "init local addr cache failed, disable local ptr.");
 		tlog(TLOG_WARN, "init local addr cache failed, disable local ptr.");
-		dns_conf_local_ptr_enable = 0;
+		dns_conf.local_ptr_enable = 0;
 	}
 	}
 
 
 	if (_dns_server_neighbor_cache_init() != 0) {
 	if (_dns_server_neighbor_cache_init() != 0) {

+ 4 - 4
src/lib/nftset.c

@@ -295,7 +295,7 @@ static int _nftset_socket_send(void *msg, int msg_len)
 {
 {
 	char recvbuff[1024];
 	char recvbuff[1024];
 
 
-	if (dns_conf_nftset_debug_enable == 0) {
+	if (dns_conf.nftset_debug_enable == 0) {
 		return _nftset_socket_request(msg, msg_len, NULL, 0);
 		return _nftset_socket_request(msg, msg_len, NULL, 0);
 	}
 	}
 
 
@@ -372,7 +372,7 @@ static int _nftset_del_element(int nffamily, const char *table_name, const char
 	req->h.nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_DELSETELEM;
 	req->h.nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_DELSETELEM;
 	req->h.nlmsg_seq = time(NULL);
 	req->h.nlmsg_seq = time(NULL);
 
 
-	if (dns_conf_nftset_debug_enable) {
+	if (dns_conf.nftset_debug_enable) {
 		req->h.nlmsg_flags |= NLM_F_ACK;
 		req->h.nlmsg_flags |= NLM_F_ACK;
 	}
 	}
 
 
@@ -422,7 +422,7 @@ static int _nftset_add_element(int nffamily, const char *table_name, const char
 	req->h.nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_NEWSETELEM;
 	req->h.nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | NFT_MSG_NEWSETELEM;
 	req->h.nlmsg_seq = time(NULL);
 	req->h.nlmsg_seq = time(NULL);
 
 
-	if (dns_conf_nftset_debug_enable) {
+	if (dns_conf.nftset_debug_enable) {
 		req->h.nlmsg_flags |= NLM_F_ACK;
 		req->h.nlmsg_flags |= NLM_F_ACK;
 	}
 	}
 
 
@@ -562,7 +562,7 @@ int nftset_add(const char *familyname, const char *tablename, const char *setnam
 	if (ret == 0) {
 	if (ret == 0) {
 		ret = _nftset_process_setflags(flags, addr, addr_len, &timeout, &addr_end, &addr_end_len);
 		ret = _nftset_process_setflags(flags, addr, addr_len, &timeout, &addr_end, &addr_end_len);
 		if (ret != 0) {
 		if (ret != 0) {
-			if (dns_conf_nftset_debug_enable) {
+			if (dns_conf.nftset_debug_enable) {
 				tlog(TLOG_ERROR, "nftset add failed, family:%s, table:%s, set:%s, error:%s", familyname, tablename,
 				tlog(TLOG_ERROR, "nftset add failed, family:%s, table:%s, set:%s, error:%s", familyname, tablename,
 					 setname, "ip is invalid");
 					 setname, "ip is invalid");
 			}
 			}

+ 52 - 51
src/smartdns.c

@@ -113,7 +113,8 @@ static void _smartdns_get_version(char *str_ver, int str_ver_len)
 #endif
 #endif
 }
 }
 
 
-const char *smartdns_version() {
+const char *smartdns_version()
+{
 	static char str_ver[256] = {0};
 	static char str_ver[256] = {0};
 	if (str_ver[0] == 0) {
 	if (str_ver[0] == 0) {
 		_smartdns_get_version(str_ver, sizeof(str_ver));
 		_smartdns_get_version(str_ver, sizeof(str_ver));
@@ -167,11 +168,11 @@ static int _smartdns_load_from_resolv_file(const char *resolv_file)
 			port = DEFAULT_DNS_PORT;
 			port = DEFAULT_DNS_PORT;
 		}
 		}
 
 
-		safe_strncpy(dns_conf_servers[dns_conf_server_num].server, ns_ip, DNS_MAX_IPLEN);
-		dns_conf_servers[dns_conf_server_num].port = port;
-		dns_conf_servers[dns_conf_server_num].type = DNS_SERVER_UDP;
-		dns_conf_servers[dns_conf_server_num].set_mark = -1;
-		dns_conf_server_num++;
+		safe_strncpy(dns_conf.servers[dns_conf.server_num].server, ns_ip, DNS_MAX_IPLEN);
+		dns_conf.servers[dns_conf.server_num].port = port;
+		dns_conf.servers[dns_conf.server_num].type = DNS_SERVER_UDP;
+		dns_conf.servers[dns_conf.server_num].set_mark = -1;
+		dns_conf.server_num++;
 		ret = 0;
 		ret = 0;
 	}
 	}
 
 
@@ -182,7 +183,7 @@ static int _smartdns_load_from_resolv_file(const char *resolv_file)
 
 
 static int _smartdns_load_from_resolv(void)
 static int _smartdns_load_from_resolv(void)
 {
 {
-	return _smartdns_load_from_resolv_file(dns_resolv_file);
+	return _smartdns_load_from_resolv_file(dns_conf.dns_resolv_file);
 }
 }
 
 
 static int _smartdns_load_from_default_resolv(void)
 static int _smartdns_load_from_default_resolv(void)
@@ -269,17 +270,17 @@ static int _smartdns_add_servers(void)
 	struct dns_servers *server = NULL;
 	struct dns_servers *server = NULL;
 	struct client_dns_server_flags flags;
 	struct client_dns_server_flags flags;
 
 
-	for (i = 0; i < (unsigned int)dns_conf_server_num; i++) {
-		if (_smartdns_prepare_server_flags(&flags, &dns_conf_servers[i]) != 0) {
-			tlog(TLOG_ERROR, "prepare server flags failed, %s:%d", dns_conf_servers[i].server,
-				 dns_conf_servers[i].port);
+	for (i = 0; i < (unsigned int)dns_conf.server_num; i++) {
+		if (_smartdns_prepare_server_flags(&flags, &dns_conf.servers[i]) != 0) {
+			tlog(TLOG_ERROR, "prepare server flags failed, %s:%d", dns_conf.servers[i].server,
+				 dns_conf.servers[i].port);
 			return -1;
 			return -1;
 		}
 		}
 
 
-		ret = dns_client_add_server(dns_conf_servers[i].server, dns_conf_servers[i].port, dns_conf_servers[i].type,
+		ret = dns_client_add_server(dns_conf.servers[i].server, dns_conf.servers[i].port, dns_conf.servers[i].type,
 									&flags);
 									&flags);
 		if (ret != 0) {
 		if (ret != 0) {
-			tlog(TLOG_ERROR, "add server failed, %s:%d", dns_conf_servers[i].server, dns_conf_servers[i].port);
+			tlog(TLOG_ERROR, "add server failed, %s:%d", dns_conf.servers[i].server, dns_conf.servers[i].port);
 			return -1;
 			return -1;
 		}
 		}
 	}
 	}
@@ -378,21 +379,21 @@ static int _smartdns_create_cert(void)
 	uid_t uid = 0;
 	uid_t uid = 0;
 	gid_t gid = 0;
 	gid_t gid = 0;
 
 
-	if (dns_conf_need_cert == 0) {
+	if (dns_conf.need_cert == 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
-	if (dns_conf_bind_ca_file[0] != 0 && dns_conf_bind_ca_key_file[0] != 0) {
+	if (dns_conf.bind_ca_file[0] != 0 && dns_conf.bind_ca_key_file[0] != 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
-	conf_get_conf_fullpath("smartdns-cert.pem", dns_conf_bind_ca_file, sizeof(dns_conf_bind_ca_file));
-	conf_get_conf_fullpath("smartdns-key.pem", dns_conf_bind_ca_key_file, sizeof(dns_conf_bind_ca_key_file));
-	if (access(dns_conf_bind_ca_file, F_OK) == 0 && access(dns_conf_bind_ca_key_file, F_OK) == 0) {
+	conf_get_conf_fullpath("smartdns-cert.pem", dns_conf.bind_ca_file, sizeof(dns_conf.bind_ca_file));
+	conf_get_conf_fullpath("smartdns-key.pem", dns_conf.bind_ca_key_file, sizeof(dns_conf.bind_ca_key_file));
+	if (access(dns_conf.bind_ca_file, F_OK) == 0 && access(dns_conf.bind_ca_key_file, F_OK) == 0) {
 		return 0;
 		return 0;
 	}
 	}
 
 
-	if (generate_cert_key(dns_conf_bind_ca_key_file, dns_conf_bind_ca_file, NULL, 365 * 3) != 0) {
+	if (generate_cert_key(dns_conf.bind_ca_key_file, dns_conf.bind_ca_file, NULL, 365 * 3) != 0) {
 		tlog(TLOG_WARN, "Generate default ssl cert and key file failed. %s", strerror(errno));
 		tlog(TLOG_WARN, "Generate default ssl cert and key file failed. %s", strerror(errno));
 		return -1;
 		return -1;
 	}
 	}
@@ -403,16 +404,16 @@ static int _smartdns_create_cert(void)
 		return 0;
 		return 0;
 	}
 	}
 
 
-	unused = chown(dns_conf_bind_ca_file, uid, gid);
-	unused = chown(dns_conf_bind_ca_key_file, uid, gid);
+	unused = chown(dns_conf.bind_ca_file, uid, gid);
+	unused = chown(dns_conf.bind_ca_key_file, uid, gid);
 
 
 	return 0;
 	return 0;
 }
 }
 
 
 int smartdns_get_cert(char *key, char *cert)
 int smartdns_get_cert(char *key, char *cert)
 {
 {
-	if (dns_conf_need_cert == 0) {
-		dns_conf_need_cert = 1;
+	if (dns_conf.need_cert == 0) {
+		dns_conf.need_cert = 1;
 	}
 	}
 
 
 	if (_smartdns_create_cert() != 0) {
 	if (_smartdns_create_cert() != 0) {
@@ -421,11 +422,11 @@ int smartdns_get_cert(char *key, char *cert)
 	}
 	}
 
 
 	if (key != NULL) {
 	if (key != NULL) {
-		safe_strncpy(key, dns_conf_bind_ca_key_file, PATH_MAX);
+		safe_strncpy(key, dns_conf.bind_ca_key_file, PATH_MAX);
 	}
 	}
 
 
 	if (cert != NULL) {
 	if (cert != NULL) {
-		safe_strncpy(cert, dns_conf_bind_ca_file, PATH_MAX);
+		safe_strncpy(cert, dns_conf.bind_ca_file, PATH_MAX);
 	}
 	}
 
 
 	return 0;
 	return 0;
@@ -456,8 +457,8 @@ static const char *_smartdns_log_path(void)
 {
 {
 	char *logfile = SMARTDNS_LOG_FILE;
 	char *logfile = SMARTDNS_LOG_FILE;
 
 
-	if (dns_conf_log_file[0] != 0) {
-		logfile = dns_conf_log_file;
+	if (dns_conf.log_file[0] != 0) {
+		logfile = dns_conf.log_file;
 	}
 	}
 
 
 	return logfile;
 	return logfile;
@@ -505,7 +506,7 @@ static int _smartdns_init_log(void)
 	}
 	}
 
 
 	safe_strncpy(logdir, _smartdns_log_path(), PATH_MAX);
 	safe_strncpy(logdir, _smartdns_log_path(), PATH_MAX);
-	if (verbose_screen != 0 || dns_conf_log_console != 0 || access(dir_name(logdir), W_OK) != 0) {
+	if (verbose_screen != 0 || dns_conf.log_console != 0 || access(dir_name(logdir), W_OK) != 0) {
 		enable_log_screen = 1;
 		enable_log_screen = 1;
 	}
 	}
 
 
@@ -514,12 +515,12 @@ static int _smartdns_init_log(void)
 		tlog_flag |= TLOG_SCREEN_COLOR;
 		tlog_flag |= TLOG_SCREEN_COLOR;
 	}
 	}
 
 
-	if (dns_conf_log_syslog) {
+	if (dns_conf.log_syslog) {
 		tlog_flag |= TLOG_SEGMENT;
 		tlog_flag |= TLOG_SEGMENT;
 		tlog_flag |= TLOG_FORMAT_NO_PREFIX;
 		tlog_flag |= TLOG_FORMAT_NO_PREFIX;
 	}
 	}
 
 
-	ret = tlog_init(logfile, dns_conf_log_size, dns_conf_log_num, logbuffersize, tlog_flag);
+	ret = tlog_init(logfile, dns_conf.log_size, dns_conf.log_num, logbuffersize, tlog_flag);
 	if (ret != 0) {
 	if (ret != 0) {
 		tlog(TLOG_ERROR, "start tlog failed.\n");
 		tlog(TLOG_ERROR, "start tlog failed.\n");
 		goto errout;
 		goto errout;
@@ -529,13 +530,13 @@ static int _smartdns_init_log(void)
 		tlog_setlogscreen(1);
 		tlog_setlogscreen(1);
 	}
 	}
 
 
-	if (dns_conf_log_syslog) {
+	if (dns_conf.log_syslog) {
 		tlog_reg_log_output_func(_smartdns_tlog_output_syslog_callback, NULL);
 		tlog_reg_log_output_func(_smartdns_tlog_output_syslog_callback, NULL);
 	}
 	}
 
 
-	tlog_setlevel(dns_conf_log_level);
-	if (dns_conf_log_file_mode > 0) {
-		tlog_set_permission(tlog_get_root(), dns_conf_log_file_mode, dns_conf_log_file_mode);
+	tlog_setlevel(dns_conf.log_level);
+	if (dns_conf.log_file_mode > 0) {
+		tlog_set_permission(tlog_get_root(), dns_conf.log_file_mode, dns_conf.log_file_mode);
 	}
 	}
 
 
 	return 0;
 	return 0;
@@ -549,14 +550,14 @@ static int _smartdns_init_load_from_resolv(void)
 	int ret = 0;
 	int ret = 0;
 	int i = 0;
 	int i = 0;
 
 
-	for (i = 0; i < 180 && dns_conf_server_num <= 0; i++) {
+	for (i = 0; i < 180 && dns_conf.server_num <= 0; i++) {
 		ret = _smartdns_load_from_resolv();
 		ret = _smartdns_load_from_resolv();
 		if (ret == 0) {
 		if (ret == 0) {
 			continue;
 			continue;
 		}
 		}
 
 
 		/* try load from default resolv.conf file */
 		/* try load from default resolv.conf file */
-		if (i > 30 && strncmp(dns_resolv_file, DNS_RESOLV_FILE, MAX_LINE_LEN) != 0) {
+		if (i > 30 && strncmp(dns_conf.dns_resolv_file, DNS_RESOLV_FILE, MAX_LINE_LEN) != 0) {
 			ret = _smartdns_load_from_default_resolv();
 			ret = _smartdns_load_from_default_resolv();
 			if (ret == 0) {
 			if (ret == 0) {
 				continue;
 				continue;
@@ -567,7 +568,7 @@ static int _smartdns_init_load_from_resolv(void)
 		sleep(1);
 		sleep(1);
 	}
 	}
 
 
-	if (dns_conf_server_num <= 0) {
+	if (dns_conf.server_num <= 0) {
 		goto errout;
 		goto errout;
 	}
 	}
 
 
@@ -749,8 +750,8 @@ static int _smartdns_create_cache_dir(void)
 {
 {
 	int ret = create_dir_with_perm(dns_conf_get_cache_dir());
 	int ret = create_dir_with_perm(dns_conf_get_cache_dir());
 	if (ret == -2) {
 	if (ret == -2) {
-		if (dns_conf_cache_file[0] == '\0') {
-			safe_strncpy(dns_conf_cache_file, SMARTDNS_TMP_CACHE_FILE, sizeof(dns_conf_cache_file));
+		if (dns_conf.cache_file[0] == '\0') {
+			safe_strncpy(dns_conf.cache_file, SMARTDNS_TMP_CACHE_FILE, sizeof(dns_conf.cache_file));
 		}
 		}
 	} else if (ret != 0) {
 	} else if (ret != 0) {
 		return -1;
 		return -1;
@@ -780,8 +781,8 @@ static int _smartdns_create_datadir(void)
 	}
 	}
 
 
 	if (chown(data_dir, uid, gid) != 0) {
 	if (chown(data_dir, uid, gid) != 0) {
-		if (dns_conf_cache_file[0] == '\0') {
-			safe_strncpy(dns_conf_cache_file, SMARTDNS_DATA_DIR, sizeof(dns_conf_cache_file));
+		if (dns_conf.cache_file[0] == '\0') {
+			safe_strncpy(dns_conf.cache_file, SMARTDNS_DATA_DIR, sizeof(dns_conf.cache_file));
 		}
 		}
 	}
 	}
 
 
@@ -1085,11 +1086,11 @@ int smartdns_main(int argc, char *argv[])
 		goto errout;
 		goto errout;
 	}
 	}
 
 
-	if (dns_restart_on_crash && restart_when_crash == 0) {
-		return smartdns_enter_monitor_mode(argc, argv, dns_no_daemon || !is_run_as_daemon);
+	if (dns_conf.dns_restart_on_crash && restart_when_crash == 0) {
+		return smartdns_enter_monitor_mode(argc, argv, dns_conf.dns_no_daemon || !is_run_as_daemon);
 	}
 	}
 
 
-	if (dns_no_daemon || restart_when_crash) {
+	if (dns_conf.dns_no_daemon || restart_when_crash) {
 		is_run_as_daemon = 0;
 		is_run_as_daemon = 0;
 	}
 	}
 
 
@@ -1122,11 +1123,11 @@ int smartdns_main(int argc, char *argv[])
 		dir_name(pid_file_path);
 		dir_name(pid_file_path);
 
 
 		if (access(pid_file_path, W_OK) != 0) {
 		if (access(pid_file_path, W_OK) != 0) {
-			dns_no_pidfile = 1;
+			dns_conf.dns_no_pidfile = 1;
 		}
 		}
 	}
 	}
 
 
-	if (strncmp(pid_file, "-", 2) != 0 && dns_no_pidfile == 0 && create_pid_file(pid_file) != 0) {
+	if (strncmp(pid_file, "-", 2) != 0 && dns_conf.dns_no_pidfile == 0 && create_pid_file(pid_file) != 0) {
 		ret = -3;
 		ret = -3;
 		goto errout;
 		goto errout;
 	}
 	}
@@ -1150,11 +1151,11 @@ int smartdns_main(int argc, char *argv[])
 	}
 	}
 
 
 	if (is_run_as_daemon) {
 	if (is_run_as_daemon) {
-		ret = daemon_kickoff(0, dns_conf_log_console | dns_conf_audit_console | verbose_screen);
+		ret = daemon_kickoff(0, dns_conf.log_console | dns_conf.audit_console | verbose_screen);
 		if (ret != 0) {
 		if (ret != 0) {
 			goto errout;
 			goto errout;
 		}
 		}
-	} else if (dns_conf_log_console == 0 && dns_conf_audit_console == 0 && verbose_screen == 0) {
+	} else if (dns_conf.log_console == 0 && dns_conf.audit_console == 0 && verbose_screen == 0) {
 		daemon_close_stdfds();
 		daemon_close_stdfds();
 	}
 	}
 
 
@@ -1177,8 +1178,8 @@ int smartdns_main(int argc, char *argv[])
 	return ret;
 	return ret;
 errout:
 errout:
 	if (is_run_as_daemon) {
 	if (is_run_as_daemon) {
-		daemon_kickoff(ret, dns_conf_log_console | dns_conf_audit_console | verbose_screen);
-	} else if (dns_conf_log_console == 0 && dns_conf_audit_console == 0 && verbose_screen == 0) {
+		daemon_kickoff(ret, dns_conf.log_console | dns_conf.audit_console | verbose_screen);
+	} else if (dns_conf.log_console == 0 && dns_conf.audit_console == 0 && verbose_screen == 0) {
 		_smartdns_print_error_tip();
 		_smartdns_print_error_tip();
 	}
 	}
 	smartdns_test_notify(2);
 	smartdns_test_notify(2);
@@ -1213,7 +1214,7 @@ int smartdns_server_run(const char *config_file)
 		fprintf(stderr, "run failed.\n");
 		fprintf(stderr, "run failed.\n");
 		goto errout;
 		goto errout;
 	}
 	}
-	
+
 	_smartdns_exit();
 	_smartdns_exit();
 	tlog(TLOG_INFO, "smartdns exit...");
 	tlog(TLOG_INFO, "smartdns exit...");
 	return ret;
 	return ret;

+ 2 - 2
src/util.c

@@ -139,7 +139,7 @@ int get_uid_gid(uid_t *uid, gid_t *gid)
 	ssize_t bufsize = 0;
 	ssize_t bufsize = 0;
 	int ret = -1;
 	int ret = -1;
 
 
-	if (dns_conf_user[0] == '\0') {
+	if (dns_conf.user[0] == '\0') {
 		*uid = getuid();
 		*uid = getuid();
 		*gid = getgid();
 		*gid = getgid();
 		return 0;
 		return 0;
@@ -155,7 +155,7 @@ int get_uid_gid(uid_t *uid, gid_t *gid)
 		goto out;
 		goto out;
 	}
 	}
 
 
-	ret = getpwnam_r(dns_conf_user, &pwd, buf, bufsize, &result);
+	ret = getpwnam_r(dns_conf.user, &pwd, buf, bufsize, &result);
 	if (ret != 0) {
 	if (ret != 0) {
 		goto out;
 		goto out;
 	}
 	}