[Dnsmasq-discuss] [PATCH] Fix --server=/#/...... which was lost in 2.86
谢致邦 (XIE Zhibang)
Yeking at Red54.com
Sat Jul 23 10:54:04 UTC 2022
Signed-off-by: 谢致邦 (XIE Zhibang) <Yeking at 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
More information about the Dnsmasq-discuss
mailing list