#include <port_before.h>
#include <netdb.h>
#include <port_after.h>
#ifdef DO_PTHREADS
#include <pthread.h>
#include <stdlib.h>
#endif
static const char *gai_errlist[] = {
"no error",
"address family not supported for name",
"temporary failure",
"invalid flags",
"permanent failure",
"address family not supported",
"memory failure",
"no address",
"unknown name or service",
"service not supported for socktype",
"socktype not supported",
"system failure",
"bad hints",
"bad protocol",
"unknown error"
};
static const int gai_nerr = (sizeof(gai_errlist)/sizeof(*gai_errlist));
#define EAI_BUFSIZE 128
const char *
gai_strerror(int ecode) {
#ifndef DO_PTHREADS
static char buf[EAI_BUFSIZE];
#else
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_key_t key;
static int once = 0;
char *buf;
#endif
if (ecode >= 0 && ecode < (gai_nerr - 1))
return (gai_errlist[ecode]);
#ifdef DO_PTHREADS
if (!once) {
pthread_mutex_lock(&lock);
if (!once++)
pthread_key_create(&key, free);
pthread_mutex_unlock(&lock);
}
buf = pthread_getspecific(key);
if (buf == NULL) {
buf = malloc(EAI_BUFSIZE);
if (buf == NULL)
return ("unknown error");
pthread_setspecific(key, buf);
}
#endif
sprintf(buf, "%s: %d", gai_errlist[gai_nerr - 1], ecode);
return (buf);
}