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