diff options
author | Azat Khuzhin <azat@solaris.azat> | 2016-05-09 22:34:28 +0000 |
---|---|---|
committer | Azat Khuzhin <a3at.mail@gmail.com> | 2016-08-10 11:15:15 +0300 |
commit | 40730ae33310a3fd81bb00457d75c6e54494bad7 (patch) | |
tree | 803a60eddbd79a8c0c4081c222fe0fbd1b8fdaa8 | |
parent | dc95823cd79d32be8154e94f64f30e61a90850e2 (diff) | |
download | libevent-40730ae33310a3fd81bb00457d75c6e54494bad7.tar.gz |
Fix getaddrinfo under solaris (for multiprotocol case)
During testing on solaris 11.3, util/getaddrinfo failed at:
memset(&hints, 0, sizeof(hints));
hints.ai_flags = EVUTIL_AI_NUMERICHOST;
r = evutil_getaddrinfo("1.2.3.4", NULL, &hints, &ai);
tt_assert(ai_find_by_protocol(ai, IPPROTO_TCP));
And this is because solaris's getaddrinfo() returns:
$6 = {
ai_flags = 32,
ai_family = 2,
ai_socktype = 0,
ai_protocol = 0, <-- no proto
ai_addrlen = 16,
ai_canonname = 0x0,
ai_addr = 0x815d658,
ai_next = 0x0 <-- nothing else
}
So we should emulate this too.
Plus introduce helper that will search through all results, not only first one.
Fixes: util/getaddrinfo
Fixes: #354
-rw-r--r-- | evutil.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -1238,11 +1238,20 @@ static int tested_for_getaddrinfo_hacks=0; field set to 0. We test for this so we can apply an appropriate workaround. */ +struct evutil_addrinfo *ai_find_protocol(struct evutil_addrinfo *ai) +{ + while (ai) { + if (ai->ai_protocol) + return ai; + ai = ai->ai_next; + } + return NULL; +} static void test_for_getaddrinfo_hacks(void) { int r, r2; - struct evutil_addrinfo *ai=NULL, *ai2=NULL; + struct evutil_addrinfo *ai=NULL, *ai2=NULL, *ai3=NULL; struct evutil_addrinfo hints; memset(&hints,0,sizeof(hints)); @@ -1256,12 +1265,13 @@ test_for_getaddrinfo_hacks(void) #endif 0; r = getaddrinfo("1.2.3.4", "80", &hints, &ai); + getaddrinfo("1.2.3.4", NULL, &hints, &ai3); hints.ai_socktype = SOCK_STREAM; r2 = getaddrinfo("1.2.3.4", "80", &hints, &ai2); if (r2 == 0 && r != 0) { need_numeric_port_hack_=1; } - if (ai2 && ai2->ai_protocol == 0) { + if (!ai_find_protocol(ai2) || !ai_find_protocol(ai3)) { need_socktype_protocol_hack_=1; } @@ -1269,6 +1279,8 @@ test_for_getaddrinfo_hacks(void) freeaddrinfo(ai); if (ai2) freeaddrinfo(ai2); + if (ai3) + freeaddrinfo(ai3); tested_for_getaddrinfo_hacks=1; } |