• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef WIN32_LEAN_AND_MEAN
2 #define WIN32_LEAN_AND_MEAN
3 #endif
4 #undef  __CRT__NO_INLINE
5 #define __CRT__NO_INLINE
6 #include <winsock2.h>
7 #include <wspiapi.h>
8 
9 int WINAPI
WspiapiLegacyGetNameInfo(const struct sockaddr * ptSocketAddress,socklen_t tSocketLength,char * pszNodeName,size_t tNodeLength,char * pszServiceName,size_t tServiceLength,int iFlags)10 WspiapiLegacyGetNameInfo (const struct sockaddr *ptSocketAddress,
11 			 socklen_t tSocketLength,
12 			 char *pszNodeName, size_t tNodeLength,
13 			 char *pszServiceName, size_t tServiceLength,
14 			 int iFlags)
15 {
16   struct servent *svc;
17   WORD port;
18   char str[] = "65535";
19   char *pstr = str;
20   struct hostent *phost;
21   struct in_addr l_inaddr;
22   char *pnode = NULL, *pc = NULL;
23 
24   if (!ptSocketAddress || tSocketLength < (int) sizeof (struct sockaddr))
25     return EAI_FAIL;
26   if (ptSocketAddress->sa_family != AF_INET)
27     return EAI_FAMILY;
28   if (tSocketLength < (int) sizeof (struct sockaddr_in))
29     return EAI_FAIL;
30   if (!(pszNodeName && tNodeLength) && !(pszServiceName && tServiceLength))
31     return EAI_NONAME;
32   if ((iFlags & NI_NUMERICHOST) != 0 && (iFlags & NI_NAMEREQD) != 0)
33     return EAI_BADFLAGS;
34   if (pszServiceName && tServiceLength)
35     {
36 	port = ((struct sockaddr_in *) ptSocketAddress)->sin_port;
37 	if (iFlags & NI_NUMERICSERV)
38 	  sprintf (str, "%u", ntohs (port));
39       else
40 	  {
41 	    svc = getservbyport(port, (iFlags & NI_DGRAM) ? "udp" : NULL);
42 	    if (svc && svc->s_name)
43 	      pstr = svc->s_name;
44 	    else
45 	      sprintf (str, "%u", ntohs (port));
46 	  }
47 	if (tServiceLength > strlen (pstr))
48 	  strcpy (pszServiceName, pstr);
49 	else
50 	  return EAI_FAIL;
51     }
52   if (pszNodeName && tNodeLength)
53     {
54 	l_inaddr = ((struct sockaddr_in *) ptSocketAddress)->sin_addr;
55 	if (iFlags & NI_NUMERICHOST)
56 	  pnode = inet_ntoa (l_inaddr);
57 	else
58 	  {
59 	    phost = gethostbyaddr ((char *) &l_inaddr, sizeof (struct in_addr), AF_INET);
60 	    if (phost && phost->h_name)
61 	      {
62 		pnode = phost->h_name;
63 		if ((iFlags & NI_NOFQDN) != 0 && ((pc = strchr (pnode,'.')) != NULL))
64 		  *pc = 0;
65 	      }
66 	    else
67 	      {
68 		if ((iFlags & NI_NAMEREQD) != 0)
69 		  {
70 		    switch(WSAGetLastError())
71 		      {
72 		      case WSAHOST_NOT_FOUND: return EAI_NONAME;
73 		      case WSATRY_AGAIN: return EAI_AGAIN;
74 		      case WSANO_RECOVERY: return EAI_FAIL;
75 		      default: return EAI_NONAME;
76 		      }
77 		  }
78 		else
79 		  pnode = inet_ntoa (l_inaddr);
80 	      }
81 	  }
82 	if (tNodeLength > strlen (pnode))
83 	  strcpy (pszNodeName, pnode);
84 	else
85 	  return EAI_FAIL;
86     }
87   return 0;
88 }
89