⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gethostby_r.c

📁 linux 下的线程库源码
💻 C
字号:
#include "../pthread.h"#include <netdb.h>#include <string.h>#ifdef __sparc__#define NEED_ALIGNED_ACCESS#endifstatic pthread_mutex_t gethostby_mutex = PTHREAD_MUTEX_INITIALIZER;static intconvert (struct hostent *host, struct hostent *result,       char *buf, int buflen, int *h_errnop){  int len, i;  if (!buf || !h_errnop) return -1;  *h_errnop = h_errno;  *result = *host;  result->h_name = (char *) buf;  /* This is the size. */  len = strlen (host->h_name) + 1;  if (len > buflen) return -1;  buflen -= len;  buf += len;  strcpy ((char *) result->h_name, host->h_name);  /* How many aliases and how big the buffer should be? There     is always a NULL pointer. */  for (len = sizeof (char *), i = 0; host->h_aliases [i]; i++)  {    /* It should be size of (char *) and the length of string       plus 1. */    len += strlen (host->h_aliases [i]) + 1 + sizeof (char *);  }  if (len > buflen) return -1;  buflen -= len;  /* This is an array of char * for h_aliases. */#ifdef NEED_ALIGNED_ACCESS  {      int extra;      extra = 4 - (((unsigned long) buf) & 3);      if (extra != 4) {         if (buflen < extra)             return -1;         buf = (char *) buf + extra;      }  }#endif  result->h_aliases = (char **) buf;  buf += (i + 1) * sizeof (char *);  /* We copy the aliases now. */  for (i = 0; host->h_aliases [i]; i++)  {    result->h_aliases [i] = (char *) buf;    strcpy (result->h_aliases [i], host->h_aliases [i]);    buf += strlen (host->h_aliases [i]) + 1;  }  /* This is the last one */  result->h_aliases [i] = NULL;#if BSD >= 43 || defined(h_addr)  for (len = sizeof (char *), i = 0; host->h_addr_list [i]; i++)  {    /* It should be size of (char *) and the length of string       plus 1. */    len += host->h_length + sizeof (char *);  }  if (len > buflen) return -1;  /* This is an array of char * for h_addr_list. */#ifdef NEED_ALIGNED_ACCESS  {      int extra;      extra = 4 - (((unsigned long) buf) & 0x3);      if (extra != 4) {         if (buflen < extra)             return -1;         buf = ((char *) buf) + extra;      }  }#endif  result->h_addr_list = (char **) buf;  buf += (i + 1) * sizeof (char *);  /* We copy the h_addr_list now. */  for (i = 0; host->h_addr_list [i]; i++)  {    result->h_addr_list [i] = (char *) buf;    memcpy (result->h_addr_list [i], host->h_addr_list [i], host->h_length);    buf += host->h_length;  }  /* This is the last one */  result->h_addr_list [i] = NULL;#else  len = strlen (host->h_addr) + 1 + sizeof (char *);  if (len > buflen) return -1;  result->h_addr = (char *) buf;  strcpy (result->h_addr, host->h_addr);#endif  return 0;}struct hostent *gethostbyaddr_r (const char *addr, int length, int type,       struct hostent *result, char *buffer, int buflen,       int *h_errnop){  struct hostent *host;  pthread_mutex_lock (&gethostby_mutex);  host = gethostbyaddr (addr, length, type);  if (!host ||       convert (host, result, buffer, buflen, h_errnop) != 0)  {    result = NULL;  }  pthread_mutex_unlock (&gethostby_mutex);  return result;}struct hostent *gethostbyname_r (const char *name,       struct hostent *result, char *buffer, int buflen,       int *h_errnop){  struct hostent *host;  pthread_mutex_lock (&gethostby_mutex);  host = gethostbyname (name);  if (!host ||       convert (host, result, buffer, buflen, h_errnop) != 0)  {    result = NULL;  }  pthread_mutex_unlock (&gethostby_mutex);  return result;}struct hostent *gethostent_r (struct hostent *result, char *buffer, int buflen,       int *h_errnop){  struct hostent *host;  pthread_mutex_lock (&gethostby_mutex);  host = gethostent ();  if (!host ||       convert (host, result, buffer, buflen, h_errnop) != 0)  {    result = NULL;  }  pthread_mutex_unlock (&gethostby_mutex);  return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -