| #define _GNU_SOURCE | |
| #include <netdb.h> | |
| #include <errno.h> | |
| #include <stdlib.h> | |
| struct hostent *gethostbyaddr(const void *a, socklen_t l, int af) | |
| { | |
| static struct hostent *h; | |
| size_t size = 63; | |
| struct hostent *res; | |
| int err; | |
| do { | |
| free(h); | |
| h = malloc(size+=size+1); | |
| if (!h) { | |
| h_errno = NO_RECOVERY; | |
| return 0; | |
| } | |
| err = gethostbyaddr_r(a, l, af, h, | |
| (void *)(h+1), size-sizeof *h, &res, &h_errno); | |
| } while (err == ERANGE); | |
| return err ? 0 : h; | |
| } |