| #ifndef WIN32_LEAN_AND_MEAN | |
| #define WIN32_LEAN_AND_MEAN | |
| #endif | |
| #undef __CRT__NO_INLINE | |
| #define __CRT__NO_INLINE | |
| #include <winsock2.h> | |
| #include <wspiapi.h> | |
| int WINAPI | |
| WspiapiQueryDNS(const char *pszNodeName, | |
| int iSocketType, int iProtocol, | |
| WORD wPort, char pszAlias[NI_MAXHOST], | |
| struct addrinfo **pptResult) | |
| { | |
| struct addrinfo **paddrinfo = pptResult; | |
| struct hostent *phost = NULL; | |
| char **h; | |
| *paddrinfo = NULL; | |
| pszAlias[0] = 0; | |
| phost = gethostbyname (pszNodeName); | |
| if (phost) | |
| { | |
| if (phost->h_addrtype == AF_INET && phost->h_length == sizeof(struct in_addr)) | |
| { | |
| for (h = phost->h_addr_list; *h != NULL; h++) | |
| { | |
| *paddrinfo = WspiapiNewAddrInfo (iSocketType, iProtocol, wPort, | |
| ((struct in_addr *) *h)->s_addr); | |
| if (!*paddrinfo) | |
| return EAI_MEMORY; | |
| paddrinfo = &((*paddrinfo)->ai_next); | |
| } | |
| } | |
| strncpy (pszAlias, phost->h_name, NI_MAXHOST - 1); | |
| pszAlias[NI_MAXHOST - 1] = 0; | |
| return 0; | |
| } | |
| switch(WSAGetLastError()) | |
| { | |
| case WSAHOST_NOT_FOUND: break; | |
| case WSATRY_AGAIN: return EAI_AGAIN; | |
| case WSANO_RECOVERY: return EAI_FAIL; | |
| case WSANO_DATA: return EAI_NODATA; | |
| default: break; | |
| } | |
| return EAI_NONAME; | |
| } |