1/* 2 * OpenVPN -- An application to securely tunnel IP networks 3 * over a single UDP port, with support for SSL/TLS-based 4 * session authentication and key exchange, 5 * packet encryption, packet authentication, and 6 * packet compression. 7 * 8 * Copyright (C) 2011 - David Sommerseth <davids@redhat.com> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 12 * as published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program (see the file COPYING included with this 21 * distribution); if not, write to the Free Software Foundation, Inc., 22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 */ 24 25#ifdef HAVE_CONFIG_H 26#include "config.h" 27#elif defined(_MSC_VER) 28#include "config-msvc.h" 29#endif 30 31#ifndef HAVE_INET_PTON 32 33#include "compat.h" 34 35#ifdef WIN32 36 37#include <windows.h> 38#include <string.h> 39 40/* 41 * inet_ntop() and inet_pton() wrap-implementations using 42 * WSAAddressToString() and WSAStringToAddress() functions 43 * 44 * this is needed as long as we support running OpenVPN on WinXP 45 */ 46 47 48int 49inet_pton(int af, const char *src, void *dst) 50{ 51 struct sockaddr_storage ss; 52 int size = sizeof(ss); 53 char src_copy[INET6_ADDRSTRLEN+1]; 54 55 ZeroMemory(&ss, sizeof(ss)); 56 /* stupid non-const API */ 57 strncpy (src_copy, src, INET6_ADDRSTRLEN+1); 58 src_copy[INET6_ADDRSTRLEN] = 0; 59 60 if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { 61 switch(af) { 62 case AF_INET: 63 *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; 64 return 1; 65 case AF_INET6: 66 *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; 67 return 1; 68 } 69 } 70 return 0; 71} 72 73#else 74 75#error no emulation for inet_ntop 76 77#endif 78 79#endif 80