2.0.0-pre1 - cannot build on FreeBSD

David Wood david at wood2.org.uk
Mon May 28 21:39:05 CEST 2007


Hi Nicolas,

In message <20070528110552.GC378 at asuka.tech.sitadelle.com>, Nicolas 
Baradakis <nbk at sitadelle.com> writes
>David Wood wrote:
>
>> I've put in quite a bit of work today towards porting 2.0.0-pre1 to
>> FreeBSD, with the intention of submitting a FreeRADIUS 2 port as soon as
>> possible.
>>
>> Unfortunately, there's a problem which I don't have the autoconf skills
>> to patch quickly. When checking (and later attempting to use) net/if.h,
>> you need to #include sys/socket.h on FreeBSD to get the definition of
>> struct sockaddr.
>
>Thanks for the report. I hope the following changes in CVS head will
>solve the problem. (you also need to run autoconf)

That solves that problem - thanks. As you've committed that to the CVS 
head, the chances are that that problem is fixed for good - and it may 
help out on other BSD and BSD like operating systems.


Fortunately it's a two line change in the port's Makefile to delete 
configure after applying the patch and run configure.in through autoconf 
2.61 - though if I don't need to do that, I don't, as it means that the 
port doesn't force systems without autoconf 2.61 to build and install 
autoconf.

That said, there's a problem in the 1.x port that I want to fix in 2.x 
(and eventually backport to 1.x) which will require me to patch 
configure.in - so I'll probably finish up depending on autoconf anyway.



Back to 2.0.0-pre1. Fixing that problem reveals another problem - 
src/lib/getaddrinfo.c (a new file in 2.x) attempts to redefine 
gethostbyaddr_r():

/usr/local/bin/libtool --mode=compile cc  -O -pipe -march=pentium3 
-I/usr/local/include -L/usr/local/lib -D_REENTRANT 
-D_POSIX_PTHREAD_SEMANTICS -Wall -D_GNU_SOURCE -DNDEBUG -D_LIBRADIUS 
-I/var/ports/usr/ports_updated/net/freeradius2/work/freeradius-server-2.0
.0-p
re1/src -c getaddrinfo.c
  cc -O -pipe -march=pentium3 -I/usr/local/include -L/usr/local/lib 
-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -Wall -D_GNU_SOURCE -DNDEBUG 
-D_LIBRADIUS 
-I/var/ports/usr/ports_updated/net/freeradius2/work/freeradius-server-2.0
.0-pre1/src -c getaddrinfo.c  -fPIC -DPIC -o .libs/getaddrinfo.o
getaddrinfo.c:159: error: conflicting types for 'gethostbyaddr_r'
/usr/include/netdb.h:225: error: previous declaration of 
'gethostbyaddr_r' was here
getaddrinfo.c:159: error: conflicting types for 'gethostbyaddr_r'
/usr/include/netdb.h:225: error: previous declaration of 
'gethostbyaddr_r' was here
getaddrinfo.c:26: warning: 'lrad_hostbyname' defined but not used
getaddrinfo.c:28: warning: 'lrad_hostbyname_mutex' defined but not used
getaddrinfo.c:159: warning: 'gethostbyaddr_r' defined but not used
gmake[4]: *** [getaddrinfo.lo] Error 1


There's a comment in configure.in, at line 900 (after applying your 
patch), about Tru64 having a BSD style function gethostbyaddr_r() 
function that's thread safe. The same is true of FreeBSD now - the BSD 
style gethostbyaddr_r() function is thread safe on FreeBSD since at 
least FreeBSD 4.11. FreeBSD 4.x is now end of life, and the only 
supported versions of FreeBSD are 5.x and 6.x - with 7.x under 
development, so that means all supported (and even some legacy) versions 
of FreeBSD have a thread safe (but three argument BSD style) function 
built in.

The FreeBSD ports system has dropped support for 4.x, but I haven't 
removed the 4.x specific stuff from the FreeRADIUS 1.x port. I'm not 
going to support 4.x on FreeRADIUS 2.x, however - I would be very 
unlikely to get any new port with 4.x support committed now.

<http://www.freebsd.org/cgi/man.cgi?query=gethostbyname&apropos=0&sektion
=3&manpath=FreeBSD+6.2-RELEASE&format=html> is the reference to the 
appropriate man page - see the second paragraph under BUGS for the 
reference to thread safety.


The prototype for gethostbyaddr_r is included via #include <netdb.h>, 
which configure is picking up as available on FreeBSD. That's the same 
header as the C compiler is flagging up in the errors.


I suspect this problem will affect all other systems which finish up the 
configure run with #define GETHOSTBYADDRRSTYLE BSDSTYLE in confdefs.h 
and that also have a prototype for the built-in gethostbyaddr_r() 
netdb.h (or another header file that FreeRADIUS finishes up #including). 
The logic in src/lib/getaddrinfo.c makes this attempted redefinition 
near certain on many BSD and BSD-like systems:

#undef LOCAL_GETHOSTBYADDRR
#ifndef GETHOSTBYADDRRSTYLE
#define LOCAL_GETHOSTBYADDRR 1
#elif (GETHOSTBYADDRRSTYLE != SYSVSTYLE) && (GETHOSTBYADDRRSTYLE != 
GNUSTYLE)
#define LOCAL_GETHOSTBYADDRR 1
#endif /* GETHOSTBYADDRRSTYLE */

If GETHOSTBYADDRRSTYLE is BSDSTYLE, LOCAL_GETHOSTBYADDRR is #defined to 
1, which means the block of code around line 180 that begins #ifdef 
LOCAL_GETHOSTBYADDRR will be compiled, attempting to redefine 
gethostbyaddr_r(). However, if GETHOSTBYADDRRSTYLE is BSDSTYLE rather 
than not defined, the chances are that you've already #included the 
header that contains the prototype for the system gethostbyaddr_r().



As an aside, FreeBSD 6.2-RELEASE-p4 i386, which is the OS on my 
development box, finishes up with #define GETHOSTBYNAMERSTYLE GNUSTYLE 
in confdefs.h - so there won't be a similar problem with redefining 
gethostbyname_r on FreeBSD - but there may be on other operating 
systems.



As this one doesn't involve autoconf, I could attempt to come up with a 
patch. I'm comfortable enough in C - it's autoconf that I lack 
experience with. However, I'd rather throw this back to the developers 
and let you come up with a solution that matches your design intent.


If you let me have a patch, I'll keep on testing. As always, let me know 
if you want any more information.



Best wishes,




David
-- 
David Wood
david at wood2.org.uk



More information about the Freeradius-Users mailing list