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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #include "pthread.h"
  2. #include <netdb.h>
  3. #include <string.h>
  4. static pthread_mutex_t getnetby_mutex = PTHREAD_MUTEX_INITIALIZER;
  5. static int
  6. convert (struct netent *ret, struct netent *result,
  7.        char *buf, int buflen)
  8. {
  9.   int len, i;
  10.   if (!buf) return -1;
  11.   *result = *ret;
  12.   result->n_name = (char *) buf;
  13.   /* This is the size. */
  14.   len = strlen (ret->n_name) + 1;
  15.   if (len > buflen) return -1;
  16.   buflen -= len;
  17.   buf += len;
  18.   strcpy (result->n_name, ret->n_name);
  19.   /* How many aliases and how big the buffer should be? There
  20.      is always a NULL pointer. */
  21.   for (len = sizeof (char *), i = 0; ret->n_aliases [i]; i++)
  22.   {
  23.     /* It should be size of (char *) and the length of string
  24.        plus 1. */
  25.     len += strlen (ret->n_aliases [i]) + 1 + sizeof (char *);
  26.   }
  27.   if (len > buflen) return -1;
  28.   /* This is an array of char * for n_aliases. */
  29.   result->n_aliases = (char **) buf;
  30.   buf += (i + 1) * sizeof (char *);
  31.   /* We copy the aliases now. */
  32.   for (i = 0; ret->n_aliases [i]; i++)
  33.   {
  34.     result->n_aliases [i] = (char *) buf;
  35.     strcpy (result->n_aliases [i], ret->n_aliases [i]);
  36.     buf += strlen (ret->n_aliases [i]) + 1;
  37.   }
  38.   /* This is the last one */
  39.   result->n_aliases [i] = NULL;
  40.   return 0;
  41. }
  42. struct netent *
  43. getnetbyaddr_r (long net, int type,
  44.        struct netent *result, char *buffer, int buflen)
  45. {
  46.   struct netent *ret;
  47.   pthread_mutex_lock (&getnetby_mutex);
  48.   ret = getnetbyaddr (net, type);
  49.   if (!ret ||
  50.        convert (ret, result, buffer, buflen) != 0)
  51.   {
  52.     result = NULL;
  53.   }
  54.   pthread_mutex_unlock (&getnetby_mutex);
  55.   return result;
  56. }
  57. struct netent *
  58. getnetbyname_r (const char *name,
  59.        struct netent *result, char *buffer, int buflen)
  60. {
  61.   struct netent *ret;
  62.   pthread_mutex_lock (&getnetby_mutex);
  63.   ret = getnetbyname (name);
  64.   if (!ret ||
  65.        convert (ret, result, buffer, buflen) != 0)
  66.   {
  67.     result = NULL;
  68.   }
  69.   pthread_mutex_unlock (&getnetby_mutex);
  70.   return result;
  71. }
  72. struct netent *
  73. getnetent_r (struct netent *result, char *buffer, int buflen)
  74. {
  75.   struct netent *ret;
  76.   pthread_mutex_lock (&getnetby_mutex);
  77.   ret = getnetent ();
  78.   if (!ret ||
  79.        convert (ret, result, buffer, buflen) != 0)
  80.   {
  81.     result = NULL;
  82.   }
  83.   pthread_mutex_unlock (&getnetby_mutex);
  84.   return result;
  85. }