Fix build for systems that don't provide POSIX.1-2001 by default
We require POSIX.1-2001. Some systems provide it only with feature
test macro _POSIX_C_SOURCE defined to 200112L. Since we don't define
it, the build fails there. Observed on Solaris 10.
We actually require the XSI extension. The GNU C Library provides it
by default. With _POSIX_C_SOURCE 200112L, however, you have to define
feature test macro _XOPEN_SOURCE to get it. But then _POSIX_C_SOURCE
is redundant.
Make configure put #define _XOPEN_SOURCE 600 into config.h. Drop the
two existing #define _XOPEN_SOURCE 500 in .c files.
Now Solaris cc refuses to play ball unless switched to C99. Replace
AC_PROG_CC by AC_PROG_CC_STDC to mollify it.
Unfortunately, use of _XOPEN_SOURCE exposes bugs in AIX libc and old
versions of GNU libc:
* AIX defines struct in6_addr's member s6_addr as a macro expanding
into the actual member. Without _ALL_SOURCE (the default), the
expansion is wrong and doesn't compile. Observed with AIX V7.2.
* GNU lib's IN6_IS_ADDR_V4MAPPED() is unusable without
_DEFAULT_SOURCE (default) or _GNU_SOURCE. Observed with Debian 8.
Tracked at <https://sourceware.org/bugzilla/show_bug.cgi?id=16421>,
fixed in version 2.25.
Affects just sockaddr_ntop()'s special case from commit 372cdb136
"Use
IPv4 format for IPv4-mapped addresses", v4.3.31. Disable the special
case and use IPv6 format on such systems. This is a very minor
usability regression. Could be avoided, I guess, but it's not worth
the trouble.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
parent
8e00a61812
commit
d6c5c263b9
7 changed files with 39 additions and 11 deletions
20
m4/my_working_in6_is_addr_v4mapped.m4
Normal file
20
m4/my_working_in6_is_addr_v4mapped.m4
Normal file
|
@ -0,0 +1,20 @@
|
|||
AC_DEFUN([MY_WORKING_IN6_IS_ADDR_V4MAPPED], [
|
||||
AC_CACHE_CHECK([whether IN6_IS_ADDR_V4MAPPED works],
|
||||
my_cv_func_in6_is_addr_v4mapped, [
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_SOURCE([[#include <netinet/in.h>
|
||||
int foo(struct sockaddr_in6 *sap6)
|
||||
{
|
||||
return IN6_IS_ADDR_V4MAPPED(&sap6->sin6_addr);
|
||||
}]])],
|
||||
[my_cv_func_in6_is_addr_v4mapped=yes],
|
||||
[my_cv_func_in6_is_addr_v4mapped=no])])
|
||||
AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_addr.s6_addr],
|
||||
[my_member_sockaddr_in6_sin6_addr_s6_addr=yes],
|
||||
[my_member_sockaddr_in6_sin6_addr_s6_addr=no],
|
||||
[[#include <netinet/in.h>]])
|
||||
if test "x$my_cv_func_in6_is_addr_v4mapped$my_member_sockaddr_in6_sin6_addr_s6_addr" = xyesyes; then
|
||||
AC_DEFINE([HAVE_WORKING_IN6_IS_ADDR_V4MAPPED], [1],
|
||||
[Define if you have a working IN6_IS_ADDR_V4MAPPED()])
|
||||
fi
|
||||
])
|
Loading…
Add table
Add a link
Reference in a new issue