Ok. We need this for at least 2 years when XP has EOL and I think compat
is the right place. ACK just as earlier :).

-- 
Samuli Seppänen
Community Manager
OpenVPN Technologies, Inc

irc freenode net: mattock



> 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