master
 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
 9int WINAPI
10WspiapiLookupNode (const char *pszNodeName,
11		   int iSocketType, int iProtocol,
12		   WORD wPort, WINBOOL bAI_CANONNAME,
13		   struct addrinfo **pptResult)
14{
15  int err = 0, cntAlias = 0;
16  char name[NI_MAXHOST] = "";
17  char alias[NI_MAXHOST] = "";
18  char *pname = name, *palias = alias, *tmp = NULL;
19
20  strncpy (pname, pszNodeName, NI_MAXHOST - 1);
21  pname[NI_MAXHOST - 1] = 0;
22  for (;;)
23    {
24	err = WspiapiQueryDNS (pszNodeName, iSocketType, iProtocol, wPort, palias, pptResult);
25	if (err)
26	  break;
27	if (*pptResult)
28	  break;
29	++cntAlias;
30	if (strlen (palias) == 0 || !strcmp (pname, palias) || cntAlias == 16)
31	  {
32	    err = EAI_FAIL;
33	    break;
34	  }
35	WspiapiSwap(pname, palias, tmp);
36    }
37  if (!err && bAI_CANONNAME)
38    {
39      (*pptResult)->ai_canonname = WspiapiStrdup (palias);
40      if (!(*pptResult)->ai_canonname)
41	  err = EAI_MEMORY;
42    }
43  return err;
44}