blob: 96728cc4d416c48ca7fdbb30bf9e631434a6e66a [file] [log] [blame]
#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;
}