Home | History | Annotate | Line # | Download | only in ipsec-tools
acracoon.m4 revision 1.1.1.2
      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