1 1.1 manu dnl RACOON_PATH_LIBS(FUNCTION, LIB, SEARCH-PATHS [, ACTION-IF-FOUND 2 1.1 manu dnl [, ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]]) 3 1.1 manu dnl Search for a library defining FUNC, if it's not already available. 4 1.1 manu 5 1.1 manu AC_DEFUN([RACOON_PATH_LIBS], 6 1.1 manu [AC_PREREQ([2.13]) 7 1.1 manu AC_CACHE_CHECK([for $2 containing $1], [ac_cv_search_$1], 8 1.1 manu [ac_func_search_save_LIBS="$LIBS" 9 1.1 manu ac_cv_search_$1="no" 10 1.1 manu AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="none required"], 11 1.1 manu [LIBS="-l$2 $LIBS" 12 1.1 manu AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="-l$2"], [])]) 13 1.1 manu LIBS="$ac_func_search_save_LIBS" 14 1.1 manu ifelse("x$3", "x", , [ test "$ac_cv_search_$1" = "no" && for i in $3; do 15 1.1 manu LIBS="-L$i -l$2 $ac_func_search_save_LIBS" 16 1.1 manu AC_TRY_LINK_FUNC([$1], 17 1.1 manu [ac_cv_search_$1="-L$i -l$2" 18 1.1 manu break]) 19 1.1 manu done 20 1.1 manu LIBS="$ac_func_search_save_LIBS" ]) ]) 21 1.1 manu if test "$ac_cv_search_$1" != "no"; then 22 1.1 manu test "$ac_cv_search_$1" = "none required" || LIBS="$ac_cv_search_$1 $LIBS" 23 1.1 manu $4 24 1.1 manu else : 25 1.1 manu $5 26 1.1 manu fi]) 27 1.1 manu 28 1.1 manu dnl Check if either va_copy() or __va_copy() is available. On linux systems 29 1.1 manu dnl at least one of these should be present. 30 1.1 manu AC_DEFUN([RACOON_CHECK_VA_COPY], [ 31 1.1 manu saved_CFLAGS=$CFLAGS 32 1.1 manu CFLAGS="-Wall -O2" 33 1.1 manu AC_CACHE_CHECK([for an implementation of va_copy()], 34 1.1 manu ac_cv_va_copy,[ 35 1.1 manu AC_TRY_RUN([#include <stdarg.h> 36 1.1 manu void func (int i, ...) { 37 1.1 manu va_list args1, args2; 38 1.1 manu va_start (args1, i); 39 1.1 manu va_copy (args2, args1); 40 1.1 manu if (va_arg (args1, int) != 1 || va_arg (args2, int) != 1) 41 1.1 manu exit (1); 42 1.1 manu va_end (args1); 43 1.1 manu va_end (args2); 44 1.1 manu } 45 1.1 manu int main() { 46 1.1 manu func (0, 1); 47 1.1 manu return 0; 48 1.1 manu }], 49 1.1 manu [ac_cv_va_copy=yes], 50 1.1 manu [ac_cv_va_copy=no], 51 1.1.1.2 manu AC_MSG_WARN(Cross compiling... Unable to test va_copy) 52 1.1.1.2 manu [ac_cv_va_copy=no]) 53 1.1 manu ]) 54 1.1 manu if test x$ac_cv_va_copy != xyes; then 55 1.1 manu AC_CACHE_CHECK([for an implementation of __va_copy()], 56 1.1 manu ac_cv___va_copy,[ 57 1.1 manu AC_TRY_RUN([#include <stdarg.h> 58 1.1 manu void func (int i, ...) { 59 1.1 manu va_list args1, args2; 60 1.1 manu va_start (args1, i); 61 1.1 manu __va_copy (args2, args1); 62 1.1 manu if (va_arg (args1, int) != 1 || va_arg (args2, int) != 1) 63 1.1 manu exit (1); 64 1.1 manu va_end (args1); 65 1.1 manu va_end (args2); 66 1.1 manu } 67 1.1 manu int main() { 68 1.1 manu func (0, 1); 69 1.1 manu return 0; 70 1.1 manu }], 71 1.1 manu [ac_cv___va_copy=yes], 72 1.1 manu [ac_cv___va_copy=no], 73 1.1.1.2 manu AC_MSG_WARN(Cross compiling... Unable to test __va_copy) 74 1.1.1.2 manu [ac_cv___va_copy=no]) 75 1.1 manu ]) 76 1.1 manu fi 77 1.1 manu 78 1.1 manu if test "x$ac_cv_va_copy" = "xyes"; then 79 1.1 manu va_copy_func=va_copy 80 1.1 manu elif test "x$ac_cv___va_copy" = "xyes"; then 81 1.1 manu va_copy_func=__va_copy 82 1.1 manu fi 83 1.1 manu 84 1.1 manu if test -n "$va_copy_func"; then 85 1.1 manu AC_DEFINE_UNQUOTED(VA_COPY,$va_copy_func, 86 1.1 manu [A 'va_copy' style function]) 87 1.1 manu else 88 1.1 manu AC_MSG_WARN([Hmm, neither va_copy() nor __va_copy() found.]) 89 1.1 manu AC_MSG_WARN([Using a generic fallback.]) 90 1.1 manu fi 91 1.1 manu CFLAGS=$saved_CFLAGS 92 1.1 manu unset saved_CFLAGS 93 1.1 manu ]) 94 1.1 manu 95 1.1 manu AC_DEFUN([RACOON_CHECK_BUGGY_GETADDRINFO], [ 96 1.1 manu AC_MSG_CHECKING(getaddrinfo bug) 97 1.1 manu saved_CFLAGS=$CFLAGS 98 1.1 manu CFLAGS="-Wall -O2" 99 1.1 manu AC_TRY_RUN([ 100 1.1 manu #include <sys/types.h> 101 1.1 manu #include <sys/socket.h> 102 1.1 manu #include <netdb.h> 103 1.1 manu #include <stdlib.h> 104 1.1 manu #include <string.h> 105 1.1 manu #include <netinet/in.h> 106 1.1 manu 107 1.1 manu int main() 108 1.1 manu { 109 1.1 manu int passive, gaierr, inet4 = 0, inet6 = 0; 110 1.1 manu struct addrinfo hints, *ai, *aitop; 111 1.1 manu char straddr[INET6_ADDRSTRLEN], strport[16]; 112 1.1 manu 113 1.1 manu for (passive = 0; passive <= 1; passive++) { 114 1.1 manu memset(&hints, 0, sizeof(hints)); 115 1.1 manu hints.ai_family = AF_UNSPEC; 116 1.1 manu hints.ai_flags = passive ? AI_PASSIVE : 0; 117 1.1 manu hints.ai_protocol = IPPROTO_TCP; 118 1.1 manu hints.ai_socktype = SOCK_STREAM; 119 1.1 manu if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) { 120 1.1 manu (void)gai_strerror(gaierr); 121 1.1 manu goto bad; 122 1.1 manu } 123 1.1 manu for (ai = aitop; ai; ai = ai->ai_next) { 124 1.1 manu if (ai->ai_addr == NULL || 125 1.1 manu ai->ai_addrlen == 0 || 126 1.1 manu getnameinfo(ai->ai_addr, ai->ai_addrlen, 127 1.1 manu straddr, sizeof(straddr), strport, sizeof(strport), 128 1.1 manu NI_NUMERICHOST|NI_NUMERICSERV) != 0) { 129 1.1 manu goto bad; 130 1.1 manu } 131 1.1 manu switch (ai->ai_family) { 132 1.1 manu case AF_INET: 133 1.1 manu if (strcmp(strport, "54321") != 0) { 134 1.1 manu goto bad; 135 1.1 manu } 136 1.1 manu if (passive) { 137 1.1 manu if (strcmp(straddr, "0.0.0.0") != 0) { 138 1.1 manu goto bad; 139 1.1 manu } 140 1.1 manu } else { 141 1.1 manu if (strcmp(straddr, "127.0.0.1") != 0) { 142 1.1 manu goto bad; 143 1.1 manu } 144 1.1 manu } 145 1.1 manu inet4++; 146 1.1 manu break; 147 1.1 manu case AF_INET6: 148 1.1 manu if (strcmp(strport, "54321") != 0) { 149 1.1 manu goto bad; 150 1.1 manu } 151 1.1 manu if (passive) { 152 1.1 manu if (strcmp(straddr, "::") != 0) { 153 1.1 manu goto bad; 154 1.1 manu } 155 1.1 manu } else { 156 1.1 manu if (strcmp(straddr, "::1") != 0) { 157 1.1 manu goto bad; 158 1.1 manu } 159 1.1 manu } 160 1.1 manu inet6++; 161 1.1 manu break; 162 1.1 manu case AF_UNSPEC: 163 1.1 manu goto bad; 164 1.1 manu break; 165 1.1 manu default: 166 1.1 manu /* another family support? */ 167 1.1 manu break; 168 1.1 manu } 169 1.1 manu } 170 1.1 manu } 171 1.1 manu 172 1.1 manu if (!(inet4 == 0 || inet4 == 2)) 173 1.1 manu goto bad; 174 1.1 manu if (!(inet6 == 0 || inet6 == 2)) 175 1.1 manu goto bad; 176 1.1 manu 177 1.1 manu if (aitop) 178 1.1 manu freeaddrinfo(aitop); 179 1.1 manu exit(0); 180 1.1 manu 181 1.1 manu bad: 182 1.1 manu if (aitop) 183 1.1 manu freeaddrinfo(aitop); 184 1.1 manu exit(1); 185 1.1 manu } 186 1.1 manu ], 187 1.1 manu AC_MSG_RESULT(good) 188 1.1 manu buggygetaddrinfo=no, 189 1.1 manu AC_MSG_RESULT(buggy) 190 1.1 manu buggygetaddrinfo=yes, 191 1.1.1.2 manu AC_MSG_RESULT(Cross compiling ... Assuming getaddrinfo is not buggy.) 192 1.1.1.2 manu buggygetaddrinfo=no) 193 1.1 manu CFLAGS=$saved_CFLAGS 194 1.1 manu unset saved_CFLAGS 195 1.1 manu ]) 196