1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#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;
}
|