It turns out I wanted to run squid with an alternative nameserver,
both as a normal user.  To support this use scenario, Squid
needed to be able to communicate with a nameserver not running
on port 53, by specifying a port in the dns_nameservers config
line:

  dns_nameservers 127.0.0.1:5353 127.0.0.1:5354

The changes are simple, and add a nice bit of
functionality when doing things like testing an upgrade of
BIND, or trying to migrate to a different nameserver.

If useful, they're attached.  Diffs are against 2.5-stable4,
but very simple.  Line numbers in the src/dns_internal.c
may be slightly different due to local modifications.

  -Dave

Index: lib/safe_inet_addr.c
===================================================================
diff -u -r1.1.1.1 -r1.2
--- lib/safe_inet_addr.c        6 Nov 2003 21:32:48 -0000       1.1.1.1
+++ lib/safe_inet_addr.c        29 Jun 2004 19:04:41 -0000      1.2
@@ -62,5 +62,47 @@
     A.s_addr = inet_addr(addrbuf);
     if (addr)
        addr->s_addr = A.s_addr;
+    return 1;
+}
+
+
+int
+safe_inet_addr_with_port(const char *buf, struct in_addr *addr, short *port)
+{
+    static char addrbuf[32];
+    int a1 = 0, a2 = 0, a3 = 0, a4 = 0, p = 0;
+    struct in_addr A;
+    char x;
+#if defined(_SQUID_HPUX_)
+    /*
+     * MIYOSHI Tsutomu <[EMAIL PROTECTED]> says scanning 'buf'
+     * causes a bus error on hppa1.1-hp-hpux9.07, so we
+     * have a broad hack for all HP systems.
+     */
+    static char buftmp[32];
+    snprintf(buftmp, 32, "%s", buf);
+    if (sscanf(buftmp, "%d.%d.%d.%d%c", &a1, &a2, &a3, &a4, &x) != 4 &&
+       sscanf(buftmp, "%d.%d.%d.%d:%d%c", &a1, &a2, &a3, &a4, &p, &x) != 5)
+#else
+    if (sscanf(buf, "%d.%d.%d.%d%c", &a1, &a2, &a3, &a4, &x) != 4 &&
+       sscanf(buf, "%d.%d.%d.%d:%d%c", &a1, &a2, &a3, &a4, &p, &x) != 5)
+#endif
+       return 0;
+    if (a1 < 0 || a1 > 255)
+       return 0;
+    if (a2 < 0 || a2 > 255)
+       return 0;
+    if (a3 < 0 || a3 > 255)
+       return 0;
+    if (a4 < 0 || a4 > 255)
+       return 0;
+    if (p < 0 || p > 65535)
+       return 0;
+    snprintf(addrbuf, 32, "%d.%d.%d.%d", a1, a2, a3, a4);
+    A.s_addr = inet_addr(addrbuf);
+    if (addr)
+       addr->s_addr = A.s_addr;
+    if (port)
+       *port = p;
     return 1;
 }

Index: include/util.h
===================================================================
diff -u -r1.1.1.1 -r1.2
--- include/util.h      6 Nov 2003 21:32:48 -0000       1.1.1.1
+++ include/util.h      29 Jun 2004 19:04:42 -0000      1.2
@@ -112,6 +112,7 @@
 
 typedef struct in_addr SIA;
 extern int safe_inet_addr(const char *, SIA *);
+extern int safe_inet_addr_with_port(const char *, SIA *, short *);
 extern time_t parse_iso3307_time(const char *buf);
 extern char *base64_decode(const char *coded);
 extern const char *base64_encode(const char *decoded);

Index: src/dns_internal.c
===================================================================
diff -u -r1.5 -r1.6
--- src/dns_internal.c  17 Nov 2003 23:34:35 -0000      1.5
+++ src/dns_internal.c  29 Jun 2004 19:04:42 -0000      1.6
@@ -102,7 +102,8 @@
 idnsAddNameserver(const char *buf)
 {
     struct in_addr A;
-    if (!safe_inet_addr(buf, &A)) {
+    short port;
+    if (!safe_inet_addr_with_port(buf, &A, &port)) {
        debug(78, 0) ("WARNING: rejecting '%s' as a name server, because it is not a 
numeric IP address\n", buf);
        return;
     }
@@ -126,7 +127,10 @@
     }
     assert(nns < nns_alloc);
     nameservers[nns].S.sin_family = AF_INET;
-    nameservers[nns].S.sin_port = htons(DOMAIN_PORT);
+    if (0 == port)
+       nameservers[nns].S.sin_port = htons(DOMAIN_PORT);
+    else
+       nameservers[nns].S.sin_port = htons(port);
     nameservers[nns].S.sin_addr.s_addr = A.s_addr;
     debug(78, 3) ("idnsAddNameserver: Added nameserver #%d: %s\n",
        nns, inet_ntoa(nameservers[nns].S.sin_addr));

Reply via email to