@@ -71,6 +71,8 @@ static struct dns_sd_discovery_data *new_discovery_data(struct dns_sd_discovery_
7171static 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