89 lines
2.3 KiB
C
89 lines
2.3 KiB
C
#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;
|
|
}
|