1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#include <pthread.h>
#include <netdb.h>
#include <string.h>
static pthread_mutex_t gethostby_mutex = PTHREAD_MUTEX_INITIALIZER;
static int
convert (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 (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. */
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 += strlen (host->h_addr_list [i]) + 1 + sizeof (char *);
}
if (len > buflen) return -1;
/* This is an array of char * for h_addr_list. */
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;
strcpy (result->h_addr_list [i], host->h_addr_list [i]);
len = strlen (host->h_addr_list [i]);
buf += len + 1;
}
/* 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;
}
|