From 9d6c46955fb51d7867e0d8d0ed94006ab72e4821 Mon Sep 17 00:00:00 2001
From: Denis Vlasenko <vda.linux@googlemail.com>
Date: Wed, 14 Nov 2007 10:18:33 +0000
Subject: Introduce FEATURE_PREFER_IPV4_ADDRESS. If selected, we have: function
                                             old     new   delta str2sockaddr 
                                        328     344     +16

---
 libbb/xconnect.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

(limited to 'libbb')

diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index cb5ac2c8e..91c12f4d3 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -125,6 +125,7 @@ USE_FEATURE_IPV6(sa_family_t af,)
 	int rc;
 	len_and_sockaddr *r = NULL;
 	struct addrinfo *result = NULL;
+	struct addrinfo *used_res;
 	const char *org_host = host; /* only for error msg */
 	const char *cp;
 	struct addrinfo hint;
@@ -169,9 +170,21 @@ USE_FEATURE_IPV6(sa_family_t af,)
 			xfunc_die();
 		goto ret;
 	}
-	r = xmalloc(offsetof(len_and_sockaddr, sa) + result->ai_addrlen);
-	r->len = result->ai_addrlen;
-	memcpy(&r->sa, result->ai_addr, result->ai_addrlen);
+	used_res = result;
+#if ENABLE_FEATURE_PREFER_IPV4_ADDRESS
+	while (1) {
+		if (used_res->ai_family == AF_INET)
+			break;
+		used_res = used_res->ai_next;
+		if (!used_res) {
+			used_res = result;
+			break;
+		}
+	}
+#endif
+	r = xmalloc(offsetof(len_and_sockaddr, sa) + used_res->ai_addrlen);
+	r->len = used_res->ai_addrlen;
+	memcpy(&r->sa, used_res->ai_addr, used_res->ai_addrlen);
 	set_nport(r, htons(port));
  ret:
 	freeaddrinfo(result);
-- 
cgit v1.2.3