#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #undef __CRT__NO_INLINE #define __CRT__NO_INLINE #include #include 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; }