From 0c7b11fd8895bc2d722a5c1717c5a35d0f47f28c Mon Sep 17 00:00:00 2001
From: Marek Vavrusa <marek.vavrusa@nic.cz>
Date: Wed, 22 Jun 2011 15:24:00 +0200
Subject: [PATCH] Partially fixed QueryTCP for BSD.

Commit refs #831.
---
 tests/querytcp.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/tests/querytcp.c b/tests/querytcp.c
index b325b6fecb..edb4934d9f 100644
--- a/tests/querytcp.c
+++ b/tests/querytcp.c
@@ -140,6 +140,7 @@ static struct timeval start, send_finished;;
 static fd_set fdset0r, fdset0w;
 static int nfds;
 static struct sockaddr_storage remote;
+static int remote_len = 0;
 static int finished = 0;
 static timediff_t Timeout = 10*1000000LL;
 unsigned short counter = 0;
@@ -190,7 +191,7 @@ struct queries *Queries;
 
 /* input */
 char *ServerName = "127.0.0.1";
-char *ServerPort = "domain";
+char *ServerPort = "53";
 int family = PF_UNSPEC;
 char *datafile = NULL;
 int TimeLimit = 20;
@@ -510,15 +511,11 @@ void send_query(struct queries *q)
 	if (q->fd > 0)
 		err(1, "q->fd > 0 but ignored\n");
 
-#ifdef NOINET6
-    size_t ss_len = sizeof(struct sockaddr_in);
-#else
-    size_t ss_len = sizeof(struct sockaddr_in6);
-#endif
-	if ((q->fd = socket(remote.ss_family, SOCK_STREAM, 0)) < 0
-		|| (tmp = fcntl(q->fd, F_GETFL, 0)) == -1
-	    || fcntl(q->fd, F_SETFL, O_NONBLOCK | tmp) == -1
-        || (connect(q->fd, (struct sockaddr *)&remote, ss_len) < 0 && errno != EINPROGRESS)) {
+	q->fd = socket(remote.ss_family, SOCK_STREAM, 0);
+	tmp = fcntl(q->fd, F_GETFL, 0);
+	fcntl(q->fd, F_SETFL, O_NONBLOCK | tmp);
+	int conn_ret = connect(q->fd, (struct sockaddr *)&remote, remote_len);
+	if(conn_ret < 0 && errno != EINPROGRESS) {
 		register_response(q, ERROROFFSET - errno, "send_query:socket+fcntl+connect");
 		tcp_close(q);
 		return;
@@ -649,10 +646,23 @@ void query()
 	memset(&hints, 0, sizeof(hints));
 	hints.ai_family = family;
 	hints.ai_socktype = SOCK_STREAM;
-	error = getaddrinfo(ServerName, ServerPort, &hints, &res0);
+	printf("resolving: %s:%s\n", ServerName, ServerPort);
+	error = getaddrinfo(ServerName, 0, &hints, &res0);
 	if (error) {
 		errx(1, "%s", gai_strerror(error));
 	}
+
+	/* Update server port. */
+	int port = atoi(ServerPort);
+	if (res0->ai_family == AF_INET6) {
+		struct sockaddr_in6 *ipv6 = (struct sockaddr_in6*)res0->ai_addr;
+		ipv6->sin6_port = htons(port);
+	} else {
+		struct sockaddr_in *ipv4 = (struct sockaddr_in*)res0->ai_addr;
+		ipv4->sin_port = htons(port);
+	}
+
+	remote_len = res0->ai_addrlen;
 	memcpy(&remote, res0->ai_addr, res0->ai_addrlen);
 	memset(&countrcode, 0, sizeof(countrcode));
 
-- 
GitLab