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