|
@@ -3,13 +3,24 @@
|
|
|
#include <netdb.h>
|
|
|
#include <string.h>
|
|
|
#include <netinet/in.h>
|
|
|
+#include <errno.h>
|
|
|
+#include <stdlib.h>
|
|
|
|
|
|
struct hostent *gethostbyaddr(const void *a, socklen_t l, int af)
|
|
|
{
|
|
|
- static struct hostent h;
|
|
|
- static long buf[512/sizeof(long)];
|
|
|
+ static struct hostent *h;
|
|
|
+ size_t size = 63;
|
|
|
struct hostent *res;
|
|
|
- if (gethostbyaddr_r(a, l, af, &h,
|
|
|
- (void *)buf, sizeof buf, &res, &h_errno)) return 0;
|
|
|
- return &h;
|
|
|
+ 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;
|
|
|
}
|