Not exactly... windows has this in Vista and above.
As long as we need to support XP we need to implement replacement functionality.

2012/3/8 Samuli Seppänen <sam...@openvpn.net>:
> Windows has this functionality, but not under the same function names as
> UNIX. So thse two are just wrappers around the Windows-specific
> functionality. In any case, I think it makes sense to move inet_pton and
> inet_ntop under src/compat. The actual code changes seem fairly trivial.
>
> ACK.
>
> --
> Samuli Seppänen
> Community Manager
> OpenVPN Technologies, Inc
>
> irc freenode net: mattock
>
>
> PS. These links should cover the basic idea, in case somebody is interested:
>
> <http://us.generation-nt.com/inet-pton-windows-convert-address-presentation-format-network-format-help-37036482.html>
> <http://pubs.opengroup.org/onlinepubs/009604599/functions/inet_ntop.html>
>> Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com>
>> ---
>>  configure.ac  I recall many issues with inet_ntop and inet_pton.
>>
>>                 |    2 +-
>>  src/compat/Makefile.am        |    4 ++-
>>  src/compat/compat-inet_ntop.c |   76 +++++++++++++++++++++++++++++++++++++++
>>  src/compat/compat-inet_pton.c |   79 
>> +++++++++++++++++++++++++++++++++++++++++
>>  src/compat/compat.h           |   17 ++++++++-
>>  src/compat/compat.vcproj      |    8 ++++
>>  src/openvpn/socket.c          |   55 ----------------------------
>>  src/openvpn/win32.h           |    6 ---
>>  8 files changed, 183 insertions(+), 64 deletions(-)
>>  create mode 100644 src/compat/compat-inet_ntop.c
>>  create mode 100644 src/compat/compat-inet_pton.c
>>
>> diff --git a/configure.ac b/configure.ac
>> index dc138ba..d53a74a 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -522,7 +522,7 @@ AC_CHECK_FUNCS([ \
>>         chsize ftruncate execve getpeereid umask basename dirname access \
>>         epoll_create \
>>  ])
>> -AC_CHECK_FUNCS([sendmsg recvmsg])
>> +AC_CHECK_FUNCS([sendmsg recvmsg inet_ntop inet_pton])
>>  AC_CHECK_FUNCS(
>>         [res_init],
>>         ,
>> diff --git a/src/compat/Makefile.am b/src/compat/Makefile.am
>> index c8a92ce..91b7f40 100644
>> --- a/src/compat/Makefile.am
>> +++ b/src/compat/Makefile.am
>> @@ -22,4 +22,6 @@ libcompat_la_SOURCES = \
>>         compat-dirname.c \
>>         compat-basename.c \
>>         compat-gettimeofday.c \
>> -       compat-daemon.c
>> +       compat-daemon.c \
>> +       compat-inet_ntop.c \
>> +       compat-inet_pton.c
>> diff --git a/src/compat/compat-inet_ntop.c b/src/compat/compat-inet_ntop.c
>> new file mode 100644
>> index 0000000..0d52142
>> --- /dev/null
>> +++ b/src/compat/compat-inet_ntop.c
>> @@ -0,0 +1,76 @@
>> +/*
>> + *  OpenVPN -- An application to securely tunnel IP networks
>> + *             over a single UDP port, with support for SSL/TLS-based
>> + *             session authentication and key exchange,
>> + *             packet encryption, packet authentication, and
>> + *             packet compression.
>> + *
>> + *  Copyright (C) 2011 - David Sommerseth <dav...@redhat.com>
>> + *
>> + *  This program is free software; you can redistribute it and/or modify
>> + *  it under the terms of the GNU General Public License version 2
>> + *  as published by the Free Software Foundation.
>> + *
>> + *  This program is distributed in the hope that it will be useful,
>> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *  GNU General Public License for more details.
>> + *
>> + *  You should have received a copy of the GNU General Public License
>> + *  along with this program (see the file COPYING included with this
>> + *  distribution); if not, write to the Free Software Foundation, Inc.,
>> + *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
>> + */
>> +
>> +#ifdef HAVE_CONFIG_H
>> +#include "config.h"
>> +#elif defined(_MSC_VER)
>> +#include "config-msvc.h"
>> +#endif
>> +
>> +#ifndef HAVE_INET_NTOP
>> +
>> +#include "compat.h"
>> +
>> +#ifdef WIN32
>> +
>> +#include <windows.h>
>> +
>> +/*
>> + * inet_ntop() and inet_pton() wrap-implementations using
>> + * WSAAddressToString() and WSAStringToAddress() functions
>> + *
>> + * this is needed as long as we support running OpenVPN on WinXP
>> + */
>> +
>> +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 direclty use &size because of strict aliasing rules */
>> +  return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, 
>> &s) == 0)?
>> +          dst : NULL;
>> +}
>> +
>> +#else
>> +
>> +#error no emulation for inet_ntop
>> +
>> +#endif
>> +
>> +#endif
>> diff --git a/src/compat/compat-inet_pton.c b/src/compat/compat-inet_pton.c
>> new file mode 100644
>> index 0000000..cdc8d4b
>> --- /dev/null
>> +++ b/src/compat/compat-inet_pton.c
>> @@ -0,0 +1,79 @@
>> +/*
>> + *  OpenVPN -- An application to securely tunnel IP networks
>> + *             over a single UDP port, with support for SSL/TLS-based
>> + *             session authentication and key exchange,
>> + *             packet encryption, packet authentication, and
>> + *             packet compression.
>> + *
>> + *  Copyright (C) 2011 - David Sommerseth <dav...@redhat.com>
>> + *
>> + *  This program is free software; you can redistribute it and/or modify
>> + *  it under the terms of the GNU General Public License version 2
>> + *  as published by the Free Software Foundation.
>> + *
>> + *  This program is distributed in the hope that it will be useful,
>> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *  GNU General Public License for more details.
>> + *
>> + *  You should have received a copy of the GNU General Public License
>> + *  along with this program (see the file COPYING included with this
>> + *  distribution); if not, write to the Free Software Foundation, Inc.,
>> + *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
>> + */
>> +
>> +#ifdef HAVE_CONFIG_H
>> +#include "config.h"
>> +#elif defined(_MSC_VER)
>> +#include "config-msvc.h"
>> +#endif
>> +
>> +#ifndef HAVE_INET_PTON
>> +
>> +#include "compat.h"
>> +
>> +#ifdef WIN32
>> +
>> +#include <windows.h>
>> +#include <string.h>
>> +
>> +/*
>> + * inet_ntop() and inet_pton() wrap-implementations using
>> + * WSAAddressToString() and WSAStringToAddress() functions
>> + *
>> + * this is needed as long as we support running OpenVPN on WinXP
>> + */
>> +
>> +
>> +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) {
>> +    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;
>> +    }
>> +  }
>> +  return 0;
>> +}
>> +
>> +#else
>> +
>> +#error no emulation for inet_ntop
>> +
>> +#endif
>> +
>> +#endif
>> diff --git a/src/compat/compat.h b/src/compat/compat.h
>> index e9d51b8..021573e 100644
>> --- a/src/compat/compat.h
>> +++ b/src/compat/compat.h
>> @@ -26,14 +26,21 @@
>>  #define COMPAT_H
>>
>>  #ifdef HAVE_WINSOCK2_H
>> -/* timeval */
>>  #include <winsock2.h>
>>  #endif
>>
>> +#ifdef HAVE_WS2TCPIP_H
>> +#include <ws2tcpip.h>
>> +#endif
>> +
>>  #ifdef HAVE_SYS_TIME_H
>>  #include <sys/time.h>
>>  #endif
>>
>> +#ifdef HAVE_SYS_SOCKET_H
>> +#include <sys/socket.h>
>> +#endif
>> +
>>  #ifndef HAVE_DIRNAME
>>  char * dirname(char *str);
>>  #endif /* HAVE_DIRNAME */
>> @@ -50,4 +57,12 @@ int gettimeofday (struct timeval *tv, void *tz);
>>  int daemon(int nochdir, int noclose);
>>  #endif
>>
>> +#ifndef HAVE_INET_NTOP
>> +const char * inet_ntop(int af, const void *src, char *dst, socklen_t size);
>> +#endif
>> +
>> +#ifndef HAVE_INET_PTON
>> +int inet_pton(int af, const char *src, void *dst);
>> +#endif
>> +
>>  #endif /* COMPAT_H */
>> diff --git a/src/compat/compat.vcproj b/src/compat/compat.vcproj
>> index efdecb4..43fc0c2 100644
>> --- a/src/compat/compat.vcproj
>> +++ b/src/compat/compat.vcproj
>> @@ -163,6 +163,14 @@
>>                                 >
>>                         </File>
>>                         <File
>> +                               RelativePath=".\compat-inet_ntop.c"
>> +                               >
>> +                       </File>
>> +                       <File
>> +                               RelativePath=".\compat-inet_pton.c"
>> +                               >
>> +                       </File>
>> +                       <File
>>                                 RelativePath=".\compat-daemon.c"
>>                                 >
>>                         </File>
>> diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
>> index e1526ff..608213b 100644
>> --- a/src/openvpn/socket.c
>> +++ b/src/openvpn/socket.c
>> @@ -3086,61 +3086,6 @@ link_socket_write_udp_posix_sendmsg (struct 
>> link_socket *sock,
>>
>>  #ifdef WIN32
>>
>> -/*
>> - * inet_ntop() and inet_pton() wrap-implementations using
>> - * WSAAddressToString() and WSAStringToAddress() functions
>> - *
>> - * this is needed as long as we support running OpenVPN on WinXP
>> - */
>> -
>> -const char *
>> -openvpn_inet_ntop(int af, const void *src, char *dst, socklen_t size)
>> -{
>> -  struct sockaddr_storage ss;
>> -  unsigned long s = size;
>> -
>> -  CLEAR(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:
>> -      ASSERT (0);
>> -  }
>> -  /* cannot direclty use &size because of strict aliasing rules */
>> -  return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, 
>> &s) == 0)?
>> -          dst : NULL;
>> -}
>> -
>> -int
>> -openvpn_inet_pton(int af, const char *src, void *dst)
>> -{
>> -  struct sockaddr_storage ss;
>> -  int size = sizeof(ss);
>> -  char src_copy[INET6_ADDRSTRLEN+1];
>> -
>> -  CLEAR(ss);
>> -  /* stupid non-const API */
>> -  strncpynt(src_copy, src, INET6_ADDRSTRLEN+1);
>> -
>> -  if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) 
>> == 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;
>> -    }
>> -  }
>> -  return 0;
>> -}
>> -
>>  int
>>  socket_recv_queue (struct link_socket *sock, int maxsize)
>>  {
>> diff --git a/src/openvpn/win32.h b/src/openvpn/win32.h
>> index 09f897a..d87e987 100644
>> --- a/src/openvpn/win32.h
>> +++ b/src/openvpn/win32.h
>> @@ -266,12 +266,6 @@ char *get_win_sys_path (void);
>>  /* call self in a subprocess */
>>  void fork_to_self (const char *cmdline);
>>
>> -const char *openvpn_inet_ntop(int af, const void *src,
>> -                              char *dst, socklen_t size);
>> -int openvpn_inet_pton(int af, const char *src, void *dst);
>> -#define inet_ntop(af,src,dst,size) openvpn_inet_ntop(af,src,dst,size)
>> -#define inet_pton(af,src,dst)      openvpn_inet_pton(af,src,dst)
>> -
>>  /* Find temporary directory */
>>  const char *win_get_tempdir();
>>
>> --
>> 1.7.3.4
>>
>>
>> ------------------------------------------------------------------------------
>> Virtualization & Cloud Management Using Capacity Planning
>> Cloud computing makes use of virtualization - but cloud computing
>> also focuses on allowing computing to be delivered as a service.
>> http://www.accelacomm.com/jaw/sfnl/114/51521223/
>> _______________________________________________
>> Openvpn-devel mailing list
>> Openvpn-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/openvpn-devel
>
>

Reply via email to