aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-11-14 10:18:33 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-11-14 10:18:33 +0000
commit9d6c46955fb51d7867e0d8d0ed94006ab72e4821 (patch)
treeab5d74afb28887ad9ce249e6ba0e1c69844e64e6 /libbb
parent8d0a734d91ff197a86ce0b8fc892e24a15783395 (diff)
downloadbusybox-w32-9d6c46955fb51d7867e0d8d0ed94006ab72e4821.tar.gz
busybox-w32-9d6c46955fb51d7867e0d8d0ed94006ab72e4821.tar.bz2
busybox-w32-9d6c46955fb51d7867e0d8d0ed94006ab72e4821.zip
Introduce FEATURE_PREFER_IPV4_ADDRESS. If selected, we have:
function old new delta str2sockaddr 328 344 +16
Diffstat (limited to 'libbb')
-rw-r--r--libbb/xconnect.c19
1 files changed, 16 insertions, 3 deletions
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,)
125 int rc; 125 int rc;
126 len_and_sockaddr *r = NULL; 126 len_and_sockaddr *r = NULL;
127 struct addrinfo *result = NULL; 127 struct addrinfo *result = NULL;
128 struct addrinfo *used_res;
128 const char *org_host = host; /* only for error msg */ 129 const char *org_host = host; /* only for error msg */
129 const char *cp; 130 const char *cp;
130 struct addrinfo hint; 131 struct addrinfo hint;
@@ -169,9 +170,21 @@ USE_FEATURE_IPV6(sa_family_t af,)
169 xfunc_die(); 170 xfunc_die();
170 goto ret; 171 goto ret;
171 } 172 }
172 r = xmalloc(offsetof(len_and_sockaddr, sa) + result->ai_addrlen); 173 used_res = result;
173 r->len = result->ai_addrlen; 174#if ENABLE_FEATURE_PREFER_IPV4_ADDRESS
174 memcpy(&r->sa, result->ai_addr, result->ai_addrlen); 175 while (1) {
176 if (used_res->ai_family == AF_INET)
177 break;
178 used_res = used_res->ai_next;
179 if (!used_res) {
180 used_res = result;
181 break;
182 }
183 }
184#endif
185 r = xmalloc(offsetof(len_and_sockaddr, sa) + used_res->ai_addrlen);
186 r->len = used_res->ai_addrlen;
187 memcpy(&r->sa, used_res->ai_addr, used_res->ai_addrlen);
175 set_nport(r, htons(port)); 188 set_nport(r, htons(port));
176 ret: 189 ret:
177 freeaddrinfo(result); 190 freeaddrinfo(result);