From 27f793a3a2e4b816c310b28c13f3d3a9298b6da8 Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 11 Aug 2006 07:35:09 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@796 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/tcp.c | 41 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/varnish-cache/bin/varnishd/tcp.c b/varnish-cache/bin/varnishd/tcp.c index 2b644ef4..29fc2c3f 100644 --- a/varnish-cache/bin/varnishd/tcp.c +++ b/varnish-cache/bin/varnishd/tcp.c @@ -69,34 +69,38 @@ accept_filter(int fd) } #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 @@ open_tcp(const char *port) #ifdef HAVE_ACCEPT_FILTERS accept_filter(sd); #endif + freeaddrinfo(res); heritage.socket = sd; return (0); } -- 2.39.5