From f11c071d4c0bbea7a47e876edaf6bae2c3c0b6fd Mon Sep 17 00:00:00 2001
From: Damien Fouilleul <damienf@videolan.org>
Date: Mon, 12 Feb 2007 16:25:16 +0000
Subject: [PATCH] - win32 replacements for inet_pton/inet_ntop

---
 modules/access_output/udp.c      | 18 +++++++++++-------
 modules/services_discovery/sap.c | 13 ++++++++++++-
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/modules/access_output/udp.c b/modules/access_output/udp.c
index 423b49a56f..d1b134fa6a 100644
--- a/modules/access_output/udp.c
+++ b/modules/access_output/udp.c
@@ -648,30 +648,34 @@ static const char *MakeRandMulticast (int family, char *buf, size_t buflen)
 #ifdef AF_INET6
         case AF_INET6:
         {
-            struct in6_addr addr;
+            struct sockaddr_in6 addr;
+            memset(&addr, 0, sizeof(addr));
             memcpy (&addr, "\xff\x38\x00\x00" "\x00\x00\x00\x00"
                            "\x00\x00\x00\x00", 12);
             rand |= 0x80000000;
-            memcpy (addr.s6_addr + 12, &(uint32_t){ htonl (rand) }, 4);
+            memcpy (addr.sin6_addr.s6_addr + 12, &(uint32_t){ htonl (rand) }, 4);
 #if defined(WIN32) || defined(UNDER_CE)
-            if( 0 == WSAAddressToStringA((LPSOCKADDR)&addr, sizeof(struct in6_addr), NULL, buf, &buflen) )
+            addr.sin6_family = AF_INET6;
+            if( 0 == WSAAddressToStringA((LPSOCKADDR)&addr, sizeof(struct sockaddr_in6), NULL, buf, &buflen) )
             {
                 buf[buflen] = '\0';
                 return buf;
             }
             return NULL;
 #else
-            return inet_ntop (family, &addr, buf, buflen);
+            return inet_ntop (family, &(addr.sin_addr), buf, buflen);
 #endif
         }
 #endif
 
         case AF_INET:
         {
-            struct in_addr addr;
-            addr.s_addr = htonl ((rand & 0xffffff) | 0xe8000000);
+            struct sockaddr_in addr;
+            memset(&addr, 0, sizeof(addr));
+            addr.sin_addr.s_addr = htonl ((rand & 0xffffff) | 0xe8000000);
 #if defined(WIN32) || defined(UNDER_CE)
-            if( 0 == WSAAddressToStringA((LPSOCKADDR)&addr, sizeof(struct in_addr), NULL, buf, &buflen) )
+            addr.sin_family = AF_INET;
+            if( 0 == WSAAddressToStringA((LPSOCKADDR)&addr, sizeof(struct sockaddr_in), NULL, buf, &buflen) )
             {
                 buf[buflen] = '\0';
                 return buf;
diff --git a/modules/services_discovery/sap.c b/modules/services_discovery/sap.c
index f1ee9c1be4..f0cffb69e1 100644
--- a/modules/services_discovery/sap.c
+++ b/modules/services_discovery/sap.c
@@ -949,10 +949,15 @@ static int ParseSDPConnection (const char *str, struct sockaddr_storage *addr,
 # endif
            *addrlen = sizeof (struct sockaddr_in6);
 
+#if defined(WIN32) || defined(UNDER_CE)
+            if( WSAStringToAddressA(host, AF_INET6, NULL,
+                    (LPSOCKADDR)addr, addrlen) )
+                return -1;
+#else
             if (inet_pton (AF_INET6, host,
                            &((struct sockaddr_in6 *)addr)->sin6_addr) <= 0)
                 return -1;
-
+#endif
             *number = (res >= 3) ? n1 : 1;
             break;
 #endif
@@ -964,9 +969,15 @@ static int ParseSDPConnection (const char *str, struct sockaddr_storage *addr,
 # endif
            *addrlen = sizeof (struct sockaddr_in);
 
+#if defined(WIN32) || defined(UNDER_CE)
+            if( WSAStringToAddressA(host, AF_INET, NULL,
+                    (LPSOCKADDR)addr, addrlen) )
+                return -1;
+#else
             if (inet_pton (AF_INET, host,
                            &((struct sockaddr_in *)addr)->sin_addr) <= 0)
                 return -1;
+#endif
 
             *number = (res >= 4) ? n2 : 1;
             break;
-- 
2.25.4