chiark / gitweb /
eglibc (2.11.3-4+deb6u3) squeeze-lts; urgency=medium
[eglibc.git] / nss / bug-erange.c
1 /* Test case for gethostbyname_r bug when buffer expansion required.  */
2
3 #include <netdb.h>
4 #include <arpa/inet.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10
11 int
12 main (void)
13 {
14   const char *host = "www.gnu.org";
15
16   /* This code approximates the example code in the library manual.  */
17
18   struct hostent hostbuf, *hp;
19   size_t hstbuflen;
20   char *tmphstbuf;
21   int res;
22   int herr;
23
24   hstbuflen = 16;               /* Make it way small to ensure ERANGE.  */
25   /* Allocate buffer, remember to free it to avoid memory leakage.  */
26   tmphstbuf = malloc (hstbuflen);
27
28   while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen,
29                                  &hp, &herr)) == ERANGE)
30     {
31       /* Enlarge the buffer.  */
32       hstbuflen *= 2;
33       tmphstbuf = realloc (tmphstbuf, hstbuflen);
34     }
35
36   if (res != 0 || hp == NULL)
37     {
38       printf ("gethostbyname_r failed: %s (errno: %m)\n", strerror (res));
39
40       if (access ("/etc/resolv.conf", R_OK))
41         {
42           puts ("DNS probably not set up");
43           return 0;
44         }
45
46       return 1;
47     }
48
49   printf ("Got: %s %s\n", hp->h_name,
50           inet_ntoa (*(struct in_addr *) hp->h_addr));
51   return 0;
52 }