diff options
author | Alon Bar-Lev | 2012-02-29 22:12:17 +0200 |
---|---|---|
committer | David Sommerseth | 2012-03-22 22:53:39 +0100 |
commit | f106f64b1cc228b3b937ed15a1a45bc28edefed9 (patch) | |
tree | 2b2e25a5ca6e2bf045ff41b7a5ec481140e87929 | |
parent | 7b49c16761b4a11f1f0846cd46bd7194392efbfa (diff) | |
download | openvpn-f106f64b1cc228b3b937ed15a1a45bc28edefed9.zip openvpn-f106f64b1cc228b3b937ed15a1a45bc28edefed9.tar.gz |
build: move inet_ntop(), inet_pton() emulation into compat
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
Acked-by: Samuli Seppänen <samuli@openvpn.net>
Acked-by: David Sommerseth <davids@redhat.com>
Signed-off-by: David Sommerseth <davids@redhat.com>
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/compat/Makefile.am | 4 | ||||
-rw-r--r-- | src/compat/compat-inet_ntop.c | 76 | ||||
-rw-r--r-- | src/compat/compat-inet_pton.c | 79 | ||||
-rw-r--r-- | src/compat/compat.h | 17 | ||||
-rw-r--r-- | src/compat/compat.vcproj | 8 | ||||
-rw-r--r-- | src/openvpn/socket.c | 55 | ||||
-rw-r--r-- | src/openvpn/win32.h | 6 |
8 files changed, 183 insertions, 64 deletions
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 <davids@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 <davids@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(); |