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