Logo Search packages:      
Sourcecode: mingw-w64 version File versions  Download package

WspiapiLegacyGetNameInfo.c
#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;
}

Generated by  Doxygen 1.6.0   Back to index