about summary refs log tree commit diff
path: root/src/network/gethostbyname2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/gethostbyname2.c')
-rw-r--r--src/network/gethostbyname2.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/network/gethostbyname2.c b/src/network/gethostbyname2.c
index 9fbe2647..c9f90da2 100644
--- a/src/network/gethostbyname2.c
+++ b/src/network/gethostbyname2.c
@@ -4,13 +4,24 @@
 #include <netdb.h>
 #include <string.h>
 #include <netinet/in.h>
+#include <errno.h>
+#include <stdlib.h>
 
 struct hostent *gethostbyname2(const char *name, int af)
 {
-	static struct hostent h;
-	static long buf[512/sizeof(long)];
+	static struct hostent *h;
+	size_t size = 63;
 	struct hostent *res;
-	if (gethostbyname2_r(name, 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 = gethostbyname2_r(name, af, h,
+			(void *)(h+1), size-sizeof *h, &res, &h_errno);
+	} while (err == ERANGE);
+	return err ? 0 : h;
 }