Skip to content

Commit a590363

Browse files
committed
dns_sd_windows: Append interface number to IPv6 link-local addresses
Just like we do with Avahi, append the interface identifier to the IPv6 link-local addresses. Signed-off-by: Paul Cercueil <[email protected]>
1 parent 007d10a commit a590363

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

dns_sd_windows.c

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ static struct dns_sd_discovery_data *new_discovery_data(struct dns_sd_discovery_
7171
static mdns_string_t ip_address_to_string(char *buffer, size_t capacity,
7272
const struct sockaddr *addr, size_t addrlen)
7373
{
74+
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
75+
struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
7476
char host[NI_MAXHOST] = { 0 };
7577
char service[NI_MAXSERV] = { 0 };
7678
int ret, len = 0;
@@ -80,15 +82,27 @@ static mdns_string_t ip_address_to_string(char *buffer, size_t capacity,
8082
NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV | NI_NUMERICHOST);
8183

8284
if (ret == 0) {
83-
if (addr->sa_family == AF_INET6 &&
84-
((struct sockaddr_in6 *)addr)->sin6_port != 0 &&
85-
strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR)))
86-
len = snprintf(buffer, capacity, "[%s]:%s", host, service);
87-
else if (((struct sockaddr_in *)addr)->sin_port != 0 &&
88-
strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR)))
85+
if (addr->sa_family == AF_INET6) {
86+
if (addr6->sin6_port != 0
87+
&& strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR))) {
88+
if (IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) {
89+
len = snprintf(buffer, capacity, "[%s%%%lu]:%s",
90+
host, addr6->sin6_scope_id, service);
91+
} else {
92+
len = snprintf(buffer, capacity, "[%s]:%s", host, service);
93+
}
94+
} else if (IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) {
95+
len = snprintf(buffer, capacity, "%s%%%lu",
96+
host, addr6->sin6_scope_id);
97+
} else {
98+
len = snprintf(buffer, capacity, "%s", host);
99+
}
100+
} else if (addr4->sin_port != 0
101+
&& strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR))) {
89102
len = snprintf(buffer, capacity, "%s:%s", host, service);
90-
else
103+
} else {
91104
len = snprintf(buffer, capacity, "%s", host);
105+
}
92106
}
93107

94108
if (len >= (int)capacity)

0 commit comments

Comments
 (0)