| #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 | |
| WspiapiLegacyGetNameInfo (const struct sockaddr *ptSocketAddress, | |
| socklen_t tSocketLength, | |
| char *pszNodeName, size_t tNodeLength, | |
| char *pszServiceName, size_t tServiceLength, | |
| int iFlags) | |
| { | |
| struct servent *svc; | |
| WORD port; | |
| char str[] = "65535"; | |
| char *pstr = str; | |
| struct hostent *phost; | |
| struct in_addr l_inaddr; | |
| char *pnode = NULL, *pc = NULL; | |
| if (!ptSocketAddress || tSocketLength < (int) sizeof (struct sockaddr)) | |
| return EAI_FAIL; | |
| if (ptSocketAddress->sa_family != AF_INET) | |
| return EAI_FAMILY; | |
| if (tSocketLength < (int) sizeof (struct sockaddr_in)) | |
| return EAI_FAIL; | |
| if (!(pszNodeName && tNodeLength) && !(pszServiceName && tServiceLength)) | |
| return EAI_NONAME; | |
| if ((iFlags & NI_NUMERICHOST) != 0 && (iFlags & NI_NAMEREQD) != 0) | |
| return EAI_BADFLAGS; | |
| if (pszServiceName && tServiceLength) | |
| { | |
| port = ((struct sockaddr_in *) ptSocketAddress)->sin_port; | |
| if (iFlags & NI_NUMERICSERV) | |
| sprintf (str, "%u", ntohs (port)); | |
| else | |
| { | |
| svc = getservbyport(port, (iFlags & NI_DGRAM) ? "udp" : NULL); | |
| if (svc && svc->s_name) | |
| pstr = svc->s_name; | |
| else | |
| sprintf (str, "%u", ntohs (port)); | |
| } | |
| if (tServiceLength > strlen (pstr)) | |
| strcpy (pszServiceName, pstr); | |
| else | |
| return EAI_FAIL; | |
| } | |
| if (pszNodeName && tNodeLength) | |
| { | |
| l_inaddr = ((struct sockaddr_in *) ptSocketAddress)->sin_addr; | |
| if (iFlags & NI_NUMERICHOST) | |
| pnode = inet_ntoa (l_inaddr); | |
| else | |
| { | |
| phost = gethostbyaddr ((char *) &l_inaddr, sizeof (struct in_addr), AF_INET); | |
| if (phost && phost->h_name) | |
| { | |
| pnode = phost->h_name; | |
| if ((iFlags & NI_NOFQDN) != 0 && ((pc = strchr (pnode,'.')) != NULL)) | |
| *pc = 0; | |
| } | |
| else | |
| { | |
| if ((iFlags & NI_NAMEREQD) != 0) | |
| { | |
| switch(WSAGetLastError()) | |
| { | |
| case WSAHOST_NOT_FOUND: return EAI_NONAME; | |
| case WSATRY_AGAIN: return EAI_AGAIN; | |
| case WSANO_RECOVERY: return EAI_FAIL; | |
| default: return EAI_NONAME; | |
| } | |
| } | |
| else | |
| pnode = inet_ntoa (l_inaddr); | |
| } | |
| } | |
| if (tNodeLength > strlen (pnode)) | |
| strcpy (pszNodeName, pnode); | |
| else | |
| return EAI_FAIL; | |
| } | |
| return 0; | |
| } |