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 >>