conf: fix local domain handling issues

This commit is contained in:
Nick Peng
2022-09-28 20:28:01 +08:00
parent a13433abac
commit ccb47ef327
2 changed files with 51 additions and 28 deletions

View File

@@ -2123,26 +2123,42 @@ static int _config_log_level(void *data, int argc, char *argv[])
static void _config_setup_smartdns_domain(void) static void _config_setup_smartdns_domain(void)
{ {
char hostname[DNS_MAX_CNAME_LEN]; char hostname[DNS_MAX_CNAME_LEN];
/* get local host name */ char domainname[DNS_MAX_CNAME_LEN];
if (getdomainname(hostname, DNS_MAX_CNAME_LEN) != 0) {
gethostname(hostname, DNS_MAX_CNAME_LEN); hostname[0] = '\0';
domainname[0] = '\0';
/* get local domain name */
if (getdomainname(domainname, DNS_MAX_CNAME_LEN - 1) == 0) {
/* check domain is valid */
if (strncmp(domainname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) {
domainname[0] = '\0';
}
} }
/* get host name again */ if (gethostname(hostname, DNS_MAX_CNAME_LEN - 1) == 0) {
if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { /* check hostname is valid */
gethostname(hostname, DNS_MAX_CNAME_LEN); if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) {
hostname[0] = '\0';
}
} }
/* if hostname is (none), return smartdns */ if (dns_conf_resolv_hostname == 1) {
if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { /* add hostname to rule table */
safe_strncpy(hostname, "smartdns", DNS_MAX_CNAME_LEN); if (hostname[0] != '\0') {
_config_domain_rule_flag_set(hostname, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
}
/* add domainname to rule table */
if (domainname[0] != '\0') {
char full_domain[DNS_MAX_CNAME_LEN];
snprintf(full_domain, DNS_MAX_CNAME_LEN, "%.64s.%.128s", hostname, domainname);
_config_domain_rule_flag_set(full_domain, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
}
} }
if (dns_conf_resolv_hostname == 1 && hostname[0] != '\0') { /* add server name to rule table */
_config_domain_rule_flag_set(hostname, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0); if (dns_conf_server_name[0] != '\0' && strncmp(dns_conf_server_name, "smartdns", DNS_MAX_CNAME_LEN - 1) != 0) {
}
if (dns_conf_server_name[0] != '\0') {
_config_domain_rule_flag_set(dns_conf_server_name, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0); _config_domain_rule_flag_set(dns_conf_server_name, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0);
} }

View File

@@ -3161,33 +3161,40 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
goto errout; goto errout;
} }
char 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) {
/* get local host name */ char hostname[DNS_MAX_CNAME_LEN];
if (getdomainname(hostname, DNS_MAX_CNAME_LEN) != 0) { char domainname[DNS_MAX_CNAME_LEN];
if (gethostname(hostname, DNS_MAX_CNAME_LEN) != 0) {
return -1; /* get local domain name */
if (getdomainname(domainname, DNS_MAX_CNAME_LEN - 1) == 0) {
/* check domain is valid */
if (strncmp(domainname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) {
domainname[0] = '\0';
} }
} }
/* get host name again */ if (gethostname(hostname, DNS_MAX_CNAME_LEN - 1) == 0) {
if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { /* check hostname is valid */
if (gethostname(hostname, DNS_MAX_CNAME_LEN) != 0) { if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) {
return -1; hostname[0] = '\0';
} }
} }
/* if hostname is (none), return smartdns */ if (hostname[0] != '\0' && domainname[0] != '\0') {
if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { snprintf(full_hostname, sizeof(full_hostname), "%.64s.%.128s", hostname, domainname);
safe_strncpy(hostname, "smartdns", DNS_MAX_CNAME_LEN); } else if (hostname[0] != '\0') {
safe_strncpy(full_hostname, hostname, DNS_MAX_CNAME_LEN);
} else {
safe_strncpy(full_hostname, "smartdns", DNS_MAX_CNAME_LEN);
} }
} else { } else {
/* return configured server name */ /* return configured server name */
safe_strncpy(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;
safe_strncpy(request->ptr_hostname, hostname, DNS_MAX_CNAME_LEN); safe_strncpy(request->ptr_hostname, full_hostname, DNS_MAX_CNAME_LEN);
freeifaddrs(ifaddr); freeifaddrs(ifaddr);
return 0; return 0;