If I try to compile the newest CVS source of the libwww on a linux
system (SuSE 6.2 with kernel 2.2.12 and glibc-2.1) with support for
reentrant functions (configure --enable-reentrant) I get several error
messages. For instance:
gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I/usr/local/include -I../../modules/md5 -I../../modules/expat/xmlparse -DW3C_ICONS=\"/usr/local/share/w3c-libwww\" -g -O2 -D_REENTRANT -Wp,-MD,.deps/HTDNS.pp -c -fPIC -DPIC HTDNS.c -o .libs/HTDNS.lo
HTDNS.c: In function `HTGetHostByName':
HTDNS.c:287: warning: passing arg 5 of `gethostbyname_r' from incompatible pointer type
HTDNS.c:287: too few arguments to function `gethostbyname_r'
HTDNS.c:287: warning: assignment makes pointer from integer without a cast
HTDNS.c: In function `HTGetHostBySock':
HTDNS.c:331: warning: passing arg 7 of `gethostbyaddr_r' from incompatible pointer type
HTDNS.c:331: too few arguments to function `gethostbyaddr_r'
HTDNS.c:331: warning: assignment makes pointer from integer without a cast
make[4]: *** [HTDNS.lo] Error 1
The reason is a incorrectly use of reentrant functions. In HTDNS:287
(version 2.30) the function gethostbyname_r() is used as
hostelement = gethostbyname_r(hostname, &result, buffer,
HOSTENT_MAX, &thd_errno);
This may be valid for some systems (solaris 2.6, etc.). But in
glibc-2 systems gethostbyname_r() should be used as
int gethostbyname_r (const char *restrict NAME,
struct hostent *restrict RESULT_BUF,
char *restrict BUF,
size_t BUFLEN,
struct hostent **restrict RESULT,
int *restrict H_ERRNOP);
There are some other reentrant functions which are incorrectly used:
gethostbyaddr_r(), ctime_r(), readdir_r()
The function are documented in the glibc-Info-Docs. Because there are
two (Solaris, glibc) or more different headers for the reentrant
functions, the configure-script should respect this.
--
BjÃ¶rn Voigt <bjoern@cs.tu-berlin.de>
WWW: http://www.cs.tu-berlin.de/~bjoern