gethostby_r.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #include <pthread.h>
  2. #include <netdb.h>
  3. #include <string.h>
  4. #include "netdb_r.h"
  5. #ifdef __sparc__
  6. #define NEED_ALIGNED_ACCESS
  7. #endif
  8. static pthread_mutex_t gethostby_mutex = PTHREAD_MUTEX_INITIALIZER;
  9. static int
  10. convert (struct hostent *host, struct hostent *result,
  11.        char *buf, int buflen, int *h_errnop)
  12. {
  13.   int len, i;
  14.   if (!buf || !h_errnop) return -1;
  15.   *h_errnop = h_errno;
  16.   *result = *host;
  17.   result->h_name = (char *) buf;
  18.   /* This is the size. */
  19.   len = strlen (host->h_name) + 1;
  20.   if (len > buflen) return -1;
  21.   buflen -= len;
  22.   buf += len;
  23.   strcpy ((char *) result->h_name, host->h_name);
  24.   /* How many aliases and how big the buffer should be? There
  25.      is always a NULL pointer. */
  26.   for (len = sizeof (char *), i = 0; host->h_aliases [i]; i++)
  27.   {
  28.     /* It should be size of (char *) and the length of string
  29.        plus 1. */
  30.     len += strlen (host->h_aliases [i]) + 1 + sizeof (char *);
  31.   }
  32.   if (len > buflen) return -1;
  33.   buflen -= len;
  34.   /* This is an array of char * for h_aliases. */
  35. #ifdef NEED_ALIGNED_ACCESS
  36.   {
  37.       int extra;
  38.       extra = 4 - (((unsigned long) buf) & 3);
  39.       if (extra != 4) {
  40.          if (buflen < extra)
  41.              return -1;
  42.          buf = (char *) buf + extra;
  43.       }
  44.   }
  45. #endif
  46.   result->h_aliases = (char **) buf;
  47.   buf += (i + 1) * sizeof (char *);
  48.   /* We copy the aliases now. */
  49.   for (i = 0; host->h_aliases [i]; i++)
  50.   {
  51.     result->h_aliases [i] = (char *) buf;
  52.     strcpy (result->h_aliases [i], host->h_aliases [i]);
  53.     buf += strlen (host->h_aliases [i]) + 1;
  54.   }
  55.   /* This is the last one */
  56.   result->h_aliases [i] = NULL;
  57. #if BSD >= 43 || defined(h_addr)
  58.   for (len = sizeof (char *), i = 0; host->h_addr_list [i]; i++)
  59.   {
  60.     /* It should be size of (char *) and the length of string
  61.        plus 1. */
  62.     len += host->h_length + sizeof (char *);
  63.   }
  64.   if (len > buflen) return -1;
  65.   /* This is an array of char * for h_addr_list. */
  66. #ifdef NEED_ALIGNED_ACCESS
  67.   {
  68.       int extra;
  69.       extra = 4 - (((unsigned long) buf) & 0x3);
  70.       if (extra != 4) {
  71.          if (buflen < extra)
  72.              return -1;
  73.          buf = ((char *) buf) + extra;
  74.       }
  75.   }
  76. #endif
  77.   result->h_addr_list = (char **) buf;
  78.   buf += (i + 1) * sizeof (char *);
  79.   /* We copy the h_addr_list now. */
  80.   for (i = 0; host->h_addr_list [i]; i++)
  81.   {
  82.     result->h_addr_list [i] = (char *) buf;
  83.     memcpy (result->h_addr_list [i], host->h_addr_list [i], host->h_length);
  84.     buf += host->h_length;
  85.   }
  86.   /* This is the last one */
  87.   result->h_addr_list [i] = NULL;
  88. #else
  89.   len = strlen (host->h_addr) + 1 + sizeof (char *);
  90.   if (len > buflen) return -1;
  91.   result->h_addr = (char *) buf;
  92.   strcpy (result->h_addr, host->h_addr);
  93. #endif
  94.   return 0;
  95. }
  96. struct hostent *
  97. gethostbyaddr_r (const char *addr, int length, int type,
  98.        struct hostent *result, char *buffer, int buflen,
  99.        int *h_errnop)
  100. {
  101.   struct hostent *host;
  102.   pthread_mutex_lock (&gethostby_mutex);
  103.   host = gethostbyaddr (addr, length, type);
  104.   if (!host ||
  105.        convert (host, result, buffer, buflen, h_errnop) != 0)
  106.   {
  107.     result = NULL;
  108.   }
  109.   pthread_mutex_unlock (&gethostby_mutex);
  110.   return result;
  111. }
  112. struct hostent *
  113. gethostbyname_r (const char *name,
  114.        struct hostent *result, char *buffer, int buflen,
  115.        int *h_errnop)
  116. {
  117.   struct hostent *host;
  118.   pthread_mutex_lock (&gethostby_mutex);
  119.   host = gethostbyname (name);
  120.   if (!host ||
  121.        convert (host, result, buffer, buflen, h_errnop) != 0)
  122.   {
  123.     result = NULL;
  124.   }
  125.   pthread_mutex_unlock (&gethostby_mutex);
  126.   return result;
  127. }
  128. struct hostent *
  129. gethostent_r (struct hostent *result, char *buffer, int buflen,
  130.        int *h_errnop)
  131. {
  132.   struct hostent *host;
  133.   pthread_mutex_lock (&gethostby_mutex);
  134.   host = gethostent ();
  135.   if (!host ||
  136.        convert (host, result, buffer, buflen, h_errnop) != 0)
  137.   {
  138.     result = NULL;
  139.   }
  140.   pthread_mutex_unlock (&gethostby_mutex);
  141.   return result;
  142. }