engine: IPv6 net engine updates

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/engines/net.c b/engines/net.c
index add98dc..4ba4a5f 100644
--- a/engines/net.c
+++ b/engines/net.c
@@ -846,11 +846,48 @@
 	return ret;
 }
 
+static int fio_fill_addr(struct thread_data *td, const char *host, int af,
+			 void *dst, struct addrinfo **res)
+{
+	struct netio_options *o = td->eo;
+	struct addrinfo hints;
+	int ret;
+
+	if (inet_pton(af, host, dst))
+		return 0;
+
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = AF_UNSPEC;
+
+	if (is_tcp(o))
+		hints.ai_socktype = SOCK_STREAM;
+	else
+		hints.ai_socktype = SOCK_DGRAM;
+
+	ret = getaddrinfo(host, NULL, &hints, res);
+	if (ret) {
+		int e = EINVAL;
+		char str[128];
+
+		if (ret == EAI_SYSTEM)
+			e = errno;
+
+		snprintf(str, sizeof(str), "getaddrinfo: %s", gai_strerror(ret));
+		td_verror(td, e, str);
+		return 1;
+	}
+
+	return 0;
+}
+
 static int fio_netio_setup_connect_inet(struct thread_data *td,
 					const char *host, unsigned short port)
 {
 	struct netio_data *nd = td->io_ops->data;
 	struct netio_options *o = td->eo;
+	struct addrinfo *res = NULL;
+	void *dst, *src;
+	int af, len;
 
 	if (!host) {
 		log_err("fio: connect with no host to connect to.\n");
@@ -861,44 +898,35 @@
 		return 1;
 	}
 
+	nd->addr.sin_family = AF_INET;
+	nd->addr.sin_port = htons(port);
+	nd->addr6.sin6_family = AF_INET6;
+	nd->addr6.sin6_port = htons(port);
+
 	if (is_ipv6(o)) {
-		nd->addr6.sin6_family = AF_INET6;
-		nd->addr6.sin6_port = htons(port);
-
-		if (!inet_pton(AF_INET6, host, &nd->addr6.sin6_addr)) {
-			struct addrinfo hints, *res;
-
-			memset(&hints, 0, sizeof(hints));
-			hints.ai_socktype = SOCK_STREAM;
-
-			if (getaddrinfo(host, NULL, &hints, &res)) {
-				td_verror(td, errno, "gethostbyname");
-				return 1;
-			}
-
-			memcpy(&nd->addr6.sin6_addr, &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr, sizeof(nd->addr6.sin6_addr));
-			freeaddrinfo(res);
-		}
+		af = AF_INET6;
+		dst = &nd->addr6;
 	} else {
-		nd->addr.sin_family = AF_INET;
-		nd->addr.sin_port = htons(port);
-
-		if (!inet_pton(AF_INET, host, &nd->addr.sin_addr)) {
-			struct addrinfo hints, *res;
-
-			memset(&hints, 0, sizeof(hints));
-			hints.ai_socktype = SOCK_STREAM;
-
-			if (getaddrinfo(host, NULL, &hints, &res)) {
-				td_verror(td, errno, "gethostbyname");
-				return 1;
-			}
-
-			memcpy(&nd->addr.sin_addr, &((struct sockaddr_in *) res->ai_addr)->sin_addr, sizeof(nd->addr.sin_addr));
-			freeaddrinfo(res);
-		}
+		af = AF_INET;
+		dst = &nd->addr;
 	}
 
+	if (fio_fill_addr(td, host, af, dst, &res))
+		return 1;
+
+	if (!res)
+		return 0;
+
+	if (is_ipv6(o)) {
+		len = sizeof(nd->addr6.sin6_addr);
+		src = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
+	} else {
+		len = sizeof(nd->addr.sin_addr);
+		src = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
+	}
+
+	memcpy(dst, src, len);
+	freeaddrinfo(res);
 	return 0;
 }