Skip to content

Commit 56eb563

Browse files
committed
macOS addrinfo/dns fix for ip6
1 parent 572b35e commit 56eb563

File tree

6 files changed

+22
-9
lines changed

6 files changed

+22
-9
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ int uv_main(int argc, char **argv) {
149149
kv(ai_socktype, SOCK_STREAM),
150150
kv(ai_protocol, IPPROTO_TCP));
151151

152-
fprintf(stderr, "%s\033[0K\n", dns->ip_addr);
153-
uv_stream_t *server = stream_connect_ex(UV_TCP, dns->ip_addr, 6667);
152+
fprintf(stderr, "%s\033[0K\n", addrinfo_ip(dns));
153+
uv_stream_t *server = stream_connect_ex(UV_TCP, addrinfo_ip(dns), 6667);
154154
while (text = stream_read(server))
155155
fprintf(stderr, "\033[0K%s", text);
156156

docs/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ int uv_main(int argc, char **argv) {
149149
kv(ai_socktype, SOCK_STREAM),
150150
kv(ai_protocol, IPPROTO_TCP));
151151

152-
fprintf(stderr, "%s\033[0K\n", dns->ip_addr);
153-
uv_stream_t *server = stream_connect_ex(UV_TCP, dns->ip_addr, 6667);
152+
fprintf(stderr, "%s\033[0K\n", addrinfo_ip(dns));
153+
uv_stream_t *server = stream_connect_ex(UV_TCP, addrinfo_ip(dns), 6667);
154154
while (text = stream_read(server))
155155
fprintf(stderr, "\033[0K%s", text);
156156

examples/dns.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ int uv_main(int argc, char **argv) {
88
kv(ai_socktype, SOCK_STREAM),
99
kv(ai_protocol, IPPROTO_TCP));
1010

11-
fprintf(stderr, "%s\033[0K\n", dns->ip_addr);
12-
uv_stream_t *server = stream_connect_ex(UV_TCP, dns->ip_addr, 6667);
11+
fprintf(stderr, "%s\033[0K\n", addrinfo_ip(dns));
12+
uv_stream_t *server = stream_connect_ex(UV_TCP, addrinfo_ip(dns), 6667);
1313
while (text = stream_read(server))
1414
fprintf(stderr, "\033[0K%s", text);
1515

include/uv_coro.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ typedef struct scandir_s {
182182

183183
typedef struct dnsinfo_s {
184184
uv_coro_types type;
185+
bool is_ip6;
185186
size_t count;
186187
string ip_addr, ip6_addr, ip_name;
187188
addrinfo_t *addr, original[1];
@@ -363,6 +364,7 @@ C_API bool fs_watch_stop(void);
363364

364365
C_API dnsinfo_t *get_addrinfo(string_t address, string_t service, u32 numhints_pair, ...);
365366
C_API addrinfo_t *addrinfo_next(dnsinfo_t *);
367+
C_API string_t addrinfo_ip(dnsinfo_t *);
366368
C_API nameinfo_t *get_nameinfo(string_t addr, int port, int flags);
367369

368370
C_API uv_pipe_t *pipe_create_ex(bool is_ipc, bool autofree);

src/uv_coro.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,13 @@ dnsinfo_t *get_addrinfo(string_t address, string_t service, u32 numhints_pair, .
13831383
return (dnsinfo_t *)uv_start(uv_args, UV_GETADDRINFO, count, true).object;
13841384
}
13851385

1386+
RAII_INLINE string_t addrinfo_ip(dnsinfo_t *dns) {
1387+
if (is_addrinfo(dns))
1388+
return (string_t)(dns->is_ip6 ? dns->ip6_addr : dns->ip_addr);
1389+
1390+
return nullptr;
1391+
}
1392+
13861393
addrinfo_t *addrinfo_next(dnsinfo_t *dns) {
13871394
if (is_addrinfo(dns) && !is_empty(dns->addr)) {
13881395
addrinfo_t *dir = dns->addr;
@@ -1392,9 +1399,11 @@ addrinfo_t *addrinfo_next(dnsinfo_t *dns) {
13921399
dns->ip_name = dir->ai_canonname;
13931400

13941401
if (dir->ai_family == AF_INET) {
1402+
dns->is_ip6 = false;
13951403
if (is_zero(ip = uv_ip4_name((const struct sockaddr_in *)dir->ai_addr, dns->ip, INET_ADDRSTRLEN)))
13961404
dns->ip_addr = dns->ip;
13971405
} else if (dir->ai_family == AF_INET6) {
1406+
dns->is_ip6 = true;
13981407
if (is_zero(ip = uv_ip6_name((const struct sockaddr_in6 *)dir->ai_addr, dns->ip, INET6_ADDRSTRLEN)))
13991408
dns->ip6_addr = dns->ip;
14001409
}

tests/test-dns.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ void_t worker_misc(params_t args) {
1212

1313
TEST(get_addrinfo) {
1414
dnsinfo_t *dns = nullptr;
15+
string ip = nullptr;
1516
rid_t res = go(worker_misc, 3, 1000, "addrinfo", "finish");
1617
ASSERT_TRUE(is_addrinfo(dns = get_addrinfo(gai, "http", 1, kv(ai_flags, AI_CANONNAME | AI_PASSIVE | AF_INET))));
1718
ASSERT_FALSE(result_is_ready(res));
@@ -21,10 +22,11 @@ TEST(get_addrinfo) {
2122
ASSERT_TRUE(result_is_ready(res));
2223
ASSERT_STR(result_for(res).char_ptr, "finish");
2324
ASSERT_STR(gai, dns->ip_name);
24-
if (dns->addr->ai_family == AF_INET6)
25-
ASSERT_TRUE((is_str_in(dns->ip6_addr, "8844")));
25+
ASSERT_NOTNULL((ip = (string)addrinfo_ip(dns)));
26+
if (dns->is_ip6)
27+
ASSERT_TRUE((is_str_in(ip, "8844")));
2628
else
27-
ASSERT_TRUE((is_str_in(dns->ip_addr, "8.8")));
29+
ASSERT_TRUE((is_str_in(ip, "8.8")));
2830

2931
ASSERT_TRUE((dns->count > 2));
3032

0 commit comments

Comments
 (0)