1#define _GNU_SOURCE 2 3#include <netdb.h> 4#include <errno.h> 5#include <stdlib.h> 6 7struct hostent *gethostbyaddr(const void *a, socklen_t l, int af) 8{ 9 static struct hostent *h; 10 size_t size = 63; 11 struct hostent *res; 12 int err; 13 do { 14 free(h); 15 h = malloc(size+=size+1); 16 if (!h) { 17 h_errno = NO_RECOVERY; 18 return 0; 19 } 20 err = gethostbyaddr_r(a, l, af, h, 21 (void *)(h+1), size-sizeof *h, &res, &h_errno); 22 } while (err == ERANGE); 23 return err ? 0 : h; 24} 25