libspf2 1.2.10
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of either: 00004 * 00005 * a) The GNU Lesser General Public License as published by the Free 00006 * Software Foundation; either version 2.1, or (at your option) any 00007 * later version, 00008 * 00009 * OR 00010 * 00011 * b) The two-clause BSD license. 00012 * 00013 * These licenses can be found with the distribution in the file LICENSES 00014 */ 00015 00016 #ifdef _WIN32 00017 00018 #include "spf_win32_internal.h" 00019 00020 int SPF_win32_startup() 00021 { 00022 WORD wVersionRequested; 00023 WSADATA wsaData; 00024 int err; 00025 00026 wVersionRequested = MAKEWORD( 2, 2 ); 00027 00028 err = WSAStartup( wVersionRequested, &wsaData ); 00029 if ( err != 0 ) 00030 return 0; 00031 00032 if ( LOBYTE( wsaData.wVersion ) != 2 || 00033 HIBYTE( wsaData.wVersion ) != 2 ) 00034 { 00035 WSACleanup(); 00036 return 0; 00037 } 00038 00039 return 1; 00040 } 00041 00042 int SPF_win32_cleanup() 00043 { 00044 return WSACleanup(); 00045 } 00046 00047 char *inet_ntop( int af, const void *src, char *dst, size_t size ) 00048 { 00049 void *pSrc_sockaddr; 00050 struct sockaddr_in src_sockaddr; 00051 struct sockaddr_in6 src6_sockaddr; 00052 DWORD src_size; 00053 DWORD temp; 00054 int result; 00055 DWORD error; 00056 00057 switch( af ) 00058 { 00059 case AF_INET: 00060 src_sockaddr.sin_family = AF_INET; 00061 src_sockaddr.sin_port = 0; 00062 memcpy( &src_sockaddr.sin_addr, src, sizeof( struct in_addr ) ); 00063 pSrc_sockaddr = &src_sockaddr; 00064 src_size = sizeof( struct sockaddr_in ); 00065 break; 00066 case AF_INET6: 00067 src6_sockaddr.sin6_family = AF_INET6; 00068 src6_sockaddr.sin6_port = 0; 00069 src6_sockaddr.sin6_flowinfo = 0; 00070 src6_sockaddr.sin6_scope_id = 0; 00071 memcpy( &src6_sockaddr.sin6_addr, src, sizeof( struct in6_addr ) ); 00072 pSrc_sockaddr = &src6_sockaddr; 00073 src_size = sizeof( struct sockaddr_in6 ); 00074 break; 00075 default: 00076 return NULL; 00077 } 00078 00079 temp = size; 00080 result = WSAAddressToStringA( (LPSOCKADDR)pSrc_sockaddr, src_size, 00081 NULL, dst, &temp ); 00082 00083 error = GetLastError(); 00084 00085 if (result == 0) 00086 // Success 00087 return dst; 00088 else 00089 // Failure 00090 return NULL; 00091 } 00092 00093 int inet_pton( int af, const char *src, void *dst ) 00094 { 00095 /* IPv6 is largest buffer, so use it for both */ 00096 struct sockaddr_in6 dst_sockaddr; 00097 struct sockaddr_in6 *pDst_sockaddr; 00098 int dst_size; 00099 int result; 00100 DWORD error; 00101 00102 pDst_sockaddr = &dst_sockaddr; 00103 00104 switch( af ) 00105 { 00106 case AF_INET: 00107 dst_size = sizeof( struct sockaddr_in ); 00108 break; 00109 case AF_INET6: 00110 dst_size = sizeof( struct sockaddr_in6 ); 00111 break; 00112 default: 00113 return 0; 00114 } 00115 00116 result = WSAStringToAddressA( src, af, NULL, 00117 (LPSOCKADDR)pDst_sockaddr, &dst_size ); 00118 00119 if ( result != 0 ) 00120 { 00121 error = GetLastError(); 00122 return error; 00123 return 0; 00124 } 00125 00126 switch( af ) 00127 { 00128 case AF_INET: 00129 memcpy( dst, &((struct sockaddr_in*)pDst_sockaddr)->sin_addr, 00130 sizeof( struct in_addr ) ); 00131 break; 00132 case AF_INET6: 00133 memcpy( dst, &pDst_sockaddr->sin6_addr, 00134 sizeof( struct in6_addr ) ); 00135 break; 00136 } 00137 00138 return 1; 00139 } 00140 00141 int gethostnameFQDN( char *name, int namelen ) 00142 { 00143 int result; 00144 int fullnamelen; 00145 struct hostent *he; 00146 00147 result = gethostname( name, namelen ); 00148 00149 if ( result == 0 ) 00150 { 00151 he = gethostbyname( name ); 00152 00153 if (he != NULL) 00154 { 00155 fullnamelen = strlen( he->h_name ); 00156 00157 if (fullnamelen < namelen) 00158 strcpy( name, he->h_name ); 00159 } 00160 } 00161 00162 return result; 00163 } 00164 00165 #endif