#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#undef  __CRT__NO_INLINE
#define __CRT__NO_INLINE
#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 *ptService;
  WORD wPort;
  char szBuffer[] = "65535";
  char *pszService = szBuffer;
  struct hostent *ptHost;
  struct in_addr tAddress;
  char *pszNode = NULL;
  char *pc = NULL;

  if ((!ptSocketAddress) || ((size_t)tSocketLength < sizeof(struct sockaddr)))
    return EAI_FAIL;
  if (ptSocketAddress->sa_family != (unsigned short)AF_INET)
    return EAI_FAMILY;
  if ((size_t) tSocketLength < sizeof(struct sockaddr_in))
    return EAI_FAIL;
  if (!(pszNodeName && tNodeLength) && !(pszServiceName && tServiceLength))
    return EAI_NONAME;
  if ((iFlags & NI_NUMERICHOST) && (iFlags & NI_NAMEREQD))
    return EAI_BADFLAGS;
  if (pszServiceName && tServiceLength) {
    wPort = ((struct sockaddr_in *) ptSocketAddress)->sin_port;
    if(iFlags & NI_NUMERICSERV) {
      _WSPIAPI_SPRINTF_S_1(szBuffer,_WSPIAPI_COUNTOF(szBuffer),"%u",ntohs(wPort));
    } else {
      ptService = getservbyport(wPort, (iFlags & NI_DGRAM) ? "udp" : NULL);
      if (ptService && ptService->s_name) {
	pszService = ptService->s_name;
      } else {
	_WSPIAPI_SPRINTF_S_1(szBuffer,_WSPIAPI_COUNTOF(szBuffer),"%u",ntohs(wPort));
      }
    }
    if (tServiceLength > strlen(pszService))
      _WSPIAPI_STRCPY_S(pszServiceName,tServiceLength,pszService);
    else
      return EAI_FAIL;
  }
  if (pszNodeName && tNodeLength) {
    tAddress = ((struct sockaddr_in *) ptSocketAddress)->sin_addr;
    if (iFlags & NI_NUMERICHOST) {
      pszNode = inet_ntoa(tAddress);
    } else {
      ptHost = gethostbyaddr((char *) &tAddress, sizeof(struct in_addr), AF_INET);
      if(ptHost && ptHost->h_name) {
	pszNode = ptHost->h_name;
	if ((iFlags & NI_NOFQDN) && ((pc = strchr(pszNode,'.')) != NULL))
	  *pc = '\0';
      } else {
	if (iFlags & NI_NAMEREQD) {
	  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 {
	  pszNode = inet_ntoa(tAddress);
	}
      }
    }
    if (tNodeLength > strlen(pszNode))
      _WSPIAPI_STRCPY_S(pszNodeName,tNodeLength,pszNode);
    else
      return EAI_FAIL;
  }
  return 0;
}
