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