Skip to content

Commit

Permalink
dnssd: Append interface number to IPv6 link-local addresses
Browse files Browse the repository at this point in the history
Just like we do with Avahi, append the interface identifier to the IPv6
link-local addresses.

Signed-off-by: Paul Cercueil <[email protected]>
  • Loading branch information
pcercuei committed Jul 11, 2023
1 parent 007d10a commit f32482f
Showing 1 changed file with 21 additions and 7 deletions.
28 changes: 21 additions & 7 deletions dns_sd_windows.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ static struct dns_sd_discovery_data *new_discovery_data(struct dns_sd_discovery_
static mdns_string_t ip_address_to_string(char *buffer, size_t capacity,
const struct sockaddr *addr, size_t addrlen)
{
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
char host[NI_MAXHOST] = { 0 };
char service[NI_MAXSERV] = { 0 };
int ret, len = 0;
Expand All @@ -80,15 +82,27 @@ static mdns_string_t ip_address_to_string(char *buffer, size_t capacity,
NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV | NI_NUMERICHOST);

if (ret == 0) {
if (addr->sa_family == AF_INET6 &&
((struct sockaddr_in6 *)addr)->sin6_port != 0 &&
strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR)))
len = snprintf(buffer, capacity, "[%s]:%s", host, service);
else if (((struct sockaddr_in *)addr)->sin_port != 0 &&
strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR)))
if (addr->sa_family == AF_INET6) {
if (addr6->sin6_port != 0
&& strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR))) {
if (IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) {
len = snprintf(buffer, capacity, "[%s%%%u]:%s",
host, addr6->sin6_scope_id, service);
} else {
len = snprintf(buffer, capacity, "[%s]:%s", host, service);
}
} else if (IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) {
len = snprintf(buffer, capacity, "%s%%%u",
host, addr6->sin6_scope_id);
} else {
len = snprintf(buffer, capacity, "%s", host);
}
} else if (addr4->sin_port != 0
&& strncmp(service, MDNS_PORT_STR, sizeof(MDNS_PORT_STR))) {
len = snprintf(buffer, capacity, "%s:%s", host, service);
else
} else {
len = snprintf(buffer, capacity, "%s", host);
}
}

if (len >= (int)capacity)
Expand Down

0 comments on commit f32482f

Please sign in to comment.