gethostbyaddr.c 463 B

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