[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