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