Update Socket to CPAN version 2.019
authorChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Wed, 3 Jun 2015 15:05:03 +0000 (16:05 +0100)
committerChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Wed, 3 Jun 2015 15:05:03 +0000 (16:05 +0100)
  [DELTA]

  2.019   2015/04/29 17:05:33
        [BUGFIXES]
         * Provide emulations of inet_ntop/inet_pton on MSWin32 by using
           WSAStringToAddress/WSAAddressToString

Porting/Maintainers.pl
cpan/Socket/Socket.pm
cpan/Socket/Socket.xs

index 100ee48..2fc719f 100755 (executable)
@@ -996,7 +996,7 @@ use File::Glob qw(:case);
     },
 
     'Socket' => {
-        'DISTRIBUTION' => 'PEVANS/Socket-2.018.tar.gz',
+        'DISTRIBUTION' => 'PEVANS/Socket-2.019.tar.gz',
         'FILES'        => q[cpan/Socket],
     },
 
index 20657e8..aebb1dc 100644 (file)
@@ -3,7 +3,7 @@ package Socket;
 use strict;
 { use 5.006001; }
 
-our $VERSION = '2.018';
+our $VERSION = '2.019';
 
 =head1 NAME
 
index 60f5754..9595652 100644 (file)
 # include <ws2tcpip.h>
 #endif
 
+#ifdef WIN32
+int inet_pton(int af, const char *src, void *dst)
+{
+  struct sockaddr_storage ss;
+  int size = sizeof(ss);
+  char src_copy[INET6_ADDRSTRLEN+1];
+
+  ZeroMemory(&ss, sizeof(ss));
+  /* stupid non-const API */
+  strncpy(src_copy, src, INET6_ADDRSTRLEN+1);
+  src_copy[INET6_ADDRSTRLEN] = 0;
+
+  if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) != 0)
+    return 0;
+
+  switch(af) {
+    case AF_INET:
+      *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
+      return 1;
+    case AF_INET6:
+      *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
+      return 1;
+  }
+}
+
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
+{
+  struct sockaddr_storage ss;
+  unsigned long s = size;
+
+  ZeroMemory(&ss, sizeof(ss));
+  ss.ss_family = af;
+
+  switch(af) {
+    case AF_INET:
+      ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;
+      break;
+    case AF_INET6:
+      ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;
+      break;
+    default:
+      return NULL;
+  }
+
+  /* cannot directly use &size because of strict aliasing rules */
+  if (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) != 0)
+    return NULL;
+  else
+    return dst;
+}
+
+#define HAS_INETPTON
+#define HAS_INETNTOP
+#endif
+
 #ifdef NETWARE
 NETDB_DEFINE_CONTEXT
 NETINET_DEFINE_CONTEXT