r796 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Fri Aug 11 09:35:09 CEST 2006


Author: phk
Date: 2006-08-11 09:35:09 +0200 (Fri, 11 Aug 2006)
New Revision: 796

Modified:
   trunk/varnish-cache/bin/varnishd/tcp.c
Log:
Fix protocol family selection logic to also work on
a FreeBSD machine with now IPv6.

Remember to also free the addrinfo in case of success.



Modified: trunk/varnish-cache/bin/varnishd/tcp.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/tcp.c	2006-08-11 07:33:59 UTC (rev 795)
+++ trunk/varnish-cache/bin/varnishd/tcp.c	2006-08-11 07:35:09 UTC (rev 796)
@@ -69,34 +69,38 @@
 }
 #endif
 
-int
-open_tcp(const char *port)
+static int
+try_sock(int family, const char *port, struct addrinfo **resp)
 {
 	struct addrinfo hints, *res;
-	int ret, sd, val;
+	int ret, sd;
 
 	memset(&hints, 0, sizeof hints);
-	hints.ai_family = AF_INET6;
+	hints.ai_family = family;
 	hints.ai_socktype = SOCK_STREAM;
 	hints.ai_flags = AI_PASSIVE;
-	if ((ret = getaddrinfo(NULL, port, &hints, &res)) != 0) {
-		fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(ret));
+	ret = getaddrinfo(NULL, port, &hints, &res);
+	if (ret != 0)
 		return (-1);
-	}
-
 	sd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
-	if (sd < 0 && errno == EPROTONOSUPPORT) {
+	if (sd < 0)
 		freeaddrinfo(res);
-		hints.ai_family = AF_INET;
-		if ((ret = getaddrinfo(NULL, port, &hints, &res)) != 0) {
-			fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(ret));
-			return (-1);
-		}
-		sd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
-	}
+	else
+		*resp = res;
+	return (sd);
+}
+
+int
+open_tcp(const char *port)
+{
+	int sd, val;
+	struct addrinfo *res;
+
+	sd = try_sock(AF_INET6, port, &res);
+	if (sd < 0)
+		sd = try_sock(AF_INET, port, &res);
 	if (sd < 0) {
-		perror("socket()");
-		freeaddrinfo(res);
+		fprintf(stderr, "Failed to get listening socket\n");
 		return (-1);
 	}
 	val = 1;
@@ -129,6 +133,7 @@
 #ifdef HAVE_ACCEPT_FILTERS
 	accept_filter(sd);
 #endif
+	freeaddrinfo(res);
 	heritage.socket = sd;
 	return (0);
 }




More information about the varnish-commit mailing list