From edf6862b11373cc9d9d42149f3d701f18510255c Mon Sep 17 00:00:00 2001 From: Damien Fouilleul <damienf@videolan.org> Date: Wed, 28 Feb 2007 12:07:45 +0000 Subject: [PATCH] sap.c: win32 fix for IPv6 local-link zone identifier --- modules/services_discovery/sap.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/modules/services_discovery/sap.c b/modules/services_discovery/sap.c index 3efddedfe5..67d99a2095 100644 --- a/modules/services_discovery/sap.c +++ b/modules/services_discovery/sap.c @@ -49,7 +49,10 @@ #ifdef HAVE_ZLIB_H # include <zlib.h> #endif -#include <net/if.h> + +#ifndef WIN32 +# include <net/if.h> +#endif /************************************************************************ * Macros and definitions @@ -492,6 +495,7 @@ static void Run( services_discovery_t *p_sd ) { char psz_address[NI_MAXNUMERICHOST] = "ff02::2:7ffe%"; +#ifndef WIN32 struct if_nameindex *l = if_nameindex (); if (l != NULL) { @@ -503,6 +507,30 @@ static void Run( services_discovery_t *p_sd ) } 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'; static const char ipv6_scopes[] = "1456789ABCDE"; -- 2.25.4