/* Test case for gethostbyname_r bug when buffer expansion required. */ #include <netdb.h> #include <arpa/inet.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (void) { const char *host = "www.gnu.org"; /* This code approximates the example code in the library manual. */ struct hostent hostbuf, *hp; size_t hstbuflen; char *tmphstbuf; int res; int herr; hstbuflen = 16; /* Make it way small to ensure ERANGE. */ /* Allocate buffer, remember to free it to avoid memory leakage. */ tmphstbuf = malloc (hstbuflen); while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, &hp, &herr)) == ERANGE) { /* Enlarge the buffer. */ hstbuflen *= 2; tmphstbuf = realloc (tmphstbuf, hstbuflen); } if (res != 0 || hp == NULL) { printf ("gethostbyname_r failed: %s (errno: %m)\n", strerror (res)); if (access ("/etc/resolv.conf", R_OK)) { puts ("DNS probably not set up"); return 0; } return 1; } printf ("Got: %s %s\n", hp->h_name, inet_ntoa (*(struct in_addr *) hp->h_addr)); return 0; }