[PATCH] Allow multiple identical backend addresses

Tollef Fog Heen tfheen at varnish-software.com
Tue Nov 20 09:51:04 CET 2012


In some cases, lookups for a given host name returns the same address
multiple times.  Allow this, but ignore any duplicate addresses.
---
 lib/libvcl/vcc_backend.c |   38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/lib/libvcl/vcc_backend.c b/lib/libvcl/vcc_backend.c
index 78cb0b2..5cc98ae 100644
--- a/lib/libvcl/vcc_backend.c
+++ b/lib/libvcl/vcc_backend.c
@@ -106,7 +106,7 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port)
 	struct addrinfo *res, *res0, *res1, hint;
 	int n4, n6, error, retval, x;
 	const char *emit, *multiple;
-	char hbuf[NI_MAXHOST];
+	char hbuf[NI_MAXHOST], v4[NI_MAXHOST], v6[NI_MAXHOST];
 	char *hop, *pop;
 
 	AN(t_host->dec);
@@ -145,16 +145,36 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port)
 
 	for (res = res0; res; res = res->ai_next) {
 		emit = NULL;
+
+		error = getnameinfo(res->ai_addr,
+		    res->ai_addrlen, hbuf, sizeof hbuf,
+		    NULL, 0, NI_NUMERICHOST);
+		AZ(error);
+
 		if (res->ai_family == PF_INET) {
-			if (n4++ == 0)
+			if (n4++ == 0) {
 				emit = "ipv4";
-			else
-				multiple = "IPv4";
+				strcpy(v4, hbuf);
+			} else {
+				if (strcmp(v4, hbuf) != 0) {
+					multiple = "IPv4";
+				} else {
+					/* Ignore duplicate address */
+					continue;
+				}
+			}
 		} else if (res->ai_family == PF_INET6) {
-			if (n6++ == 0)
+			if (n6++ == 0) {
 				emit = "ipv6";
-			else
-				multiple = "IPv6";
+				strcpy(v6, hbuf);
+			} else {
+				if (strcmp(v6, hbuf) != 0) {
+					multiple = "IPv6";
+				} else {
+					/* Ignore duplicate address */
+					continue;
+				}
+			}
 		} else
 			continue;
 
@@ -179,10 +199,6 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port)
 		AN(emit);
 		x = emit_sockaddr(tl, res->ai_addr, res->ai_addrlen);
 		Fb(tl, 0, "\t.%s_sockaddr = sockaddr%u,\n", emit, x);
-		error = getnameinfo(res->ai_addr,
-		    res->ai_addrlen, hbuf, sizeof hbuf,
-		    NULL, 0, NI_NUMERICHOST);
-		AZ(error);
 		Fb(tl, 0, "\t.%s_addr = \"%s\",\n", emit, hbuf);
 		retval++;
 	}
-- 
1.7.10.4




More information about the varnish-dev mailing list