#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #undef __CRT__NO_INLINE #define __CRT__NO_INLINE #include #include int WINAPI WspiapiLegacyGetAddrInfo(const char *pszNodeName, const char *pszServiceName, const struct addrinfo *ptHints, struct addrinfo **pptResult) { int err = 0, iFlags = 0, iFamily = PF_UNSPEC, iSocketType = 0, iProtocol = 0; struct in_addr inAddress; struct servent *svc = NULL; char *pc = NULL; WINBOOL isCloned = FALSE; WORD tcpPort = 0, udpPort = 0, port = 0; *pptResult = NULL; if (!pszNodeName && !pszServiceName) return EAI_NONAME; if (ptHints) { if (ptHints->ai_addrlen != 0 || ptHints->ai_canonname != NULL || ptHints->ai_addr!=NULL || ptHints->ai_next != NULL) return EAI_FAIL; iFlags = ptHints->ai_flags; if ((iFlags & AI_CANONNAME) != 0 && !pszNodeName) return EAI_BADFLAGS; iFamily = ptHints->ai_family; if (iFamily != PF_UNSPEC && iFamily != PF_INET) return EAI_FAMILY; iSocketType = ptHints->ai_socktype; if (iSocketType != 0 && iSocketType != SOCK_STREAM && iSocketType != SOCK_DGRAM && iSocketType != SOCK_RAW) return EAI_SOCKTYPE; iProtocol = ptHints->ai_protocol; } if (pszServiceName) { port = (WORD) strtoul (pszServiceName, &pc, 10); if(*pc == 0) { port = tcpPort = udpPort = htons (port); if (iSocketType == 0) { isCloned = TRUE; iSocketType = SOCK_STREAM; } } else { if (iSocketType == 0 || iSocketType == SOCK_DGRAM) { svc = getservbyname(pszServiceName, "udp"); if (svc) port = udpPort = svc->s_port; } if (iSocketType == 0 || iSocketType == SOCK_STREAM) { svc = getservbyname(pszServiceName, "tcp"); if (svc) port = tcpPort = svc->s_port; } if (port == 0) return (iSocketType ? EAI_SERVICE : EAI_NONAME); if (iSocketType==0) { iSocketType = (tcpPort) ? SOCK_STREAM : SOCK_DGRAM; isCloned = (tcpPort && udpPort); } } } if (!pszNodeName || WspiapiParseV4Address(pszNodeName,&inAddress.s_addr)) { if (!pszNodeName) { inAddress.s_addr = htonl ((iFlags & AI_PASSIVE) ? INADDR_ANY : INADDR_LOOPBACK); } *pptResult = WspiapiNewAddrInfo(iSocketType, iProtocol, port, inAddress.s_addr); if (!(*pptResult)) err = EAI_MEMORY; if (!err && pszNodeName) { (*pptResult)->ai_flags |= AI_NUMERICHOST; if (iFlags & AI_CANONNAME) { (*pptResult)->ai_canonname = WspiapiStrdup (inet_ntoa (inAddress)); if (!(*pptResult)->ai_canonname) err = EAI_MEMORY; } } } else if (iFlags & AI_NUMERICHOST) err = EAI_NONAME; else err = WspiapiLookupNode (pszNodeName, iSocketType, iProtocol, port, (iFlags & AI_CANONNAME), pptResult); if (!err && isCloned) err = WspiapiClone(udpPort, *pptResult); if (err) { WspiapiLegacyFreeAddrInfo (*pptResult); *pptResult = NULL; } return err; }