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 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 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 #include #include #include #include #include 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 ])