text: /*
   *  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
  