Commit Diff


commit - 2edd250dd96801661e3eba82e6b3ee229563f38f
commit + 7d1d4b6ff2bc57110299da7fafbade01160fa0ef
blob - 31f76418205c391a63e56e0b2fd815181d3eb53d
blob + 13da0317b11156616eb49672114fb85e0438477c
--- gotwebd/gotwebd.h
+++ gotwebd/gotwebd.h
@@ -266,6 +266,9 @@ struct address {
 	TAILQ_ENTRY(address)	 entry;
 	struct sockaddr_storage	 ss;
 	socklen_t		 slen;
+	int			 ai_family;
+	int			 ai_socktype;
+	int			 ai_protocol;
 	in_port_t		 port;
 	char			 ifname[IFNAMSIZ];
 };
blob - 0c4efffac51447f247923bec579926305bb63c84
blob + f6d1bd31dc57cb3054504d3c510b96d61473e5a3
--- gotwebd/parse.y
+++ gotwebd/parse.y
@@ -1034,8 +1034,10 @@ get_addrs(const char *hostname, const char *servname, 
 				return (-1);
 			}
 		}
-		h->ss.ss_family = res->ai_family;
 
+		h->ai_family = res->ai_family;
+		h->ai_socktype = res->ai_socktype;
+		h->ai_protocol = res->ai_protocol;
 		memcpy(&h->ss, res->ai_addr, res->ai_addrlen);
 		h->slen = res->ai_addrlen;
 
@@ -1069,7 +1071,10 @@ addr_dup_check(struct addresslist *al, struct address 
 	const char *addrstr;
 
 	TAILQ_FOREACH(a, al, entry) {
-		if (a->slen != h->slen ||
+		if (a->ai_family != h->ai_family ||
+		    a->ai_socktype != h->ai_socktype ||
+		    a->ai_protocol != h->ai_protocol ||
+		    a->slen != h->slen ||
 		    memcmp(&a->ss, &h->ss, a->slen) != 0)
 			continue;
 
blob - 993b8723662b4b9475af9a1db9e910d80afee90c
blob + 2cb58d31e23df12526770e9fbb9d4c031ce446e9
--- gotwebd/sockets.c
+++ gotwebd/sockets.c
@@ -77,7 +77,7 @@ static void	 sockets_rlimit(int);
 static int	 sockets_dispatch_gotwebd(int, struct privsep_proc *,
 		    struct imsg *);
 static int	 sockets_unix_socket_listen(struct privsep *, struct socket *);
-static int	 sockets_create_socket(struct address *, in_port_t);
+static int	 sockets_create_socket(struct address *);
 static int	 sockets_accept_reserve(int, struct sockaddr *, socklen_t *,
 		    int, volatile int *);
 
@@ -231,6 +231,9 @@ sockets_conf_new_socket_fcgi(struct gotwebd *env, stru
 
 	memcpy(&acp->ss, &a->ss, sizeof(acp->ss));
 	acp->slen = a->slen;
+	acp->ai_family = a->ai_family;
+	acp->ai_socktype = a->ai_socktype;
+	acp->ai_protocol = a->ai_protocol;
 	acp->port = a->port;
 	if (*a->ifname != '\0') {
 		if (strlcpy(acp->ifname, a->ifname,
@@ -408,8 +411,7 @@ sockets_privinit(struct gotwebd *env, struct socket *s
 		log_debug("%s: initializing %s FCGI socket on port %d for %s",
 		    __func__, sock->conf.af_type == AF_INET ? "inet" : "inet6",
 		    sock->conf.fcgi_socket_port, sock->conf.name);
-		sock->fd = sockets_create_socket(&sock->conf.addr,
-		    sock->conf.fcgi_socket_port);
+		sock->fd = sockets_create_socket(&sock->conf.addr);
 		if (sock->fd == -1) {
 			log_warnx("%s: create FCGI socket failed", __func__);
 			return -1;
@@ -500,17 +502,11 @@ sockets_unix_socket_listen(struct privsep *ps, struct 
 }
 
 static int
-sockets_create_socket(struct address *a, in_port_t port)
+sockets_create_socket(struct address *a)
 {
-	struct addrinfo hints;
 	int fd = -1, o_val = 1, flags;
 
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = AF_UNSPEC;
-	hints.ai_socktype = SOCK_STREAM;
-	hints.ai_flags |= AI_PASSIVE;
-
-	fd = socket(a->ss.ss_family, hints.ai_socktype, 0);
+	fd = socket(a->ai_family, a->ai_socktype, a->ai_protocol);
 	if (fd == -1)
 		return -1;
 
@@ -535,8 +531,7 @@ sockets_create_socket(struct address *a, in_port_t por
 
 	if (bind(fd, (struct sockaddr *)&a->ss, a->slen) == -1) {
 		close(fd);
-		log_info("%s: can't bind to port %d", __func__,
-		    ntohs(port));
+		log_info("%s: can't bind to port %d", __func__, a->port);
 		return -1;
 	}