00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
00087 return dst;
00088 else
00089
00090 return NULL;
00091 }
00092
00093 int inet_pton( int af, const char *src, void *dst )
00094 {
00095
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