blob: 1f7e6c15398bb751226e80f8076f7386b6355810 [file] [log] [blame]
dnl RACOON_PATH_LIBS(FUNCTION, LIB, SEARCH-PATHS [, ACTION-IF-FOUND
dnl [, ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])
dnl Search for a library defining FUNC, if it's not already available.
AC_DEFUN([RACOON_PATH_LIBS],
[AC_PREREQ([2.13])
AC_CACHE_CHECK([for $2 containing $1], [ac_cv_search_$1],
[ac_func_search_save_LIBS="$LIBS"
ac_cv_search_$1="no"
AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="none required"],
[LIBS="-l$2 $LIBS"
AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="-l$2"], [])])
LIBS="$ac_func_search_save_LIBS"
ifelse("x$3", "x", , [ test "$ac_cv_search_$1" = "no" && for i in $3; do
LIBS="-L$i -l$2 $ac_func_search_save_LIBS"
AC_TRY_LINK_FUNC([$1],
[ac_cv_search_$1="-L$i -l$2"
break])
done
LIBS="$ac_func_search_save_LIBS" ]) ])
if test "$ac_cv_search_$1" != "no"; then
test "$ac_cv_search_$1" = "none required" || LIBS="$ac_cv_search_$1 $LIBS"
$4
else :
$5
fi])
dnl Check if either va_copy() or __va_copy() is available. On linux systems
dnl at least one of these should be present.
AC_DEFUN([RACOON_CHECK_VA_COPY], [
saved_CFLAGS=$CFLAGS
CFLAGS="-Wall -O2"
AC_CACHE_CHECK([for an implementation of va_copy()],
ac_cv_va_copy,[
AC_TRY_RUN([#include <stdarg.h>
void func (int i, ...) {
va_list args1, args2;
va_start (args1, i);
va_copy (args2, args1);
if (va_arg (args1, int) != 1 || va_arg (args2, int) != 1)
exit (1);
va_end (args1);
va_end (args2);
}
int main() {
func (0, 1);
return 0;
}],
[ac_cv_va_copy=yes],
[ac_cv_va_copy=no],
AC_MSG_WARN(Cross compiling... Unable to test va_copy)
[ac_cv_va_copy=no])
])
if test x$ac_cv_va_copy != xyes; then
AC_CACHE_CHECK([for an implementation of __va_copy()],
ac_cv___va_copy,[
AC_TRY_RUN([#include <stdarg.h>
void func (int i, ...) {
va_list args1, args2;
va_start (args1, i);
__va_copy (args2, args1);
if (va_arg (args1, int) != 1 || va_arg (args2, int) != 1)
exit (1);
va_end (args1);
va_end (args2);
}
int main() {
func (0, 1);
return 0;
}],
[ac_cv___va_copy=yes],
[ac_cv___va_copy=no],
AC_MSG_WARN(Cross compiling... Unable to test __va_copy)
[ac_cv___va_copy=no])
])
fi
if test "x$ac_cv_va_copy" = "xyes"; then
va_copy_func=va_copy
elif test "x$ac_cv___va_copy" = "xyes"; then
va_copy_func=__va_copy
fi
if test -n "$va_copy_func"; then
AC_DEFINE_UNQUOTED(VA_COPY,$va_copy_func,
[A 'va_copy' style function])
else
AC_MSG_WARN([Hmm, neither va_copy() nor __va_copy() found.])
AC_MSG_WARN([Using a generic fallback.])
fi
CFLAGS=$saved_CFLAGS
unset saved_CFLAGS
])
AC_DEFUN([RACOON_CHECK_BUGGY_GETADDRINFO], [
AC_MSG_CHECKING(getaddrinfo bug)
saved_CFLAGS=$CFLAGS
CFLAGS="-Wall -O2"
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main()
{
int passive, gaierr, inet4 = 0, inet6 = 0;
struct addrinfo hints, *ai, *aitop;
char straddr[INET6_ADDRSTRLEN], strport[16];
for (passive = 0; passive <= 1; passive++) {
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_flags = passive ? AI_PASSIVE : 0;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;
if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
(void)gai_strerror(gaierr);
goto bad;
}
for (ai = aitop; ai; ai = ai->ai_next) {
if (ai->ai_addr == NULL ||
ai->ai_addrlen == 0 ||
getnameinfo(ai->ai_addr, ai->ai_addrlen,
straddr, sizeof(straddr), strport, sizeof(strport),
NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
goto bad;
}
switch (ai->ai_family) {
case AF_INET:
if (strcmp(strport, "54321") != 0) {
goto bad;
}
if (passive) {
if (strcmp(straddr, "0.0.0.0") != 0) {
goto bad;
}
} else {
if (strcmp(straddr, "127.0.0.1") != 0) {
goto bad;
}
}
inet4++;
break;
case AF_INET6:
if (strcmp(strport, "54321") != 0) {
goto bad;
}
if (passive) {
if (strcmp(straddr, "::") != 0) {
goto bad;
}
} else {
if (strcmp(straddr, "::1") != 0) {
goto bad;
}
}
inet6++;
break;
case AF_UNSPEC:
goto bad;
break;
default:
/* another family support? */
break;
}
}
}
if (!(inet4 == 0 || inet4 == 2))
goto bad;
if (!(inet6 == 0 || inet6 == 2))
goto bad;
if (aitop)
freeaddrinfo(aitop);
exit(0);
bad:
if (aitop)
freeaddrinfo(aitop);
exit(1);
}
],
AC_MSG_RESULT(good)
buggygetaddrinfo=no,
AC_MSG_RESULT(buggy)
buggygetaddrinfo=yes,
AC_MSG_RESULT(Cross compiling ... Assuming getaddrinfo is not buggy.)
buggygetaddrinfo=no)
CFLAGS=$saved_CFLAGS
unset saved_CFLAGS
])