Commit edf6862b authored by Damien Fouilleul's avatar Damien Fouilleul

sap.c: win32 fix for IPv6 local-link zone identifier

parent cfb2689c
...@@ -49,7 +49,10 @@ ...@@ -49,7 +49,10 @@
#ifdef HAVE_ZLIB_H #ifdef HAVE_ZLIB_H
# include <zlib.h> # include <zlib.h>
#endif #endif
#include <net/if.h>
#ifndef WIN32
# include <net/if.h>
#endif
/************************************************************************ /************************************************************************
* Macros and definitions * Macros and definitions
...@@ -492,6 +495,7 @@ static void Run( services_discovery_t *p_sd ) ...@@ -492,6 +495,7 @@ static void Run( services_discovery_t *p_sd )
{ {
char psz_address[NI_MAXNUMERICHOST] = "ff02::2:7ffe%"; char psz_address[NI_MAXNUMERICHOST] = "ff02::2:7ffe%";
#ifndef WIN32
struct if_nameindex *l = if_nameindex (); struct if_nameindex *l = if_nameindex ();
if (l != NULL) if (l != NULL)
{ {
...@@ -503,6 +507,30 @@ static void Run( services_discovery_t *p_sd ) ...@@ -503,6 +507,30 @@ static void Run( services_discovery_t *p_sd )
} }
if_freenameindex (l); if_freenameindex (l);
} }
#else
/* this is the Winsock2 equivalant of SIOCGIFCONF on BSD stacks,
which if_nameindex uses internally anyway */
// first create a dummy socket to pin down the protocol family
SOCKET s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if( s != INVALID_SOCKET )
{
INTERFACE_INFO ifaces[10]; // Assume there will be no more than 10 IP interfaces
size_t len = sizeof(ifaces);
if( SOCKET_ERROR != WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, &ifaces, len, &len, NULL, NULL) )
{
unsigned ifcount = len/sizeof(INTERFACE_INFO);
char *ptr = strchr (psz_address, '%') + 1;
for(unsigned i = 1; i<=ifcount; ++i )
{
// append link-local zone identifier
sprintf(ptr, "%d", i);
}
}
closesocket(s);
}
#endif
*strchr (psz_address, '%') = '\0'; *strchr (psz_address, '%') = '\0';
static const char ipv6_scopes[] = "1456789ABCDE"; static const char ipv6_scopes[] = "1456789ABCDE";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment