• 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
WspiapiLegacyGetAddrInfo(const char * pszNodeName,const char * pszServiceName,const struct addrinfo * ptHints,struct addrinfo ** pptResult)10 WspiapiLegacyGetAddrInfo(const char *pszNodeName,
11 			 const char *pszServiceName,
12 			 const struct addrinfo *ptHints,
13 			 struct addrinfo **pptResult)
14 {
15   int err = 0, iFlags = 0, iFamily = PF_UNSPEC, iSocketType = 0, iProtocol = 0;
16   struct in_addr inAddress;
17   struct servent *svc = NULL;
18   char *pc = NULL;
19   WINBOOL isCloned = FALSE;
20   WORD tcpPort = 0, udpPort = 0, port = 0;
21 
22   *pptResult = NULL;
23   if (!pszNodeName && !pszServiceName)
24     return EAI_NONAME;
25   if (ptHints)
26     {
27 	if (ptHints->ai_addrlen != 0 || ptHints->ai_canonname != NULL
28 	    || ptHints->ai_addr!=NULL || ptHints->ai_next != NULL)
29 	  return EAI_FAIL;
30 	iFlags = ptHints->ai_flags;
31 	if ((iFlags & AI_CANONNAME) != 0 && !pszNodeName)
32 	  return EAI_BADFLAGS;
33 	iFamily = ptHints->ai_family;
34 	if (iFamily != PF_UNSPEC && iFamily != PF_INET)
35 	  return EAI_FAMILY;
36 	iSocketType = ptHints->ai_socktype;
37 	if (iSocketType != 0 && iSocketType != SOCK_STREAM && iSocketType != SOCK_DGRAM
38 	    && iSocketType != SOCK_RAW)
39 	  return EAI_SOCKTYPE;
40 	iProtocol = ptHints->ai_protocol;
41     }
42 
43   if (pszServiceName)
44     {
45 	port = (WORD) strtoul (pszServiceName, &pc, 10);
46 	if(*pc == 0)
47 	  {
48 	    port = tcpPort = udpPort = htons (port);
49 	    if (iSocketType == 0)
50 	      {
51 		isCloned = TRUE;
52 		iSocketType = SOCK_STREAM;
53 	      }
54 	  }
55 	else
56 	  {
57 	    if (iSocketType == 0 || iSocketType == SOCK_DGRAM)
58 	      {
59 		svc = getservbyname(pszServiceName, "udp");
60 		if (svc)
61 		  port = udpPort = svc->s_port;
62 	      }
63 	    if (iSocketType == 0 || iSocketType == SOCK_STREAM)
64 	      {
65 		svc = getservbyname(pszServiceName, "tcp");
66 		if (svc)
67 		  port = tcpPort = svc->s_port;
68 	      }
69 	    if (port == 0)
70 	      return (iSocketType ? EAI_SERVICE : EAI_NONAME);
71 	    if (iSocketType==0)
72 	      {
73 		iSocketType = (tcpPort) ? SOCK_STREAM : SOCK_DGRAM;
74 		isCloned = (tcpPort && udpPort);
75 	      }
76 	  }
77     }
78   if (!pszNodeName || WspiapiParseV4Address(pszNodeName,&inAddress.s_addr))
79     {
80 	if (!pszNodeName)
81 	  {
82 	    inAddress.s_addr = htonl ((iFlags & AI_PASSIVE) ? INADDR_ANY : INADDR_LOOPBACK);
83 	  }
84       *pptResult = WspiapiNewAddrInfo(iSocketType, iProtocol, port, inAddress.s_addr);
85       if (!(*pptResult))
86 	  err = EAI_MEMORY;
87 	if (!err && pszNodeName)
88 	  {
89 	    (*pptResult)->ai_flags |= AI_NUMERICHOST;
90 	    if (iFlags & AI_CANONNAME)
91 	      {
92 		(*pptResult)->ai_canonname =
93 		  WspiapiStrdup (inet_ntoa (inAddress));
94 		if (!(*pptResult)->ai_canonname)
95 		  err = EAI_MEMORY;
96 	      }
97 	  }
98     }
99   else if (iFlags & AI_NUMERICHOST)
100     err = EAI_NONAME;
101   else
102     err = WspiapiLookupNode (pszNodeName, iSocketType, iProtocol, port,
103 			       (iFlags & AI_CANONNAME), pptResult);
104   if (!err && isCloned)
105     err = WspiapiClone(udpPort, *pptResult);
106   if (err)
107     {
108 	WspiapiLegacyFreeAddrInfo (*pptResult);
109 	*pptResult = NULL;
110     }
111   return err;
112 }
113