dynamically allocate storage for gethostby* buffers
[musl] / src / network / gethostbyname2.c
index 9fbe264..c9f90da 100644 (file)
@@ -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;
 }