getservby_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 getservby_mutex = PTHREAD_MUTEX_INITIALIZER;
  5. static int
  6. convert (struct servent *ret, struct servent *result,
  7.        char *buf, int buflen)
  8. {
  9.   int len, i;
  10.   if (!buf) return -1;
  11.   *result = *ret;
  12.   /* This is the size. */
  13.   len = strlen (ret->s_name) + 1;
  14.   if (len > buflen) return -1;
  15.   buflen -= len;
  16.   result->s_name = (char *) buf;
  17.   buf += len;
  18.   strcpy (result->s_name, ret->s_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->s_aliases [i]; i++)
  22.   {
  23.     /* It should be size of (char *) and the length of string
  24.        plus 1. */
  25.     len += strlen (ret->s_aliases [i]) + 1 + sizeof (char *);
  26.   }
  27.   if (len > buflen) return -1;
  28.   buflen -= len;
  29.   /* This is an array of char * for s_aliases. */
  30.   result->s_aliases = (char **) buf;
  31.   buf += (i + 1) * sizeof (char *);
  32.   /* We copy the aliases now. */
  33.   for (i = 0; ret->s_aliases [i]; i++)
  34.   {
  35.     result->s_aliases [i] = (char *) buf;
  36.     strcpy (result->s_aliases [i], ret->s_aliases [i]);
  37.     buf += strlen (ret->s_aliases [i]) + 1;
  38.   }
  39.   /* This is the last one */
  40.   result->s_aliases [i] = NULL;
  41.   /* s_proto */
  42.   len = strlen (ret->s_proto) + 1;
  43.   if (len > buflen) return -1;
  44.   buf += len;
  45.   result->s_proto = (char *) buf;
  46.   strcpy (result->s_proto, ret->s_proto);
  47.   return 0;
  48. }
  49. struct servent *
  50. getservbyport_r (int port, const char *proto,
  51.        struct servent *result, char *buffer, int buflen)
  52. {
  53.   struct servent *ret;
  54.   pthread_mutex_lock (&getservby_mutex);
  55.   ret = getservbyport (port, proto);
  56.   if (!ret ||
  57.        convert (ret, result, buffer, buflen) != 0)
  58.   {
  59.     result = NULL;
  60.   }
  61.   pthread_mutex_unlock (&getservby_mutex);
  62.   return result;
  63. }
  64. struct servent *
  65. getservbyname_r (const char *name, const char *proto,
  66.        struct servent *result, char *buffer, int buflen)
  67. {
  68.   struct servent *ret;
  69.   pthread_mutex_lock (&getservby_mutex);
  70.   ret = getservbyname (name, proto);
  71.   if (!ret ||
  72.        convert (ret, result, buffer, buflen) != 0)
  73.   {
  74.     result = NULL;
  75.   }
  76.   pthread_mutex_unlock (&getservby_mutex);
  77.   return result;
  78. }
  79. struct servent *
  80. getservent_r (struct servent *result, char *buffer, int buflen)
  81. {
  82.   struct servent *ret;
  83.   pthread_mutex_lock (&getservby_mutex);
  84.   ret = getservent ();
  85.   if (!ret ||
  86.        convert (ret, result, buffer, buflen) != 0)
  87.   {
  88.     result = NULL;
  89.   }
  90.   pthread_mutex_unlock (&getservby_mutex);
  91.   return result;
  92. }