root/opal/win32/opal_inet.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. opal_inet_pton
  2. opal_inet_ntop

   1 /*
   2  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2014 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2009 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2005 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * $COPYRIGHT$
  13  *
  14  * Additional copyrights may follow
  15  *
  16  * $HEADER$
  17  */
  18 
  19 
  20 #include "opal_config.h"
  21 
  22 #include "opal/win32/opal_inet.h"
  23 #include "opal/util/output.h"
  24 
  25 /*
  26  * convert from presentation format (which usually means ASCII printable)
  27  *    to network format (which is usually some kind of binary format).
  28  *
  29  * return:
  30  *    1 if the address was valid for the specified address family
  31  *    0 if the address wasn't valid (`dst' is untouched in this case)
  32  *    -1 if some other error occurred (`dst' is untouched in this case, too)
  33  */
  34 int opal_inet_pton(int af, const char *src, void *dst)
  35 {
  36     int addr_len;
  37     struct sockaddr sa;
  38     struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
  39     struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa;
  40 
  41     memset (&sa, 0, sizeof(struct sockaddr));
  42 
  43     switch (af) {
  44     case AF_INET:
  45         addr_len = sizeof(struct sockaddr_in);
  46         break;
  47 
  48     case AF_INET6:
  49         addr_len = sizeof(struct sockaddr_in6);
  50         break;
  51 
  52     default:
  53         return -1;
  54     }
  55 
  56     if ( 0 == WSAStringToAddress ((LPTSTR) src, af, NULL, (LPSOCKADDR) &sa, &addr_len )) {
  57         switch (af) {
  58         case AF_INET:
  59             memcpy (dst, &sin->sin_addr, sizeof(struct in_addr));
  60             break;
  61 
  62         case AF_INET6:
  63             memcpy (dst, &sin6->sin6_addr, sizeof(struct in6_addr));
  64             break;
  65         }
  66         return 1;
  67     } else {
  68         opal_output(0, "WSAStringToAddress failed %s:%d. Error code: %d", __FILE__, __LINE__, GetLastError());
  69         return 0;
  70     }
  71 }
  72 
  73 
  74 /*
  75  * convert a network format address to presentation format.
  76  *
  77  * return:
  78  *    pointer to presentation format address (`dst'), or NULL.
  79  */
  80 const char *opal_inet_ntop(int af, const void *src, char *dst, size_t size)
  81 {
  82     int addr_len;
  83     struct sockaddr sa;
  84     DWORD str_len = size;
  85     struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
  86     struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa;
  87 
  88     memset (&sa, 0, sizeof (struct sockaddr));
  89 
  90     switch (af) {
  91     case AF_INET:
  92         addr_len = sizeof(struct sockaddr_in);
  93         sin->sin_family = af;
  94         memcpy (&sin->sin_addr, src, sizeof (struct in_addr));
  95         break;
  96 
  97     case AF_INET6:
  98         addr_len = sizeof(struct sockaddr_in6);
  99         sin6->sin6_family = af;
 100         memcpy (&sin6->sin6_addr, src, sizeof (struct in6_addr));
 101         break;
 102 
 103     default:
 104         return NULL;
 105     }
 106 
 107     if ( 0 == WSAAddressToString ((LPSOCKADDR) &sa, addr_len, NULL, dst, &str_len )) {
 108         return dst;
 109     } else {
 110         opal_output(0, "WSAAddressToString failed %s:%d. Error code: %d", __FILE__, __LINE__, GetLastError());
 111         return NULL;
 112     }
 113 }

/* [<][>][^][v][top][bottom][index][help] */