View Bug Activity | Format For Printing
http://www.gnu.org/software/libc/manual/html_node/Host-Names.html The gethostbyname_r() call accepts a pointer to a struct hostent (&hostbuf in the example) and a pointer to a pointer to a struct hostent (&hp in the example). The result of the lookup is stored in hostbuf itself and hp is set to point at that buffer on success. The hp pointer is returned by the example function, but shouldn't be. The thing it points to has automatic scope and so won't exist when the function returns. Either, The example function gethostname() should accept a (hostent*) as a parameter, or The hostbuf variable should be allocated statically (although that would defeat the purpose of a gethostbyname_r() call in the first place) There is a secondary problem in that there is no (direct) way that the pointer to the auxiliary buffer is passed back to the caller for later release of the allocated memory - leading to a memory leak. Perhaps that could be ignored in example code though?
In case it's of use, the following would work (but it's not very pretty): /* Called like this: struct hostent myhost; char *auxbuf; auxbuf = gethostname( myhost, "www.example.com" ); if( auxbuf ) { /* ... Do something with myhost ... */ free( auxbuf ); } */ char *gethostname( struct hostent *hostbuf, const char *host) { struct hostent hostbuf, *hp; size_t hstbuflen; char *tmphstbuf; int res; int herr; hstbuflen = 1024; tmphstbuf = malloc (hstbuflen); while ((res = gethostbyname_r( host, hostbuf, tmphstbuf, hstbuflen, &hp, &herr)) == ERANGE) { /* Enlarge the buffer. */ hstbuflen *= 2; tmphstbuf = realloc (tmphstbuf, hstbuflen); } /* Check for errors. */ if (res || hp == NULL) return NULL; return tmphstbuf; }