spf_win32.c

Go to the documentation of this file.
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

Generated on Tue Nov 4 13:27:39 2008 for libspf2 by  doxygen 1.5.4