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