Signed-off-by: 谢致邦 (XIE Zhibang) <yek...@red54.com> --- src/dnsmasq.h | 34 ++++++++++++++++++---------------- src/domain-match.c | 15 +++++++++++---- src/network.c | 2 +- 3 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/src/dnsmasq.h b/src/dnsmasq.h index a8937ce..7512756 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -534,23 +534,24 @@ union mysockaddr { /* The actual values here matter, since we sort on them to get records in the order - IPv6 addr, IPv4 addr, all zero return, resolvconf servers, upstream server, no-data return */ + IPv6 addr, IPv4 addr, all zero return, default server, resolvconf servers, upstream server, no-data return */ #define SERV_LITERAL_ADDRESS 1 /* addr is the answer, or NoDATA is the answer, depending on the next four flags */ #define SERV_USE_RESOLV 2 /* forward this domain in the normal way */ -#define SERV_ALL_ZEROS 4 /* return all zeros for A and AAAA */ -#define SERV_4ADDR 8 /* addr is IPv4 */ -#define SERV_6ADDR 16 /* addr is IPv6 */ -#define SERV_HAS_SOURCE 32 /* source address defined */ -#define SERV_FOR_NODOTS 64 /* server for names with no domain part only */ -#define SERV_WARNED_RECURSIVE 128 /* avoid warning spam */ -#define SERV_FROM_DBUS 256 /* 1 if source is DBus */ -#define SERV_MARK 512 /* for mark-and-delete and log code */ -#define SERV_WILDCARD 1024 /* domain has leading '*' */ -#define SERV_FROM_RESOLV 2048 /* 1 for servers from resolv, 0 for command line. */ -#define SERV_FROM_FILE 4096 /* read from --servers-file */ -#define SERV_LOOP 8192 /* server causes forwarding loop */ -#define SERV_DO_DNSSEC 16384 /* Validate DNSSEC when using this server */ -#define SERV_GOT_TCP 32768 /* Got some data from the TCP connection */ +#define SERV_DEFAULT 4 /* Use the server for default (need strict-order) */ +#define SERV_ALL_ZEROS 8 /* return all zeros for A and AAAA */ +#define SERV_4ADDR 16 /* addr is IPv4 */ +#define SERV_6ADDR 32 /* addr is IPv6 */ +#define SERV_HAS_SOURCE 64 /* source address defined */ +#define SERV_FOR_NODOTS 128 /* server for names with no domain part only */ +#define SERV_WARNED_RECURSIVE 256 /* avoid warning spam */ +#define SERV_FROM_DBUS 512 /* 1 if source is DBus */ +#define SERV_MARK 1024 /* for mark-and-delete and log code */ +#define SERV_WILDCARD 2048 /* domain has leading '*' */ +#define SERV_FROM_RESOLV 4096 /* 1 for servers from resolv, 0 for command line. */ +#define SERV_FROM_FILE 8192 /* read from --servers-file */ +#define SERV_LOOP 16384 /* server causes forwarding loop */ +#define SERV_DO_DNSSEC 32768 /* Validate DNSSEC when using this server */ +#define SERV_GOT_TCP 65536 /* Got some data from the TCP connection */ struct serverfd { int fd; @@ -573,7 +574,8 @@ struct randfd_list { struct server { - u16 flags, domain_len; + u32 flags; + u16 domain_len; char *domain; struct server *next; int serial, arrayposn; diff --git a/src/domain-match.c b/src/domain-match.c index 3ec49b8..fe2d886 100644 --- a/src/domain-match.c +++ b/src/domain-match.c @@ -528,11 +528,11 @@ static int order_qsort(const void *a, const void *b) /* Sort all literal NODATA and local IPV4 or IPV6 responses together, in a very specific order. We flip the SERV_LITERAL_ADDRESS bit - so the order is IPv6 literal, IPv4 literal, all-zero literal, - unqualified servers, upstream server, NXDOMAIN literal. */ + so the order is IPv6 literal, IPv4 literal, all-zero literal, + default server, unqualified servers, upstream server, NXDOMAIN literal. */ if (rc == 0) - rc = ((s2->flags & (SERV_LITERAL_ADDRESS | SERV_4ADDR | SERV_6ADDR | SERV_USE_RESOLV | SERV_ALL_ZEROS)) ^ SERV_LITERAL_ADDRESS) - - ((s1->flags & (SERV_LITERAL_ADDRESS | SERV_4ADDR | SERV_6ADDR | SERV_USE_RESOLV | SERV_ALL_ZEROS)) ^ SERV_LITERAL_ADDRESS); + rc = ((s2->flags & (SERV_LITERAL_ADDRESS | SERV_4ADDR | SERV_6ADDR | SERV_USE_RESOLV | SERV_ALL_ZEROS | SERV_DEFAULT)) ^ SERV_LITERAL_ADDRESS) - + ((s1->flags & (SERV_LITERAL_ADDRESS | SERV_4ADDR | SERV_6ADDR | SERV_USE_RESOLV | SERV_ALL_ZEROS | SERV_DEFAULT)) ^ SERV_LITERAL_ADDRESS); /* Finally, order by appearance in /etc/resolv.conf etc, for --strict-order */ if (rc == 0) @@ -613,6 +613,13 @@ int add_update_server(int flags, if (!domain) domain = ""; + /* server=/#/ for default server (need strict-order) */ + if (strcmp(domain, "#") == 0) + { + domain = ""; + flags |= SERV_DEFAULT; + } + /* .domain == domain, for historical reasons. */ if (*domain == '.') while (*domain == '.') domain++; diff --git a/src/network.c b/src/network.c index 6166484..3352950 100644 --- a/src/network.c +++ b/src/network.c @@ -1636,7 +1636,7 @@ void check_servers(int no_loop_check) if (++count > SERVERS_LOGGED) continue; - if (strlen(serv->domain) != 0 || (serv->flags & SERV_FOR_NODOTS)) + if (strlen(serv->domain) != 0 || (serv->flags & (SERV_FOR_NODOTS | SERV_DEFAULT))) { char *s1, *s2, *s3 = "", *s4 = ""; -- 2.34.1 _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss