John Lightsey filed bug report #1999181: "CLOCK_MONOTONIC always fails on
[platform/upstream/curl.git] / acinclude.m4
1 #***************************************************************************
2 #                                  _   _ ____  _
3 #  Project                     ___| | | |  _ \| |
4 #                             / __| | | | |_) | |
5 #                            | (__| |_| |  _ <| |___
6 #                             \___|\___/|_| \_\_____|
7 #
8 # Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
9 #
10 # This software is licensed as described in the file COPYING, which
11 # you should have received as part of this distribution. The terms
12 # are also available at http://curl.haxx.se/docs/copyright.html.
13 #
14 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 # copies of the Software, and permit persons to whom the Software is
16 # furnished to do so, under the terms of the COPYING file.
17 #
18 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 # KIND, either express or implied.
20 #
21 # $Id$
22 ###########################################################################
23
24
25 dnl CURL_CHECK_COMPILER_HALT_ON_ERROR
26 dnl -------------------------------------------------
27 dnl Verifies if the compiler actually halts after the
28 dnl compilation phase without generating any object
29 dnl code file, when the source compiles with errors.
30
31 AC_DEFUN([CURL_CHECK_COMPILER_HALT_ON_ERROR], [
32   AC_MSG_CHECKING([if compiler halts on compilation errors])
33   AC_COMPILE_IFELSE([
34     AC_LANG_PROGRAM([[
35     ]],[[
36       force compilation error
37     ]])
38   ],[
39     AC_MSG_RESULT([no])
40     AC_MSG_ERROR([compiler does not halt on compilation errors.])
41   ],[
42     AC_MSG_RESULT([yes])
43   ])
44 ])
45
46
47 dnl CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
48 dnl -------------------------------------------------
49 dnl Verifies if the compiler actually halts after the
50 dnl compilation phase without generating any object
51 dnl code file, when the source code tries to define a
52 dnl type for a constant array with negative dimension.
53
54 AC_DEFUN([CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE], [
55   AC_REQUIRE([CURL_CHECK_COMPILER_HALT_ON_ERROR])dnl
56   AC_MSG_CHECKING([if compiler halts on negative sized arrays])
57   AC_COMPILE_IFELSE([
58     AC_LANG_PROGRAM([[
59       typedef char bad_t[sizeof(char) == sizeof(int) ? -1 : -1 ];
60     ]],[[
61       bad_t dummy;
62     ]])
63   ],[
64     AC_MSG_RESULT([no])
65     AC_MSG_ERROR([compiler does not halt on negative sized arrays.])
66   ],[
67     AC_MSG_RESULT([yes])
68   ])
69 ])
70
71
72 dnl CURL_CHECK_DEF(SYMBOL, [INCLUDES], [SILENT])
73 dnl -------------------------------------------------
74 dnl Use the C preprocessor to find out if the given object-style symbol
75 dnl is defined and get its expansion. This macro will not use default
76 dnl includes even if no INCLUDES argument is given. This macro will run
77 dnl silently when invoked with three arguments.
78
79 AC_DEFUN([CURL_CHECK_DEF], [
80   AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl
81   AS_VAR_PUSHDEF([ac_Def], [curl_cv_def_$1])dnl
82   ifelse($3,,[AC_MSG_CHECKING([for preprocessor definition of $1])])
83   tmp_exp=""
84   AC_PREPROC_IFELSE([
85     AC_LANG_SOURCE(
86 ifelse($2,,,[$2])[[
87 #ifdef $1
88 CURL_DEF_TOKEN $1
89 #endif
90     ]])
91   ],[
92     tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
93       "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
94       "$SED" 's/.*CURL_DEF_TOKEN[[ ]]//' 2>/dev/null | \
95       "$SED" 'q' 2>/dev/null`
96     if test "$tmp_exp" = "$1"; then
97       tmp_exp=""
98     fi
99   ])
100   if test -z "$tmp_exp"; then
101     AS_VAR_SET([ac_HaveDef], [no])
102     ifelse($3,,[AC_MSG_RESULT([no])])
103   else
104     AS_VAR_SET([ac_HaveDef], [yes])
105     AS_VAR_SET([ac_Def], [$tmp_exp])
106     ifelse($3,,[AC_MSG_RESULT([$tmp_exp])])
107   fi
108   AS_VAR_POPDEF([ac_Def])dnl
109   AS_VAR_POPDEF([ac_HaveDef])dnl
110 ])
111
112
113 dnl CURL_CHECK_HEADER_WINDOWS
114 dnl -------------------------------------------------
115 dnl Check for compilable and valid windows.h header 
116
117 AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
118   AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
119     AC_COMPILE_IFELSE([
120       AC_LANG_PROGRAM([[
121 #undef inline
122 #ifndef WIN32_LEAN_AND_MEAN
123 #define WIN32_LEAN_AND_MEAN
124 #endif
125 #include <windows.h>
126       ]],[[
127 #if defined(__CYGWIN__) || defined(__CEGCC__)
128         HAVE_WINDOWS_H shall not be defined.
129 #else
130         int dummy=2*WINVER;
131 #endif
132       ]])
133     ],[
134       ac_cv_header_windows_h="yes"
135     ],[
136       ac_cv_header_windows_h="no"
137     ])
138   ])
139   case "$ac_cv_header_windows_h" in
140     yes)
141       AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
142         [Define to 1 if you have the windows.h header file.])
143       AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
144         [Define to avoid automatic inclusion of winsock.h])
145       ;;
146   esac
147 ])
148
149
150 dnl CURL_CHECK_NATIVE_WINDOWS
151 dnl -------------------------------------------------
152 dnl Check if building a native Windows target
153
154 AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
155   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
156   AC_CACHE_CHECK([whether build target is a native Windows one], [ac_cv_native_windows], [
157     if test "$ac_cv_header_windows_h" = "no"; then
158       ac_cv_native_windows="no"
159     else
160       AC_COMPILE_IFELSE([
161         AC_LANG_PROGRAM([[
162         ]],[[
163 #if defined(__MINGW32__) || defined(__MINGW32CE__) || \
164    (defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)))
165           int dummy=1;
166 #else
167           Not a native Windows build target.
168 #endif
169         ]])
170       ],[
171         ac_cv_native_windows="yes"
172       ],[
173         ac_cv_native_windows="no"
174       ])
175     fi
176   ])
177   case "$ac_cv_native_windows" in
178     yes)
179       AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
180         [Define to 1 if you are building a native Windows target.])
181       ;;
182   esac
183 ])
184
185
186 dnl CURL_CHECK_HEADER_WINSOCK
187 dnl -------------------------------------------------
188 dnl Check for compilable and valid winsock.h header 
189
190 AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
191   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
192   AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
193     AC_COMPILE_IFELSE([
194       AC_LANG_PROGRAM([[
195 #undef inline
196 #ifndef WIN32_LEAN_AND_MEAN
197 #define WIN32_LEAN_AND_MEAN
198 #endif
199 #include <windows.h>
200 #include <winsock.h>
201       ]],[[
202 #if defined(__CYGWIN__) || defined(__CEGCC__)
203         HAVE_WINSOCK_H shall not be defined.
204 #else
205         int dummy=WSACleanup();
206 #endif
207       ]])
208     ],[
209       ac_cv_header_winsock_h="yes"
210     ],[
211       ac_cv_header_winsock_h="no"
212     ])
213   ])
214   case "$ac_cv_header_winsock_h" in
215     yes)
216       AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
217         [Define to 1 if you have the winsock.h header file.])
218       ;;
219   esac
220 ])
221
222
223 dnl CURL_CHECK_HEADER_WINSOCK2
224 dnl -------------------------------------------------
225 dnl Check for compilable and valid winsock2.h header 
226
227 AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
228   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
229   AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
230     AC_COMPILE_IFELSE([
231       AC_LANG_PROGRAM([[
232 #undef inline
233 #ifndef WIN32_LEAN_AND_MEAN
234 #define WIN32_LEAN_AND_MEAN
235 #endif
236 #include <windows.h>
237 #include <winsock2.h>
238       ]],[[
239 #if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__)
240         HAVE_WINSOCK2_H shall not be defined.
241 #else
242         int dummy=2*IPPROTO_ESP;
243 #endif
244       ]])
245     ],[
246       ac_cv_header_winsock2_h="yes"
247     ],[
248       ac_cv_header_winsock2_h="no"
249     ])
250   ])
251   case "$ac_cv_header_winsock2_h" in
252     yes)
253       AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
254         [Define to 1 if you have the winsock2.h header file.])
255       ;;
256   esac
257 ])
258
259
260 dnl CURL_CHECK_HEADER_WS2TCPIP
261 dnl -------------------------------------------------
262 dnl Check for compilable and valid ws2tcpip.h header
263
264 AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
265   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
266   AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
267     AC_COMPILE_IFELSE([
268       AC_LANG_PROGRAM([[
269 #undef inline
270 #ifndef WIN32_LEAN_AND_MEAN
271 #define WIN32_LEAN_AND_MEAN
272 #endif
273 #include <windows.h>
274 #include <winsock2.h>
275 #include <ws2tcpip.h>
276       ]],[[
277 #if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__)
278         HAVE_WS2TCPIP_H shall not be defined.
279 #else
280         int dummy=2*IP_PKTINFO;
281 #endif
282       ]])
283     ],[
284       ac_cv_header_ws2tcpip_h="yes"
285     ],[
286       ac_cv_header_ws2tcpip_h="no"
287     ])
288   ])
289   case "$ac_cv_header_ws2tcpip_h" in
290     yes)
291       AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
292         [Define to 1 if you have the ws2tcpip.h header file.])
293       ;;
294   esac
295 ])
296
297
298 dnl CURL_CHECK_HEADER_WINLDAP
299 dnl -------------------------------------------------
300 dnl Check for compilable and valid winldap.h header
301
302 AC_DEFUN([CURL_CHECK_HEADER_WINLDAP], [
303   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
304   AC_CACHE_CHECK([for winldap.h], [ac_cv_header_winldap_h], [
305     AC_COMPILE_IFELSE([
306       AC_LANG_PROGRAM([[
307 #undef inline
308 #ifdef HAVE_WINDOWS_H
309 #ifndef WIN32_LEAN_AND_MEAN
310 #define WIN32_LEAN_AND_MEAN
311 #endif
312 #include <windows.h>
313 #endif
314 #include <winldap.h>
315       ]],[[
316 #if defined(__CYGWIN__) || defined(__CEGCC__)
317         HAVE_WINLDAP_H shall not be defined.
318 #else
319         LDAP *ldp = ldap_init("dummy", LDAP_PORT);
320         ULONG res = ldap_unbind(ldp);
321 #endif
322       ]])
323     ],[
324       ac_cv_header_winldap_h="yes"
325     ],[
326       ac_cv_header_winldap_h="no"
327     ])
328   ])
329   case "$ac_cv_header_winldap_h" in
330     yes)
331       AC_DEFINE_UNQUOTED(HAVE_WINLDAP_H, 1,
332         [Define to 1 if you have the winldap.h header file.])
333       ;;
334   esac
335 ])
336
337
338 dnl CURL_CHECK_HEADER_WINBER
339 dnl -------------------------------------------------
340 dnl Check for compilable and valid winber.h header
341
342 AC_DEFUN([CURL_CHECK_HEADER_WINBER], [
343   AC_REQUIRE([CURL_CHECK_HEADER_WINLDAP])dnl
344   AC_CACHE_CHECK([for winber.h], [ac_cv_header_winber_h], [
345     AC_COMPILE_IFELSE([
346       AC_LANG_PROGRAM([[
347 #undef inline
348 #ifdef HAVE_WINDOWS_H
349 #ifndef WIN32_LEAN_AND_MEAN
350 #define WIN32_LEAN_AND_MEAN
351 #endif
352 #include <windows.h>
353 #endif
354 #include <winldap.h>
355 #include <winber.h>
356       ]],[[
357 #if defined(__CYGWIN__) || defined(__CEGCC__)
358         HAVE_WINBER_H shall not be defined.
359 #else
360         BERVAL *bvp = NULL;
361         BerElement *bep = ber_init(bvp);
362         ber_free(bep, 1);
363 #endif
364       ]])
365     ],[
366       ac_cv_header_winber_h="yes"
367     ],[
368       ac_cv_header_winber_h="no"
369     ])
370   ])
371   case "$ac_cv_header_winber_h" in
372     yes)
373       AC_DEFINE_UNQUOTED(HAVE_WINBER_H, 1,
374         [Define to 1 if you have the winber.h header file.])
375       ;;
376   esac
377 ])
378
379
380 dnl CURL_CHECK_HEADER_LBER
381 dnl -------------------------------------------------
382 dnl Check for compilable and valid lber.h header,
383 dnl and check if it is needed even with ldap.h
384
385 AC_DEFUN([CURL_CHECK_HEADER_LBER], [
386   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
387   AC_CACHE_CHECK([for lber.h], [ac_cv_header_lber_h], [
388     AC_COMPILE_IFELSE([
389       AC_LANG_PROGRAM([[
390 #undef inline
391 #ifdef HAVE_WINDOWS_H
392 #ifndef WIN32_LEAN_AND_MEAN
393 #define WIN32_LEAN_AND_MEAN
394 #endif
395 #include <windows.h>
396 #else
397 #ifdef HAVE_SYS_TYPES_H
398 #include <sys/types.h>
399 #endif
400 #endif
401 #ifndef NULL
402 #define NULL (void *)0
403 #endif
404 #include <lber.h>
405       ]],[[
406         BerValue *bvp = NULL;
407         BerElement *bep = ber_init(bvp);
408         ber_free(bep, 1);
409       ]])
410     ],[
411       ac_cv_header_lber_h="yes"
412     ],[
413       ac_cv_header_lber_h="no"
414     ])
415   ])
416   if test "$ac_cv_header_lber_h" = "yes"; then
417     AC_DEFINE_UNQUOTED(HAVE_LBER_H, 1,
418       [Define to 1 if you have the lber.h header file.])
419     #
420     AC_COMPILE_IFELSE([
421       AC_LANG_PROGRAM([[
422 #undef inline
423 #ifdef HAVE_WINDOWS_H
424 #ifndef WIN32_LEAN_AND_MEAN
425 #define WIN32_LEAN_AND_MEAN
426 #endif
427 #include <windows.h>
428 #else
429 #ifdef HAVE_SYS_TYPES_H
430 #include <sys/types.h>
431 #endif
432 #endif
433 #ifndef NULL
434 #define NULL (void *)0
435 #endif
436 #ifndef LDAP_DEPRECATED
437 #define LDAP_DEPRECATED 1
438 #endif
439 #include <ldap.h>
440       ]],[[
441         BerValue *bvp = NULL;
442         BerElement *bep = ber_init(bvp);
443         ber_free(bep, 1);
444       ]])
445     ],[
446       curl_cv_need_header_lber_h="no"
447     ],[
448       curl_cv_need_header_lber_h="yes"
449     ])
450     #
451     case "$curl_cv_need_header_lber_h" in
452       yes)
453         AC_DEFINE_UNQUOTED(NEED_LBER_H, 1,
454           [Define to 1 if you need the lber.h header file even with ldap.h])
455         ;;
456     esac
457   fi
458 ])
459
460
461 dnl CURL_CHECK_HEADER_LDAP
462 dnl -------------------------------------------------
463 dnl Check for compilable and valid ldap.h header
464
465 AC_DEFUN([CURL_CHECK_HEADER_LDAP], [
466   AC_REQUIRE([CURL_CHECK_HEADER_LBER])dnl
467   AC_CACHE_CHECK([for ldap.h], [ac_cv_header_ldap_h], [
468     AC_COMPILE_IFELSE([
469       AC_LANG_PROGRAM([[
470 #undef inline
471 #ifdef HAVE_WINDOWS_H
472 #ifndef WIN32_LEAN_AND_MEAN
473 #define WIN32_LEAN_AND_MEAN
474 #endif
475 #include <windows.h>
476 #else
477 #ifdef HAVE_SYS_TYPES_H
478 #include <sys/types.h>
479 #endif
480 #endif
481 #ifndef LDAP_DEPRECATED
482 #define LDAP_DEPRECATED 1
483 #endif
484 #ifdef NEED_LBER_H
485 #include <lber.h>
486 #endif
487 #include <ldap.h>
488       ]],[[
489         LDAP *ldp = ldap_init("dummy", LDAP_PORT);
490         int res = ldap_unbind(ldp);
491       ]])
492     ],[
493       ac_cv_header_ldap_h="yes"
494     ],[
495       ac_cv_header_ldap_h="no"
496     ])
497   ])
498   case "$ac_cv_header_ldap_h" in
499     yes)
500       AC_DEFINE_UNQUOTED(HAVE_LDAP_H, 1,
501         [Define to 1 if you have the ldap.h header file.])
502       ;;
503   esac
504 ])
505
506
507 dnl CURL_CHECK_HEADER_LDAP_SSL
508 dnl -------------------------------------------------
509 dnl Check for compilable and valid ldap_ssl.h header
510
511 AC_DEFUN([CURL_CHECK_HEADER_LDAP_SSL], [
512   AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl
513   AC_CACHE_CHECK([for ldap_ssl.h], [ac_cv_header_ldap_ssl_h], [
514     AC_COMPILE_IFELSE([
515       AC_LANG_PROGRAM([[
516 #undef inline
517 #ifdef HAVE_WINDOWS_H
518 #ifndef WIN32_LEAN_AND_MEAN
519 #define WIN32_LEAN_AND_MEAN
520 #endif
521 #include <windows.h>
522 #else
523 #ifdef HAVE_SYS_TYPES_H
524 #include <sys/types.h>
525 #endif
526 #endif
527 #ifndef LDAP_DEPRECATED
528 #define LDAP_DEPRECATED 1
529 #endif
530 #ifdef NEED_LBER_H
531 #include <lber.h>
532 #endif
533 #ifdef HAVE_LDAP_H
534 #include <ldap.h>
535 #endif
536 #include <ldap_ssl.h>
537       ]],[[
538         LDAP *ldp = ldapssl_init("dummy", LDAPS_PORT, 1);
539       ]])
540     ],[
541       ac_cv_header_ldap_ssl_h="yes"
542     ],[
543       ac_cv_header_ldap_ssl_h="no"
544     ])
545   ])
546   case "$ac_cv_header_ldap_ssl_h" in
547     yes)
548       AC_DEFINE_UNQUOTED(HAVE_LDAP_SSL_H, 1,
549         [Define to 1 if you have the ldap_ssl.h header file.])
550       ;;
551   esac
552 ])
553
554
555 dnl CURL_CHECK_HEADER_LDAPSSL
556 dnl -------------------------------------------------
557 dnl Check for compilable and valid ldapssl.h header
558
559 AC_DEFUN([CURL_CHECK_HEADER_LDAPSSL], [
560   AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl
561   AC_CACHE_CHECK([for ldapssl.h], [ac_cv_header_ldapssl_h], [
562     AC_COMPILE_IFELSE([
563       AC_LANG_PROGRAM([[
564 #undef inline
565 #ifdef HAVE_WINDOWS_H
566 #ifndef WIN32_LEAN_AND_MEAN
567 #define WIN32_LEAN_AND_MEAN
568 #endif
569 #include <windows.h>
570 #else
571 #ifdef HAVE_SYS_TYPES_H
572 #include <sys/types.h>
573 #endif
574 #endif
575 #ifndef NULL
576 #define NULL (void *)0
577 #endif
578 #ifndef LDAP_DEPRECATED
579 #define LDAP_DEPRECATED 1
580 #endif
581 #ifdef NEED_LBER_H
582 #include <lber.h>
583 #endif
584 #ifdef HAVE_LDAP_H
585 #include <ldap.h>
586 #endif
587 #include <ldapssl.h>
588       ]],[[
589         char *cert_label = NULL;
590         LDAP *ldp = ldap_ssl_init("dummy", LDAPS_PORT, cert_label);
591       ]])
592     ],[
593       ac_cv_header_ldapssl_h="yes"
594     ],[
595       ac_cv_header_ldapssl_h="no"
596     ])
597   ])
598   case "$ac_cv_header_ldapssl_h" in
599     yes)
600       AC_DEFINE_UNQUOTED(HAVE_LDAPSSL_H, 1,
601         [Define to 1 if you have the ldapssl.h header file.])
602       ;;
603   esac
604 ])
605
606
607 dnl CURL_CHECK_LIBS_WINLDAP
608 dnl -------------------------------------------------
609 dnl Check for libraries needed for WINLDAP support,
610 dnl and prepended to LIBS any needed libraries.
611 dnl This macro can take an optional parameter with a
612 dnl white space separated list of libraries to check
613 dnl before the WINLDAP default ones.
614
615 AC_DEFUN([CURL_CHECK_LIBS_WINLDAP], [
616   AC_REQUIRE([CURL_CHECK_HEADER_WINBER])dnl
617   #
618   AC_MSG_CHECKING([for WINLDAP libraries])
619   #
620   u_libs=""
621   #
622   ifelse($1,,,[
623     for x_lib in $1; do
624       case "$x_lib" in
625         -l*)
626           l_lib="$x_lib"
627           ;;
628         *)
629           l_lib="-l$x_lib"
630           ;;
631       esac
632       if test -z "$u_libs"; then
633         u_libs="$l_lib"
634       else
635         u_libs="$u_libs $l_lib"
636       fi
637     done
638   ])
639   #
640   curl_cv_save_LIBS="$LIBS"
641   curl_cv_ldap_LIBS="unknown"
642   #
643   for x_nlibs in '' "$u_libs" \
644     '-lwldap32' ; do
645     if test "$curl_cv_ldap_LIBS" = "unknown"; then
646       if test -z "$x_nlibs"; then
647         LIBS="$curl_cv_save_LIBS"
648       else
649         LIBS="$x_nlibs $curl_cv_save_LIBS"
650       fi
651       AC_LINK_IFELSE([
652         AC_LANG_PROGRAM([[
653 #undef inline
654 #ifdef HAVE_WINDOWS_H
655 #ifndef WIN32_LEAN_AND_MEAN
656 #define WIN32_LEAN_AND_MEAN
657 #endif
658 #include <windows.h>
659 #ifdef HAVE_WINLDAP_H
660 #include <winldap.h>
661 #endif
662 #ifdef HAVE_WINBER_H
663 #include <winber.h>
664 #endif
665 #endif
666         ]],[[
667           BERVAL *bvp = NULL;
668           BerElement *bep = ber_init(bvp);
669           LDAP *ldp = ldap_init("dummy", LDAP_PORT);
670           ULONG res = ldap_unbind(ldp);
671           ber_free(bep, 1);
672         ]])
673       ],[
674         curl_cv_ldap_LIBS="$x_nlibs"
675       ])
676     fi
677   done
678   #
679   LIBS="$curl_cv_save_LIBS"
680   #
681   case X-"$curl_cv_ldap_LIBS" in
682     X-unknown)
683       AC_MSG_RESULT([cannot find WINLDAP libraries])
684       ;;
685     X-)
686       AC_MSG_RESULT([no additional lib required])
687       ;;
688     *)
689       if test -z "$curl_cv_save_LIBS"; then
690         LIBS="$curl_cv_ldap_LIBS"
691       else
692         LIBS="$curl_cv_ldap_LIBS $curl_cv_save_LIBS"
693       fi
694       AC_MSG_RESULT([$curl_cv_ldap_LIBS])
695       ;;
696   esac
697   #
698 ])
699
700
701 dnl CURL_CHECK_LIBS_LDAP
702 dnl -------------------------------------------------
703 dnl Check for libraries needed for LDAP support,
704 dnl and prepended to LIBS any needed libraries.
705 dnl This macro can take an optional parameter with a
706 dnl white space separated list of libraries to check
707 dnl before the default ones.
708
709 AC_DEFUN([CURL_CHECK_LIBS_LDAP], [
710   AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl
711   #
712   AC_MSG_CHECKING([for LDAP libraries])
713   #
714   u_libs=""
715   #
716   ifelse($1,,,[
717     for x_lib in $1; do
718       case "$x_lib" in
719         -l*)
720           l_lib="$x_lib"
721           ;;
722         *)
723           l_lib="-l$x_lib"
724           ;;
725       esac
726       if test -z "$u_libs"; then
727         u_libs="$l_lib"
728       else
729         u_libs="$u_libs $l_lib"
730       fi
731     done
732   ])
733   #
734   curl_cv_save_LIBS="$LIBS"
735   curl_cv_ldap_LIBS="unknown"
736   #
737   for x_nlibs in '' "$u_libs" \
738     '-lldap' \
739     '-llber -lldap' \
740     '-lldap -llber' \
741     '-lldapssl -lldapx -lldapsdk' \
742     '-lldapsdk -lldapx -lldapssl' ; do
743     if test "$curl_cv_ldap_LIBS" = "unknown"; then
744       if test -z "$x_nlibs"; then
745         LIBS="$curl_cv_save_LIBS"
746       else
747         LIBS="$x_nlibs $curl_cv_save_LIBS"
748       fi
749       AC_LINK_IFELSE([
750         AC_LANG_PROGRAM([[
751 #undef inline
752 #ifdef HAVE_WINDOWS_H
753 #ifndef WIN32_LEAN_AND_MEAN
754 #define WIN32_LEAN_AND_MEAN
755 #endif
756 #include <windows.h>
757 #else
758 #ifdef HAVE_SYS_TYPES_H
759 #include <sys/types.h>
760 #endif
761 #endif
762 #ifndef NULL
763 #define NULL (void *)0
764 #endif
765 #ifndef LDAP_DEPRECATED
766 #define LDAP_DEPRECATED 1
767 #endif
768 #ifdef NEED_LBER_H
769 #include <lber.h>
770 #endif
771 #ifdef HAVE_LDAP_H
772 #include <ldap.h>
773 #endif
774         ]],[[
775           BerValue *bvp = NULL;
776           BerElement *bep = ber_init(bvp);
777           LDAP *ldp = ldap_init("dummy", LDAP_PORT);
778           int res = ldap_unbind(ldp);
779           ber_free(bep, 1);
780         ]])
781       ],[
782         curl_cv_ldap_LIBS="$x_nlibs"
783       ])
784     fi
785   done
786   #
787   LIBS="$curl_cv_save_LIBS"
788   #
789   case X-"$curl_cv_ldap_LIBS" in
790     X-unknown)
791       AC_MSG_RESULT([cannot find LDAP libraries])
792       ;;
793     X-)
794       AC_MSG_RESULT([no additional lib required])
795       ;;
796     *)
797       if test -z "$curl_cv_save_LIBS"; then
798         LIBS="$curl_cv_ldap_LIBS"
799       else
800         LIBS="$curl_cv_ldap_LIBS $curl_cv_save_LIBS"
801       fi
802       AC_MSG_RESULT([$curl_cv_ldap_LIBS])
803       ;;
804   esac
805   #
806 ])
807
808
809 dnl CURL_CHECK_HEADER_MALLOC
810 dnl -------------------------------------------------
811 dnl Check for compilable and valid malloc.h header,
812 dnl and check if it is needed even with stdlib.h
813
814 AC_DEFUN([CURL_CHECK_HEADER_MALLOC], [
815   AC_CACHE_CHECK([for malloc.h], [ac_cv_header_malloc_h], [
816     AC_COMPILE_IFELSE([
817       AC_LANG_PROGRAM([[
818 #include <malloc.h>
819       ]],[[
820         void *p = malloc(10);
821         void *q = calloc(10,10);
822         free(p);
823         free(q);
824       ]])
825     ],[
826       ac_cv_header_malloc_h="yes"
827     ],[
828       ac_cv_header_malloc_h="no"
829     ])
830   ])
831   if test "$ac_cv_header_malloc_h" = "yes"; then
832     AC_DEFINE_UNQUOTED(HAVE_MALLOC_H, 1,
833       [Define to 1 if you have the malloc.h header file.])
834     #
835     AC_COMPILE_IFELSE([
836       AC_LANG_PROGRAM([[
837 #include <stdlib.h>
838       ]],[[
839         void *p = malloc(10);
840         void *q = calloc(10,10);
841         free(p);
842         free(q);
843       ]])
844     ],[
845       curl_cv_need_header_malloc_h="no"
846     ],[
847       curl_cv_need_header_malloc_h="yes"
848     ])
849     #
850     case "$curl_cv_need_header_malloc_h" in
851       yes)
852         AC_DEFINE_UNQUOTED(NEED_MALLOC_H, 1,
853           [Define to 1 if you need the malloc.h header file even with stdlib.h])
854         ;;
855     esac
856   fi
857 ])
858
859
860 dnl CURL_CHECK_TYPE_SOCKLEN_T
861 dnl -------------------------------------------------
862 dnl Check for existing socklen_t type, and provide
863 dnl an equivalent type if socklen_t not available
864
865 AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
866   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
867   AC_CHECK_TYPE([socklen_t], ,[
868     dnl socklen_t not available
869     AC_CACHE_CHECK([for socklen_t equivalent],
870       [curl_cv_socklen_t_equiv], [
871       curl_cv_socklen_t_equiv="unknown"
872       for arg1 in 'int' 'SOCKET'; do
873         for arg2 in "struct sockaddr" void; do
874           for t in int size_t unsigned long "unsigned long"; do
875             if test "$curl_cv_socklen_t_equiv" = "unknown"; then
876               AC_COMPILE_IFELSE([
877                 AC_LANG_PROGRAM([[
878 #undef inline
879 #ifdef HAVE_WINDOWS_H
880 #ifndef WIN32_LEAN_AND_MEAN
881 #define WIN32_LEAN_AND_MEAN
882 #endif
883 #include <windows.h>
884 #ifdef HAVE_WINSOCK2_H
885 #include <winsock2.h>
886 #else
887 #ifdef HAVE_WINSOCK_H
888 #include <winsock.h>
889 #endif
890 #endif
891 #define GETPEERNCALLCONV PASCAL
892 #else
893 #ifdef HAVE_SYS_TYPES_H
894 #include <sys/types.h>
895 #endif
896 #ifdef HAVE_SYS_SOCKET_H
897 #include <sys/socket.h>
898 #endif
899 #define GETPEERNCALLCONV
900 #endif
901                   extern int GETPEERNCALLCONV getpeername($arg1, $arg2 *, $t *);
902                 ]],[[
903                   $t len=0;
904                   getpeername(0,0,&len);
905                 ]])
906               ],[
907                 curl_cv_socklen_t_equiv="$t"
908               ])
909             fi
910           done
911         done
912       done
913     ])
914     case "$curl_cv_socklen_t_equiv" in
915       unknown)
916         AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
917         ;;
918       *)
919         AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
920           [Type to use in place of socklen_t when system does not provide it.])
921         ;;
922     esac
923   ],[
924 #undef inline
925 #ifdef HAVE_WINDOWS_H
926 #ifndef WIN32_LEAN_AND_MEAN
927 #define WIN32_LEAN_AND_MEAN
928 #endif
929 #include <windows.h>
930 #ifdef HAVE_WINSOCK2_H
931 #include <winsock2.h>
932 #ifdef HAVE_WS2TCPIP_H
933 #include <ws2tcpip.h>
934 #endif
935 #endif
936 #else
937 #ifdef HAVE_SYS_TYPES_H
938 #include <sys/types.h>
939 #endif
940 #ifdef HAVE_SYS_SOCKET_H
941 #include <sys/socket.h>
942 #endif
943 #endif
944   ])
945 ])
946
947
948 dnl CURL_CHECK_FUNC_GETNAMEINFO
949 dnl -------------------------------------------------
950 dnl Test if the getnameinfo function is available, 
951 dnl and check the types of five of its arguments.
952 dnl If the function succeeds HAVE_GETNAMEINFO will be
953 dnl defined, defining the types of the arguments in
954 dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
955 dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7,
956 dnl and also defining the type qualifier of first 
957 dnl argument in GETNAMEINFO_QUAL_ARG1.
958
959 AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
960   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
961   AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
962   AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
963   #
964   AC_MSG_CHECKING([for getnameinfo])
965   AC_LINK_IFELSE([
966     AC_LANG_FUNC_LINK_TRY([getnameinfo])
967   ],[
968     AC_MSG_RESULT([yes])
969     curl_cv_getnameinfo="yes"
970   ],[
971     AC_MSG_RESULT([no])
972     curl_cv_getnameinfo="no"
973   ])
974   #
975   if test "$curl_cv_getnameinfo" != "yes"; then
976     AC_MSG_CHECKING([deeper for getnameinfo])
977     AC_LINK_IFELSE([
978       AC_LANG_PROGRAM([[
979       ]],[[
980         getnameinfo();
981       ]])
982     ],[
983       AC_MSG_RESULT([yes])
984       curl_cv_getnameinfo="yes"
985     ],[
986       AC_MSG_RESULT([but still no])
987       curl_cv_getnameinfo="no"
988     ])
989   fi
990   #
991   if test "$curl_cv_getnameinfo" != "yes"; then
992     AC_MSG_CHECKING([deeper and deeper for getnameinfo])
993     AC_LINK_IFELSE([
994       AC_LANG_PROGRAM([[
995 #undef inline
996 #ifdef HAVE_WINDOWS_H
997 #ifndef WIN32_LEAN_AND_MEAN
998 #define WIN32_LEAN_AND_MEAN
999 #endif
1000 #include <windows.h>
1001 #ifdef HAVE_WINSOCK2_H
1002 #include <winsock2.h>
1003 #ifdef HAVE_WS2TCPIP_H
1004 #include <ws2tcpip.h>
1005 #endif
1006 #endif
1007 #else
1008 #ifdef HAVE_SYS_TYPES_H
1009 #include <sys/types.h>
1010 #endif
1011 #ifdef HAVE_SYS_SOCKET_H
1012 #include <sys/socket.h>
1013 #endif
1014 #ifdef HAVE_NETDB_H
1015 #include <netdb.h>
1016 #endif
1017 #endif
1018       ]],[[
1019         getnameinfo(0, 0, 0, 0, 0, 0, 0);
1020       ]])
1021     ],[
1022       AC_MSG_RESULT([yes])
1023       curl_cv_getnameinfo="yes"
1024     ],[
1025       AC_MSG_RESULT([but still no])
1026       curl_cv_getnameinfo="no"
1027     ])
1028   fi
1029   #
1030   if test "$curl_cv_getnameinfo" = "yes"; then
1031     AC_CACHE_CHECK([types of arguments for getnameinfo],
1032       [curl_cv_func_getnameinfo_args], [
1033       curl_cv_func_getnameinfo_args="unknown"
1034       for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
1035         for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
1036           for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
1037             for gni_arg7 in 'int' 'unsigned int'; do
1038               if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
1039                 AC_COMPILE_IFELSE([
1040                   AC_LANG_PROGRAM([[
1041 #undef inline 
1042 #ifdef HAVE_WINDOWS_H
1043 #ifndef WIN32_LEAN_AND_MEAN
1044 #define WIN32_LEAN_AND_MEAN
1045 #endif
1046 #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
1047 #undef _WIN32_WINNT
1048 #define _WIN32_WINNT 0x0501
1049 #endif
1050 #include <windows.h>
1051 #ifdef HAVE_WINSOCK2_H
1052 #include <winsock2.h> 
1053 #ifdef HAVE_WS2TCPIP_H
1054 #include <ws2tcpip.h>
1055 #endif
1056 #endif
1057 #define GNICALLCONV WSAAPI
1058 #else
1059 #ifdef HAVE_SYS_TYPES_H
1060 #include <sys/types.h>
1061 #endif
1062 #ifdef HAVE_SYS_SOCKET_H
1063 #include <sys/socket.h>
1064 #endif
1065 #ifdef HAVE_NETDB_H
1066 #include <netdb.h>
1067 #endif
1068 #define GNICALLCONV
1069 #endif
1070                     extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
1071                                            char *, $gni_arg46,
1072                                            char *, $gni_arg46,
1073                                            $gni_arg7);
1074                   ]],[[
1075                     $gni_arg2 salen=0;
1076                     $gni_arg46 hostlen=0;
1077                     $gni_arg46 servlen=0;
1078                     $gni_arg7 flags=0;
1079                     int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
1080                   ]])
1081                 ],[
1082                   curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
1083                 ])
1084               fi
1085             done
1086           done
1087         done
1088       done
1089     ]) # AC_CACHE_CHECK
1090     if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
1091       AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
1092       AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
1093     else
1094       gni_prev_IFS=$IFS; IFS=','
1095       set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
1096       IFS=$gni_prev_IFS
1097       shift
1098       #
1099       gni_qual_type_arg1=$[1]
1100       #
1101       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
1102         [Define to the type of arg 2 for getnameinfo.])
1103       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
1104         [Define to the type of args 4 and 6 for getnameinfo.])
1105       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
1106         [Define to the type of arg 7 for getnameinfo.])
1107       #
1108       prev_sh_opts=$-
1109       #
1110       case $prev_sh_opts in
1111         *f*)
1112           ;;
1113         *)
1114           set -f
1115           ;;
1116       esac
1117       #
1118       case "$gni_qual_type_arg1" in
1119         const*)
1120           gni_qual_arg1=const
1121           gni_type_arg1=`echo $gni_qual_type_arg1 | sed 's/^const //'`
1122         ;;
1123         *)
1124           gni_qual_arg1=
1125           gni_type_arg1=$gni_qual_type_arg1
1126         ;;
1127       esac
1128       #
1129       AC_DEFINE_UNQUOTED(GETNAMEINFO_QUAL_ARG1, $gni_qual_arg1,
1130         [Define to the type qualifier of arg 1 for getnameinfo.])
1131       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $gni_type_arg1,
1132         [Define to the type of arg 1 for getnameinfo.])
1133       #
1134       case $prev_sh_opts in
1135         *f*)
1136           ;;
1137         *)
1138           set +f
1139           ;;
1140       esac
1141       #
1142       AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
1143         [Define to 1 if you have the getnameinfo function.])
1144       ac_cv_func_getnameinfo="yes"
1145     fi
1146   fi
1147 ]) # AC_DEFUN
1148
1149
1150 dnl TYPE_SOCKADDR_STORAGE
1151 dnl -------------------------------------------------
1152 dnl Check for struct sockaddr_storage. Most IPv6-enabled 
1153 dnl hosts have it, but AIX 4.3 is one known exception.
1154
1155 AC_DEFUN([TYPE_SOCKADDR_STORAGE],
1156 [
1157    AC_CHECK_TYPE([struct sockaddr_storage],
1158         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
1159                   [if struct sockaddr_storage is defined]), ,
1160    [
1161 #undef inline
1162 #ifdef HAVE_WINDOWS_H
1163 #ifndef WIN32_LEAN_AND_MEAN
1164 #define WIN32_LEAN_AND_MEAN
1165 #endif
1166 #include <windows.h>
1167 #ifdef HAVE_WINSOCK2_H
1168 #include <winsock2.h>
1169 #endif
1170 #else
1171 #ifdef HAVE_SYS_TYPES_H
1172 #include <sys/types.h>
1173 #endif
1174 #ifdef HAVE_SYS_SOCKET_H
1175 #include <sys/socket.h>
1176 #endif
1177 #ifdef HAVE_NETINET_IN_H
1178 #include <netinet/in.h>
1179 #endif
1180 #ifdef HAVE_ARPA_INET_H
1181 #include <arpa/inet.h>
1182 #endif
1183 #endif
1184    ])
1185 ])
1186
1187
1188 dnl CURL_CHECK_NI_WITHSCOPEID
1189 dnl -------------------------------------------------
1190 dnl Check for working NI_WITHSCOPEID in getnameinfo()
1191
1192 AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID], [
1193   AC_REQUIRE([CURL_CHECK_FUNC_GETNAMEINFO])dnl
1194   AC_REQUIRE([TYPE_SOCKADDR_STORAGE])dnl
1195   AC_CHECK_HEADERS(stdio.h sys/types.h sys/socket.h \
1196                    netdb.h netinet/in.h arpa/inet.h)
1197   #
1198   AC_CACHE_CHECK([for working NI_WITHSCOPEID], 
1199     [ac_cv_working_ni_withscopeid], [
1200     AC_RUN_IFELSE([
1201       AC_LANG_PROGRAM([[
1202 #ifdef HAVE_STDIO_H
1203 #include <stdio.h>
1204 #endif
1205 #ifdef HAVE_SYS_TYPES_H
1206 #include <sys/types.h>
1207 #endif
1208 #ifdef HAVE_SYS_SOCKET_H
1209 #include <sys/socket.h>
1210 #endif
1211 #ifdef HAVE_NETDB_H
1212 #include <netdb.h>
1213 #endif
1214 #ifdef HAVE_NETINET_IN_H
1215 #include <netinet/in.h>
1216 #endif
1217 #ifdef HAVE_ARPA_INET_H
1218 #include <arpa/inet.h>
1219 #endif
1220       ]],[[
1221 #if defined(NI_WITHSCOPEID) && defined(HAVE_GETNAMEINFO)
1222 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE
1223         struct sockaddr_storage sa;
1224 #else
1225         unsigned char sa[256];
1226 #endif
1227         char hostbuf[NI_MAXHOST];
1228         int rc;
1229         GETNAMEINFO_TYPE_ARG2 salen = (GETNAMEINFO_TYPE_ARG2)sizeof(sa);
1230         GETNAMEINFO_TYPE_ARG46 hostlen = (GETNAMEINFO_TYPE_ARG46)sizeof(hostbuf);
1231         GETNAMEINFO_TYPE_ARG7 flags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
1232         int fd = socket(AF_INET6, SOCK_STREAM, 0);
1233         if(fd < 0) {
1234           perror("socket()");
1235           return 1; /* Error creating socket */
1236         }
1237         rc = getsockname(fd, (GETNAMEINFO_TYPE_ARG1)&sa, &salen);
1238         if(rc) {
1239           perror("getsockname()");
1240           return 2; /* Error retrieving socket name */
1241         }
1242         rc = getnameinfo((GETNAMEINFO_TYPE_ARG1)&sa, salen, hostbuf, hostlen, NULL, 0, flags);
1243         if(rc) {
1244           printf("rc = %s\n", gai_strerror(rc));
1245           return 3; /* Error translating socket address */
1246         }
1247         return 0; /* Ok, NI_WITHSCOPEID works */
1248 #else
1249         return 4; /* Error, NI_WITHSCOPEID not defined or no getnameinfo() */
1250 #endif
1251       ]]) # AC_LANG_PROGRAM
1252     ],[
1253       # Exit code == 0. Program worked.
1254       ac_cv_working_ni_withscopeid="yes"
1255     ],[
1256       # Exit code != 0. Program failed.
1257       ac_cv_working_ni_withscopeid="no"
1258     ],[
1259       # Program is not run when cross-compiling. So we assume
1260       # NI_WITHSCOPEID will work if we are able to compile it.
1261       AC_COMPILE_IFELSE([
1262         AC_LANG_PROGRAM([[
1263 #include <sys/types.h>
1264 #include <sys/socket.h>
1265 #include <netdb.h>
1266         ]],[[
1267           unsigned int dummy= NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
1268         ]])
1269       ],[
1270         ac_cv_working_ni_withscopeid="yes"
1271       ],[
1272         ac_cv_working_ni_withscopeid="no"
1273       ]) # AC_COMPILE_IFELSE
1274     ]) # AC_RUN_IFELSE
1275   ]) # AC_CACHE_CHECK
1276   case "$ac_cv_working_ni_withscopeid" in
1277     yes)
1278       AC_DEFINE(HAVE_NI_WITHSCOPEID, 1,
1279         [Define to 1 if NI_WITHSCOPEID exists and works.])
1280       ;;
1281   esac
1282 ]) # AC_DEFUN
1283
1284
1285 dnl CURL_CHECK_FUNC_RECV
1286 dnl -------------------------------------------------
1287 dnl Test if the socket recv() function is available, 
1288 dnl and check its return type and the types of its 
1289 dnl arguments. If the function succeeds HAVE_RECV 
1290 dnl will be defined, defining the types of the arguments 
1291 dnl in RECV_TYPE_ARG1, RECV_TYPE_ARG2, RECV_TYPE_ARG3 
1292 dnl and RECV_TYPE_ARG4, defining the type of the function
1293 dnl return value in RECV_TYPE_RETV.
1294
1295 AC_DEFUN([CURL_CHECK_FUNC_RECV], [
1296   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
1297   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
1298   AC_CHECK_HEADERS(sys/types.h sys/socket.h)
1299   #
1300   AC_MSG_CHECKING([for recv])
1301   AC_LINK_IFELSE([
1302     AC_LANG_PROGRAM([[
1303 #undef inline 
1304 #ifdef HAVE_WINDOWS_H
1305 #ifndef WIN32_LEAN_AND_MEAN
1306 #define WIN32_LEAN_AND_MEAN
1307 #endif
1308 #include <windows.h>
1309 #ifdef HAVE_WINSOCK2_H
1310 #include <winsock2.h>
1311 #else
1312 #ifdef HAVE_WINSOCK_H
1313 #include <winsock.h>
1314 #endif
1315 #endif
1316 #else
1317 #ifdef HAVE_SYS_TYPES_H
1318 #include <sys/types.h>
1319 #endif
1320 #ifdef HAVE_SYS_SOCKET_H
1321 #include <sys/socket.h>
1322 #endif
1323 #endif
1324     ]],[[
1325       recv(0, 0, 0, 0);
1326     ]])
1327   ],[
1328     AC_MSG_RESULT([yes])
1329     curl_cv_recv="yes"
1330   ],[
1331     AC_MSG_RESULT([no])
1332     curl_cv_recv="no"
1333   ])
1334   #
1335   if test "$curl_cv_recv" = "yes"; then
1336     AC_CACHE_CHECK([types of args and return type for recv],
1337       [curl_cv_func_recv_args], [
1338       curl_cv_func_recv_args="unknown"
1339       for recv_retv in 'int' 'ssize_t'; do
1340         for recv_arg1 in 'int' 'ssize_t' 'SOCKET'; do
1341           for recv_arg2 in 'char *' 'void *'; do
1342             for recv_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
1343               for recv_arg4 in 'int' 'unsigned int'; do
1344                 if test "$curl_cv_func_recv_args" = "unknown"; then
1345                   AC_COMPILE_IFELSE([
1346                     AC_LANG_PROGRAM([[
1347 #undef inline 
1348 #ifdef HAVE_WINDOWS_H
1349 #ifndef WIN32_LEAN_AND_MEAN
1350 #define WIN32_LEAN_AND_MEAN
1351 #endif
1352 #include <windows.h>
1353 #ifdef HAVE_WINSOCK2_H
1354 #include <winsock2.h>
1355 #else
1356 #ifdef HAVE_WINSOCK_H
1357 #include <winsock.h>
1358 #endif
1359 #endif
1360 #define RECVCALLCONV PASCAL
1361 #else
1362 #ifdef HAVE_SYS_TYPES_H
1363 #include <sys/types.h>
1364 #endif
1365 #ifdef HAVE_SYS_SOCKET_H
1366 #include <sys/socket.h>
1367 #endif
1368 #define RECVCALLCONV
1369 #endif
1370                       extern $recv_retv RECVCALLCONV
1371                       recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
1372                     ]],[[
1373                       $recv_arg1 s=0;
1374                       $recv_arg2 buf=0;
1375                       $recv_arg3 len=0;
1376                       $recv_arg4 flags=0;
1377                       $recv_retv res = recv(s, buf, len, flags);
1378                     ]])
1379                   ],[
1380                     curl_cv_func_recv_args="$recv_arg1,$recv_arg2,$recv_arg3,$recv_arg4,$recv_retv"
1381                   ])
1382                 fi
1383               done
1384             done
1385           done
1386         done
1387       done
1388     ]) # AC_CACHE_CHECK
1389     if test "$curl_cv_func_recv_args" = "unknown"; then
1390       AC_MSG_ERROR([Cannot find proper types to use for recv args])
1391     else
1392       recv_prev_IFS=$IFS; IFS=','
1393       set dummy `echo "$curl_cv_func_recv_args" | sed 's/\*/\*/g'`
1394       IFS=$recv_prev_IFS
1395       shift
1396       #
1397       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG1, $[1],
1398         [Define to the type of arg 1 for recv.])
1399       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG2, $[2],
1400         [Define to the type of arg 2 for recv.])
1401       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG3, $[3],
1402         [Define to the type of arg 3 for recv.])
1403       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG4, $[4],
1404         [Define to the type of arg 4 for recv.])
1405       AC_DEFINE_UNQUOTED(RECV_TYPE_RETV, $[5],
1406         [Define to the function return type for recv.])
1407       #
1408       AC_DEFINE_UNQUOTED(HAVE_RECV, 1,
1409         [Define to 1 if you have the recv function.])
1410       ac_cv_func_recv="yes"
1411     fi
1412   else
1413     AC_MSG_ERROR([Unable to link function recv])
1414   fi
1415 ]) # AC_DEFUN
1416
1417
1418 dnl CURL_CHECK_FUNC_SEND
1419 dnl -------------------------------------------------
1420 dnl Test if the socket send() function is available, 
1421 dnl and check its return type and the types of its 
1422 dnl arguments. If the function succeeds HAVE_SEND 
1423 dnl will be defined, defining the types of the arguments 
1424 dnl in SEND_TYPE_ARG1, SEND_TYPE_ARG2, SEND_TYPE_ARG3 
1425 dnl and SEND_TYPE_ARG4, defining the type of the function
1426 dnl return value in SEND_TYPE_RETV, and also defining the 
1427 dnl type qualifier of second argument in SEND_QUAL_ARG2.
1428
1429 AC_DEFUN([CURL_CHECK_FUNC_SEND], [
1430   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
1431   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
1432   AC_CHECK_HEADERS(sys/types.h sys/socket.h)
1433   #
1434   AC_MSG_CHECKING([for send])
1435   AC_LINK_IFELSE([
1436     AC_LANG_PROGRAM([[
1437 #undef inline 
1438 #ifdef HAVE_WINDOWS_H
1439 #ifndef WIN32_LEAN_AND_MEAN
1440 #define WIN32_LEAN_AND_MEAN
1441 #endif
1442 #include <windows.h>
1443 #ifdef HAVE_WINSOCK2_H
1444 #include <winsock2.h>
1445 #else
1446 #ifdef HAVE_WINSOCK_H
1447 #include <winsock.h>
1448 #endif
1449 #endif
1450 #else
1451 #ifdef HAVE_SYS_TYPES_H
1452 #include <sys/types.h>
1453 #endif
1454 #ifdef HAVE_SYS_SOCKET_H
1455 #include <sys/socket.h>
1456 #endif
1457 #endif
1458     ]],[[
1459       send(0, 0, 0, 0);
1460     ]])
1461   ],[
1462     AC_MSG_RESULT([yes])
1463     curl_cv_send="yes"
1464   ],[
1465     AC_MSG_RESULT([no])
1466     curl_cv_send="no"
1467   ])
1468   #
1469   if test "$curl_cv_send" = "yes"; then
1470     AC_CACHE_CHECK([types of args and return type for send],
1471       [curl_cv_func_send_args], [
1472       curl_cv_func_send_args="unknown"
1473       for send_retv in 'int' 'ssize_t'; do
1474         for send_arg1 in 'int' 'ssize_t' 'SOCKET'; do
1475           for send_arg2 in 'char *' 'void *' 'const char *' 'const void *'; do
1476             for send_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
1477               for send_arg4 in 'int' 'unsigned int'; do
1478                 if test "$curl_cv_func_send_args" = "unknown"; then
1479                   AC_COMPILE_IFELSE([
1480                     AC_LANG_PROGRAM([[
1481 #undef inline 
1482 #ifdef HAVE_WINDOWS_H
1483 #ifndef WIN32_LEAN_AND_MEAN
1484 #define WIN32_LEAN_AND_MEAN
1485 #endif
1486 #include <windows.h>
1487 #ifdef HAVE_WINSOCK2_H
1488 #include <winsock2.h>
1489 #else
1490 #ifdef HAVE_WINSOCK_H
1491 #include <winsock.h>
1492 #endif
1493 #endif
1494 #define SENDCALLCONV PASCAL
1495 #else
1496 #ifdef HAVE_SYS_TYPES_H
1497 #include <sys/types.h>
1498 #endif
1499 #ifdef HAVE_SYS_SOCKET_H
1500 #include <sys/socket.h>
1501 #endif
1502 #define SENDCALLCONV
1503 #endif
1504                       extern $send_retv SENDCALLCONV
1505                       send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
1506                     ]],[[
1507                       $send_arg1 s=0;
1508                       $send_arg3 len=0;
1509                       $send_arg4 flags=0;
1510                       $send_retv res = send(s, 0, len, flags);
1511                     ]])
1512                   ],[
1513                     curl_cv_func_send_args="$send_arg1,$send_arg2,$send_arg3,$send_arg4,$send_retv"
1514                   ])
1515                 fi
1516               done
1517             done
1518           done
1519         done
1520       done
1521     ]) # AC_CACHE_CHECK
1522     if test "$curl_cv_func_send_args" = "unknown"; then
1523       AC_MSG_ERROR([Cannot find proper types to use for send args])
1524     else
1525       send_prev_IFS=$IFS; IFS=','
1526       set dummy `echo "$curl_cv_func_send_args" | sed 's/\*/\*/g'`
1527       IFS=$send_prev_IFS
1528       shift
1529       #
1530       send_qual_type_arg2=$[2]
1531       #
1532       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG1, $[1],
1533         [Define to the type of arg 1 for send.])
1534       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG3, $[3],
1535         [Define to the type of arg 3 for send.])
1536       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG4, $[4],
1537         [Define to the type of arg 4 for send.])
1538       AC_DEFINE_UNQUOTED(SEND_TYPE_RETV, $[5],
1539         [Define to the function return type for send.])
1540       #
1541       prev_sh_opts=$-
1542       #
1543       case $prev_sh_opts in
1544         *f*)
1545           ;;
1546         *)
1547           set -f
1548           ;;
1549       esac
1550       #
1551       case "$send_qual_type_arg2" in
1552         const*)
1553           send_qual_arg2=const
1554           send_type_arg2=`echo $send_qual_type_arg2 | sed 's/^const //'`
1555         ;;
1556         *)
1557           send_qual_arg2=
1558           send_type_arg2=$send_qual_type_arg2
1559         ;;
1560       esac
1561       #
1562       AC_DEFINE_UNQUOTED(SEND_QUAL_ARG2, $send_qual_arg2,
1563         [Define to the type qualifier of arg 2 for send.])
1564       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG2, $send_type_arg2,
1565         [Define to the type of arg 2 for send.])
1566       #
1567       case $prev_sh_opts in
1568         *f*)
1569           ;;
1570         *)
1571           set +f
1572           ;;
1573       esac
1574       #
1575       AC_DEFINE_UNQUOTED(HAVE_SEND, 1,
1576         [Define to 1 if you have the send function.])
1577       ac_cv_func_send="yes"
1578     fi
1579   else
1580     AC_MSG_ERROR([Unable to link function send])
1581   fi
1582 ]) # AC_DEFUN
1583
1584
1585 dnl CURL_CHECK_MSG_NOSIGNAL
1586 dnl -------------------------------------------------
1587 dnl Check for MSG_NOSIGNAL
1588
1589 AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
1590   AC_CHECK_HEADERS(sys/types.h sys/socket.h)
1591   AC_CACHE_CHECK([for MSG_NOSIGNAL], [ac_cv_msg_nosignal], [
1592     AC_COMPILE_IFELSE([
1593       AC_LANG_PROGRAM([[
1594 #undef inline 
1595 #ifdef HAVE_WINDOWS_H
1596 #ifndef WIN32_LEAN_AND_MEAN
1597 #define WIN32_LEAN_AND_MEAN
1598 #endif
1599 #include <windows.h>
1600 #ifdef HAVE_WINSOCK2_H
1601 #include <winsock2.h>
1602 #else
1603 #ifdef HAVE_WINSOCK_H
1604 #include <winsock.h>
1605 #endif
1606 #endif
1607 #else
1608 #ifdef HAVE_SYS_TYPES_H
1609 #include <sys/types.h>
1610 #endif
1611 #ifdef HAVE_SYS_SOCKET_H
1612 #include <sys/socket.h>
1613 #endif
1614 #endif
1615       ]],[[
1616         int flag=MSG_NOSIGNAL;
1617       ]])
1618     ],[
1619       ac_cv_msg_nosignal="yes"
1620     ],[
1621       ac_cv_msg_nosignal="no"
1622     ])
1623   ])
1624   case "$ac_cv_msg_nosignal" in
1625     yes)
1626       AC_DEFINE_UNQUOTED(HAVE_MSG_NOSIGNAL, 1,
1627         [Define to 1 if you have the MSG_NOSIGNAL flag.])
1628       ;;
1629   esac
1630 ]) # AC_DEFUN
1631
1632
1633 dnl CURL_CHECK_STRUCT_TIMEVAL
1634 dnl -------------------------------------------------
1635 dnl Check for timeval struct
1636
1637 AC_DEFUN([CURL_CHECK_STRUCT_TIMEVAL], [
1638   AC_REQUIRE([AC_HEADER_TIME])dnl
1639   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
1640   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
1641   AC_CHECK_HEADERS(sys/types.h sys/time.h time.h)
1642   AC_CACHE_CHECK([for struct timeval], [ac_cv_struct_timeval], [
1643     AC_COMPILE_IFELSE([
1644       AC_LANG_PROGRAM([[
1645 #undef inline 
1646 #ifdef HAVE_WINDOWS_H
1647 #ifndef WIN32_LEAN_AND_MEAN
1648 #define WIN32_LEAN_AND_MEAN
1649 #endif
1650 #include <windows.h>
1651 #ifdef HAVE_WINSOCK2_H
1652 #include <winsock2.h>
1653 #else
1654 #ifdef HAVE_WINSOCK_H
1655 #include <winsock.h>
1656 #endif
1657 #endif
1658 #endif
1659 #ifdef HAVE_SYS_TYPES_H
1660 #include <sys/types.h>
1661 #endif
1662 #ifdef HAVE_SYS_TIME_H
1663 #include <sys/time.h>
1664 #ifdef TIME_WITH_SYS_TIME
1665 #include <time.h>
1666 #endif
1667 #else
1668 #ifdef HAVE_TIME_H
1669 #include <time.h>
1670 #endif
1671 #endif
1672       ]],[[
1673         struct timeval ts;
1674         ts.tv_sec  = 0;
1675         ts.tv_usec = 0;
1676       ]])
1677     ],[
1678       ac_cv_struct_timeval="yes"
1679     ],[
1680       ac_cv_struct_timeval="no"
1681     ])
1682   ])
1683   case "$ac_cv_struct_timeval" in
1684     yes)
1685       AC_DEFINE_UNQUOTED(HAVE_STRUCT_TIMEVAL, 1,
1686         [Define to 1 if you have the timeval struct.])
1687       ;;
1688   esac
1689 ]) # AC_DEFUN
1690
1691
1692 dnl TYPE_SIG_ATOMIC_T
1693 dnl -------------------------------------------------
1694 dnl Check if the sig_atomic_t type is available, and
1695 dnl verify if it is already defined as volatile.
1696
1697 AC_DEFUN([TYPE_SIG_ATOMIC_T], [
1698   AC_CHECK_HEADERS(signal.h)
1699   AC_CHECK_TYPE([sig_atomic_t],[
1700     AC_DEFINE(HAVE_SIG_ATOMIC_T, 1,
1701       [Define to 1 if sig_atomic_t is an available typedef.])
1702   ], ,[
1703 #ifdef HAVE_SIGNAL_H
1704 #include <signal.h>
1705 #endif
1706   ])
1707   case "$ac_cv_type_sig_atomic_t" in
1708     yes)
1709       #
1710       AC_MSG_CHECKING([if sig_atomic_t is already defined as volatile])
1711       AC_LINK_IFELSE([
1712         AC_LANG_PROGRAM([[
1713 #ifdef HAVE_SIGNAL_H
1714 #include <signal.h>
1715 #endif
1716         ]],[[
1717           static volatile sig_atomic_t dummy = 0;
1718         ]])
1719       ],[
1720         AC_MSG_RESULT([no])
1721         ac_cv_sig_atomic_t_volatile="no"
1722       ],[
1723         AC_MSG_RESULT([yes])
1724         ac_cv_sig_atomic_t_volatile="yes"
1725       ])
1726       #
1727       if test "$ac_cv_sig_atomic_t_volatile" = "yes"; then
1728         AC_DEFINE(HAVE_SIG_ATOMIC_T_VOLATILE, 1,
1729           [Define to 1 if sig_atomic_t is already defined as volatile.])
1730       fi
1731       ;;
1732   esac
1733 ]) # AC_DEFUN
1734
1735
1736 dnl CURL_CHECK_NONBLOCKING_SOCKET
1737 dnl -------------------------------------------------
1738 dnl Check for how to set a socket to non-blocking state. There seems to exist
1739 dnl four known different ways, with the one used almost everywhere being POSIX
1740 dnl and XPG3, while the other different ways for different systems (old BSD,
1741 dnl Windows and Amiga).
1742 dnl
1743 dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
1744 dnl O_NONBLOCK define is found but does not work. This condition is attempted
1745 dnl to get caught in this script by using an excessive number of #ifdefs...
1746
1747 AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], [
1748   AC_MSG_CHECKING([non-blocking sockets style])
1749   nonblock="unknown"
1750   #
1751   AC_COMPILE_IFELSE([
1752     AC_LANG_PROGRAM([[
1753 /* headers for O_NONBLOCK test */
1754 #include <sys/types.h>
1755 #include <unistd.h>
1756 #include <fcntl.h>
1757 /* */
1758 #if defined(sun) || defined(__sun__) || \
1759     defined(__SUNPRO_C) || defined(__SUNPRO_CC)
1760 # if defined(__SVR4) || defined(__srv4__)
1761 #  define PLATFORM_SOLARIS
1762 # else
1763 #  define PLATFORM_SUNOS4
1764 # endif
1765 #endif
1766 #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
1767 # define PLATFORM_AIX_V3
1768 #endif
1769 /* */
1770 #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
1771 #error "O_NONBLOCK does not work on this platform"
1772 #endif
1773     ]],[[
1774       /* O_NONBLOCK source test */
1775       int socket;
1776       int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
1777     ]])
1778   ],[
1779     dnl the O_NONBLOCK test was fine
1780     nonblock="O_NONBLOCK"
1781     AC_DEFINE(HAVE_O_NONBLOCK, 1,
1782       [use O_NONBLOCK for non-blocking sockets])
1783   ])
1784   #
1785   if test "$nonblock" = "unknown"; then
1786     AC_COMPILE_IFELSE([
1787       AC_LANG_PROGRAM([[
1788 /* headers for FIONBIO test */
1789 #include <unistd.h>
1790 #include <stropts.h>
1791       ]],[[
1792         /* FIONBIO source test (old-style unix) */
1793         int socket;
1794         int flags = ioctl(socket, FIONBIO, &flags);
1795       ]])
1796     ],[
1797       dnl FIONBIO test was good
1798       nonblock="FIONBIO"
1799       AC_DEFINE(HAVE_FIONBIO, 1,
1800         [use FIONBIO for non-blocking sockets])
1801     ])
1802   fi
1803   #
1804   if test "$nonblock" = "unknown"; then
1805     AC_COMPILE_IFELSE([
1806       AC_LANG_PROGRAM([[
1807 /* headers for ioctlsocket test (Windows) */
1808 #undef inline
1809 #ifdef HAVE_WINDOWS_H
1810 #ifndef WIN32_LEAN_AND_MEAN
1811 #define WIN32_LEAN_AND_MEAN
1812 #endif
1813 #include <windows.h>
1814 #ifdef HAVE_WINSOCK2_H
1815 #include <winsock2.h>
1816 #else
1817 #ifdef HAVE_WINSOCK_H
1818 #include <winsock.h>
1819 #endif
1820 #endif
1821 #endif
1822       ]],[[
1823         /* ioctlsocket source code (Windows) */
1824         SOCKET sd;
1825         unsigned long flags = 0;
1826         sd = socket(0, 0, 0);
1827         ioctlsocket(sd, FIONBIO, &flags);
1828       ]])
1829     ],[
1830       dnl ioctlsocket test was good
1831       nonblock="ioctlsocket"
1832       AC_DEFINE(HAVE_IOCTLSOCKET, 1,
1833         [use ioctlsocket() for non-blocking sockets])
1834     ])
1835   fi
1836   #
1837   if test "$nonblock" = "unknown"; then
1838     AC_LINK_IFELSE([
1839       AC_LANG_PROGRAM([[
1840 /* headers for IoctlSocket test (Amiga?) */
1841 #include <sys/ioctl.h>
1842       ]],[[
1843         /* IoctlSocket source code (Amiga?) */
1844         int socket;
1845         int flags = IoctlSocket(socket, FIONBIO, (long)1);
1846       ]])
1847     ],[
1848       dnl Ioctlsocket test was good
1849       nonblock="IoctlSocket"
1850       AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1,
1851         [use Ioctlsocket() for non-blocking sockets])
1852     ])
1853   fi
1854   #
1855   if test "$nonblock" = "unknown"; then
1856     AC_COMPILE_IFELSE([
1857       AC_LANG_PROGRAM([[
1858 /* headers for SO_NONBLOCK test (BeOS) */
1859 #include <socket.h>
1860       ]],[[
1861         /* SO_NONBLOCK source code (BeOS) */
1862         long b = 1;
1863         int socket;
1864         int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
1865       ]])
1866     ],[
1867       dnl the SO_NONBLOCK test was good
1868       nonblock="SO_NONBLOCK"
1869       AC_DEFINE(HAVE_SO_NONBLOCK, 1,
1870         [use SO_NONBLOCK for non-blocking sockets])
1871     ])
1872   fi
1873   #
1874   AC_MSG_RESULT($nonblock)
1875   #
1876   if test "$nonblock" = "unknown"; then
1877     AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1,
1878       [disabled non-blocking sockets])
1879     AC_MSG_WARN([non-block sockets disabled])
1880   fi
1881 ])
1882
1883
1884 dnl TYPE_IN_ADDR_T
1885 dnl -------------------------------------------------
1886 dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
1887 dnl and a few other things.
1888
1889 AC_DEFUN([TYPE_IN_ADDR_T], [
1890   AC_CHECK_TYPE([in_addr_t], ,[
1891     dnl in_addr_t not available
1892     AC_CACHE_CHECK([for in_addr_t equivalent],
1893       [curl_cv_in_addr_t_equiv], [
1894       curl_cv_in_addr_t_equiv="unknown"
1895       for t in "unsigned long" int size_t unsigned long; do
1896         if test "$curl_cv_in_addr_t_equiv" = "unknown"; then
1897           AC_LINK_IFELSE([
1898             AC_LANG_PROGRAM([[
1899 #undef inline
1900 #ifdef HAVE_WINDOWS_H
1901 #ifndef WIN32_LEAN_AND_MEAN
1902 #define WIN32_LEAN_AND_MEAN
1903 #endif
1904 #include <windows.h>
1905 #ifdef HAVE_WINSOCK2_H
1906 #include <winsock2.h>
1907 #else
1908 #ifdef HAVE_WINSOCK_H
1909 #include <winsock.h>
1910 #endif
1911 #endif
1912 #else
1913 #ifdef HAVE_SYS_TYPES_H
1914 #include <sys/types.h>
1915 #endif
1916 #ifdef HAVE_SYS_SOCKET_H
1917 #include <sys/socket.h>
1918 #endif
1919 #ifdef HAVE_NETINET_IN_H
1920 #include <netinet/in.h>
1921 #endif
1922 #ifdef HAVE_ARPA_INET_H
1923 #include <arpa/inet.h>
1924 #endif
1925 #endif
1926             ]],[[
1927               $t data = inet_addr ("1.2.3.4");
1928             ]])
1929           ],[
1930             curl_cv_in_addr_t_equiv="$t"
1931           ])
1932         fi
1933       done
1934     ])
1935     case "$curl_cv_in_addr_t_equiv" in
1936       unknown)
1937         AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
1938         ;;
1939       *)
1940         AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
1941           [Type to use in place of in_addr_t when system does not provide it.])
1942         ;;
1943     esac
1944   ],[
1945 #undef inline
1946 #ifdef HAVE_WINDOWS_H
1947 #ifndef WIN32_LEAN_AND_MEAN
1948 #define WIN32_LEAN_AND_MEAN
1949 #endif
1950 #include <windows.h>
1951 #ifdef HAVE_WINSOCK2_H
1952 #include <winsock2.h>
1953 #else
1954 #ifdef HAVE_WINSOCK_H
1955 #include <winsock.h>
1956 #endif
1957 #endif
1958 #else
1959 #ifdef HAVE_SYS_TYPES_H
1960 #include <sys/types.h>
1961 #endif
1962 #ifdef HAVE_SYS_SOCKET_H
1963 #include <sys/socket.h>
1964 #endif
1965 #ifdef HAVE_NETINET_IN_H
1966 #include <netinet/in.h>
1967 #endif
1968 #ifdef HAVE_ARPA_INET_H
1969 #include <arpa/inet.h>
1970 #endif
1971 #endif
1972   ]) dnl AC_CHECK_TYPE
1973 ]) dnl AC_DEFUN
1974
1975
1976 dnl CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC
1977 dnl -------------------------------------------------
1978 dnl Check if monotonic clock_gettime is available.
1979
1980 AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
1981   AC_REQUIRE([AC_HEADER_TIME])dnl
1982   AC_CHECK_HEADERS(sys/types.h unistd.h sys/time.h time.h)
1983   AC_MSG_CHECKING([for monotonic clock_gettime])
1984   AC_COMPILE_IFELSE([
1985     AC_LANG_PROGRAM([[
1986 #ifdef HAVE_SYS_TYPES_H
1987 #include <sys/types.h>
1988 #endif
1989 #ifdef HAVE_UNISTD_H
1990 #include <unistd.h>
1991 #endif
1992 #ifdef HAVE_SYS_TIME_H
1993 #include <sys/time.h>
1994 #ifdef TIME_WITH_SYS_TIME
1995 #include <time.h>
1996 #endif
1997 #else
1998 #ifdef HAVE_TIME_H
1999 #include <time.h>
2000 #endif
2001 #endif
2002     ]],[[
2003 #if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0)
2004       dnl The monotonic clock will not be used unless the feature test macro is
2005       dnl defined with a value greater than zero indicating _always_ supported.
2006       struct timespec ts;
2007       (void)clock_gettime(CLOCK_MONOTONIC, &ts);
2008 #else
2009       HAVE_CLOCK_GETTIME_MONOTONIC shall not be defined.
2010 #endif
2011     ]])
2012   ],[
2013     AC_MSG_RESULT([yes])
2014     ac_cv_func_clock_gettime="yes"
2015   ],[
2016     AC_MSG_RESULT([no])
2017     ac_cv_func_clock_gettime="no"
2018   ])
2019   dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally
2020   dnl postponed until library linking checks for clock_gettime pass.
2021 ]) dnl AC_DEFUN
2022
2023
2024 dnl CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC
2025 dnl -------------------------------------------------
2026 dnl If monotonic clock_gettime is available then,
2027 dnl check and prepended to LIBS any needed libraries.
2028
2029 AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
2030   AC_REQUIRE([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC])dnl
2031   #
2032   if test "$ac_cv_func_clock_gettime" = "yes"; then
2033     #
2034     AC_MSG_CHECKING([for clock_gettime in libraries])
2035     #
2036     curl_cv_save_LIBS="$LIBS"
2037     curl_cv_gclk_LIBS="unknown"
2038     #
2039     for x_xlibs in '' '-lrt' '-lposix4' ; do
2040       if test "$curl_cv_gclk_LIBS" = "unknown"; then
2041         if test -z "$x_xlibs"; then
2042           LIBS="$curl_cv_save_LIBS"
2043         else
2044           LIBS="$x_xlibs $curl_cv_save_LIBS"
2045         fi
2046         AC_LINK_IFELSE([
2047           AC_LANG_PROGRAM([[
2048 #ifdef HAVE_SYS_TYPES_H
2049 #include <sys/types.h>
2050 #endif
2051 #ifdef HAVE_UNISTD_H
2052 #include <unistd.h>
2053 #endif
2054 #ifdef HAVE_SYS_TIME_H
2055 #include <sys/time.h>
2056 #ifdef TIME_WITH_SYS_TIME
2057 #include <time.h>
2058 #endif
2059 #else
2060 #ifdef HAVE_TIME_H
2061 #include <time.h>
2062 #endif
2063 #endif
2064           ]],[[
2065             struct timespec ts;
2066             (void)clock_gettime(CLOCK_MONOTONIC, &ts);
2067           ]])
2068         ],[
2069           curl_cv_gclk_LIBS="$x_xlibs"
2070         ])
2071       fi
2072     done
2073     #
2074     LIBS="$curl_cv_save_LIBS"
2075     #
2076     case X-"$curl_cv_gclk_LIBS" in
2077       X-unknown)
2078         AC_MSG_RESULT([cannot find clock_gettime])
2079         AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined])
2080         ac_cv_func_clock_gettime="no"
2081         ;;
2082       X-)
2083         AC_MSG_RESULT([no additional lib required])
2084         ac_cv_func_clock_gettime="yes"
2085         ;;
2086       *)
2087         if test -z "$curl_cv_save_LIBS"; then
2088           LIBS="$curl_cv_gclk_LIBS"
2089         else
2090           LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS"
2091         fi
2092         AC_MSG_RESULT([$curl_cv_gclk_LIBS])
2093         ac_cv_func_clock_gettime="yes"
2094         ;;
2095     esac
2096     #
2097     dnl only do runtime verification when not cross-compiling
2098     if test "x$cross_compiling" != "xyes" &&
2099       test "$ac_cv_func_clock_gettime" = "yes"; then
2100       AC_MSG_CHECKING([if monotonic clock_gettime works])
2101       AC_RUN_IFELSE([
2102         AC_LANG_PROGRAM([[
2103 #ifdef HAVE_SYS_TYPES_H
2104 #include <sys/types.h>
2105 #endif
2106 #ifdef HAVE_UNISTD_H
2107 #include <unistd.h>
2108 #endif
2109 #ifdef HAVE_SYS_TIME_H
2110 #include <sys/time.h>
2111 #ifdef TIME_WITH_SYS_TIME
2112 #include <time.h>
2113 #endif
2114 #else
2115 #ifdef HAVE_TIME_H
2116 #include <time.h>
2117 #endif
2118 #endif
2119         ]],[[
2120 #if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0)
2121           struct timespec ts;
2122           if (0 == clock_gettime(CLOCK_MONOTONIC, &ts))
2123             exit(0);
2124 #endif
2125           exit(1);
2126         ]])
2127       ],[
2128         AC_MSG_RESULT([yes])
2129       ],[
2130         AC_MSG_RESULT([no])
2131         AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined])
2132         ac_cv_func_clock_gettime="no"
2133         LIBS="$curl_cv_save_LIBS"
2134       ])
2135     fi
2136     #
2137     case "$ac_cv_func_clock_gettime" in
2138       yes)
2139         AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME_MONOTONIC, 1,
2140           [Define to 1 if you have the clock_gettime function and monotonic timer.])
2141         ;;
2142     esac
2143     #
2144   fi
2145   #
2146 ]) dnl AC_DEFUN
2147
2148
2149 dnl CURL_CHECK_FUNC_SELECT
2150 dnl -------------------------------------------------
2151 dnl Test if the socket select() function is available,
2152 dnl and check its return type and the types of its
2153 dnl arguments. If the function succeeds HAVE_SELECT
2154 dnl will be defined, defining the types of the
2155 dnl arguments in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234
2156 dnl and SELECT_TYPE_ARG5, defining the type of the
2157 dnl function return value in SELECT_TYPE_RETV, and
2158 dnl also defining the type qualifier of fifth argument
2159 dnl in SELECT_QUAL_ARG5.
2160
2161 AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
2162   AC_REQUIRE([CURL_CHECK_STRUCT_TIMEVAL])dnl
2163   AC_CHECK_HEADERS(sys/select.h sys/socket.h)
2164   #
2165   AC_MSG_CHECKING([for select])
2166   AC_LINK_IFELSE([
2167     AC_LANG_PROGRAM([[
2168 #undef inline
2169 #ifdef HAVE_WINDOWS_H
2170 #ifndef WIN32_LEAN_AND_MEAN
2171 #define WIN32_LEAN_AND_MEAN
2172 #endif
2173 #include <windows.h>
2174 #ifdef HAVE_WINSOCK2_H
2175 #include <winsock2.h>
2176 #else
2177 #ifdef HAVE_WINSOCK_H
2178 #include <winsock.h>
2179 #endif
2180 #endif
2181 #endif
2182 #ifdef HAVE_SYS_TYPES_H
2183 #include <sys/types.h>
2184 #endif
2185 #ifdef HAVE_SYS_TIME_H
2186 #include <sys/time.h>
2187 #ifdef TIME_WITH_SYS_TIME
2188 #include <time.h>
2189 #endif
2190 #else
2191 #ifdef HAVE_TIME_H
2192 #include <time.h>
2193 #endif
2194 #endif
2195 #ifndef HAVE_WINDOWS_H
2196 #ifdef HAVE_SYS_SELECT_H
2197 #include <sys/select.h>
2198 #endif
2199 #ifdef HAVE_SYS_SOCKET_H
2200 #include <sys/socket.h>
2201 #endif
2202 #endif
2203     ]],[[
2204       select(0, 0, 0, 0, 0);
2205     ]])
2206   ],[
2207     AC_MSG_RESULT([yes])
2208     curl_cv_select="yes"
2209   ],[
2210     AC_MSG_RESULT([no])
2211     curl_cv_select="no"
2212   ])
2213   #
2214   if test "$curl_cv_select" = "yes"; then
2215     AC_CACHE_CHECK([types of args and return type for select],
2216       [curl_cv_func_select_args], [
2217       curl_cv_func_select_args="unknown"
2218       for sel_retv in 'int' 'ssize_t'; do
2219         for sel_arg1 in 'int' 'ssize_t' 'size_t' 'unsigned long int' 'unsigned int'; do
2220           for sel_arg234 in 'fd_set *' 'int *' 'void *'; do
2221             for sel_arg5 in 'struct timeval *' 'const struct timeval *'; do
2222               if test "$curl_cv_func_select_args" = "unknown"; then
2223                 AC_COMPILE_IFELSE([
2224                   AC_LANG_PROGRAM([[
2225 #undef inline
2226 #ifdef HAVE_WINDOWS_H
2227 #ifndef WIN32_LEAN_AND_MEAN
2228 #define WIN32_LEAN_AND_MEAN
2229 #endif
2230 #include <windows.h>
2231 #ifdef HAVE_WINSOCK2_H
2232 #include <winsock2.h>
2233 #else
2234 #ifdef HAVE_WINSOCK_H
2235 #include <winsock.h>
2236 #endif
2237 #endif
2238 #define SELECTCALLCONV PASCAL
2239 #endif
2240 #ifdef HAVE_SYS_TYPES_H
2241 #include <sys/types.h>
2242 #endif
2243 #ifdef HAVE_SYS_TIME_H
2244 #include <sys/time.h>
2245 #ifdef TIME_WITH_SYS_TIME
2246 #include <time.h>
2247 #endif
2248 #else
2249 #ifdef HAVE_TIME_H
2250 #include <time.h>
2251 #endif
2252 #endif
2253 #ifndef HAVE_WINDOWS_H
2254 #ifdef HAVE_SYS_SELECT_H
2255 #include <sys/select.h>
2256 #endif
2257 #ifdef HAVE_SYS_SOCKET_H
2258 #include <sys/socket.h>
2259 #endif
2260 #define SELECTCALLCONV
2261 #endif
2262 #ifndef HAVE_STRUCT_TIMEVAL
2263                     struct timeval {
2264                       long tv_sec;
2265                       long tv_usec;
2266                     };
2267 #endif
2268                     extern $sel_retv SELECTCALLCONV select($sel_arg1,
2269                                                            $sel_arg234,
2270                                                            $sel_arg234,
2271                                                            $sel_arg234,
2272                                                            $sel_arg5);
2273                   ]],[[
2274                     $sel_arg1   nfds=0;
2275                     $sel_arg234 rfds=0;
2276                     $sel_arg234 wfds=0;
2277                     $sel_arg234 efds=0;
2278                     $sel_retv res = select(nfds, rfds, wfds, efds, 0);
2279                   ]])
2280                 ],[
2281                   curl_cv_func_select_args="$sel_arg1,$sel_arg234,$sel_arg5,$sel_retv"
2282                 ])
2283               fi
2284             done
2285           done
2286         done
2287       done
2288     ]) # AC_CACHE_CHECK
2289     if test "$curl_cv_func_select_args" = "unknown"; then
2290       AC_MSG_WARN([Cannot find proper types to use for select args])
2291       AC_MSG_WARN([HAVE_SELECT will not be defined])
2292     else
2293       select_prev_IFS=$IFS; IFS=','
2294       set dummy `echo "$curl_cv_func_select_args" | sed 's/\*/\*/g'`
2295       IFS=$select_prev_IFS
2296       shift
2297       #
2298       sel_qual_type_arg5=$[3]
2299       #
2300       AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1, $[1],
2301         [Define to the type of arg 1 for select.])
2302       AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234, $[2],
2303         [Define to the type of args 2, 3 and 4 for select.])
2304       AC_DEFINE_UNQUOTED(SELECT_TYPE_RETV, $[4],
2305         [Define to the function return type for select.])
2306       #
2307       prev_sh_opts=$-
2308       #
2309       case $prev_sh_opts in
2310         *f*)
2311           ;;
2312         *)
2313           set -f
2314           ;;
2315       esac
2316       #
2317       case "$sel_qual_type_arg5" in
2318         const*)
2319           sel_qual_arg5=const
2320           sel_type_arg5=`echo $sel_qual_type_arg5 | sed 's/^const //'`
2321         ;;
2322         *)
2323           sel_qual_arg5=
2324           sel_type_arg5=$sel_qual_type_arg5
2325         ;;
2326       esac
2327       #
2328       AC_DEFINE_UNQUOTED(SELECT_QUAL_ARG5, $sel_qual_arg5,
2329         [Define to the type qualifier of arg 5 for select.])
2330       AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5, $sel_type_arg5,
2331         [Define to the type of arg 5 for select.])
2332       #
2333       case $prev_sh_opts in
2334         *f*)
2335           ;;
2336         *)
2337           set +f
2338           ;;
2339       esac
2340       #
2341       AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
2342         [Define to 1 if you have the select function.])
2343       ac_cv_func_select="yes"
2344     fi
2345   fi
2346 ]) # AC_DEFUN
2347
2348
2349 dnl ************************************************************
2350 dnl check for "localhost", if it doesn't exist, we can't do the
2351 dnl gethostbyname_r tests!
2352 dnl 
2353
2354 AC_DEFUN([CURL_CHECK_WORKING_RESOLVER],[
2355 AC_MSG_CHECKING([if "localhost" resolves])
2356 AC_TRY_RUN([
2357 #include <string.h>
2358 #include <sys/types.h>
2359 #include <netdb.h>
2360 #ifndef NULL
2361 #define NULL (void *)0
2362 #endif
2363
2364 int
2365 main () {
2366 struct hostent *h;
2367 h = gethostbyname("localhost");
2368 exit (h == NULL ? 1 : 0); }],[
2369       AC_MSG_RESULT(yes)],[
2370       AC_MSG_RESULT(no)
2371       AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve])
2372
2373       ]
2374 )
2375 ])
2376
2377 dnl ************************************************************
2378 dnl check for working getaddrinfo() that works with AI_NUMERICHOST
2379 dnl
2380 AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
2381   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
2382   AC_TRY_RUN( [
2383 #include <netdb.h>
2384 #include <sys/types.h>
2385 #include <sys/socket.h>
2386
2387 int main(void)
2388 {
2389     struct addrinfo hints, *ai;
2390     int error;
2391
2392     memset(&hints, 0, sizeof(hints));
2393     hints.ai_flags = AI_NUMERICHOST;
2394     hints.ai_family = AF_UNSPEC;
2395     hints.ai_socktype = SOCK_STREAM;
2396     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
2397     if (error) {
2398         return 1;
2399     }
2400     return 0;
2401 }
2402 ],[
2403   ac_cv_working_getaddrinfo="yes"
2404 ],[
2405   ac_cv_working_getaddrinfo="no"
2406 ],[
2407   ac_cv_working_getaddrinfo="yes"
2408 ])])
2409 if test "$ac_cv_working_getaddrinfo" = "yes"; then
2410   AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works])
2411   AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
2412
2413   IPV6_ENABLED=1
2414   AC_SUBST(IPV6_ENABLED)
2415 fi
2416 ])
2417
2418
2419 AC_DEFUN([CURL_CHECK_LOCALTIME_R],
2420 [
2421   dnl check for localtime_r
2422   AC_CHECK_FUNCS(localtime_r,[
2423     AC_MSG_CHECKING(whether localtime_r is declared)
2424     AC_EGREP_CPP(localtime_r,[
2425 #include <time.h>],[
2426       AC_MSG_RESULT(yes)],[
2427       AC_MSG_RESULT(no)
2428       AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared)
2429       AC_EGREP_CPP(localtime_r,[
2430 #define _REENTRANT
2431 #include <time.h>],[
2432         AC_DEFINE(NEED_REENTRANT)
2433         AC_MSG_RESULT(yes)],
2434         AC_MSG_RESULT(no))])])
2435 ])
2436
2437 dnl
2438 dnl This function checks for strerror_r(). If it isn't found at first, it
2439 dnl retries with _THREAD_SAFE defined, as that is what AIX seems to require
2440 dnl in order to find this function.
2441 dnl
2442 dnl If the function is found, it will then proceed to check how the function
2443 dnl actually works: glibc-style or POSIX-style.
2444 dnl
2445 dnl glibc:
2446 dnl      char *strerror_r(int errnum, char *buf, size_t n);
2447 dnl  
2448 dnl  What this one does is to return the error string (no surprises there),
2449 dnl  but it doesn't usually copy anything into buf!  The 'buf' and 'n'
2450 dnl  parameters are only meant as an optional working area, in case strerror_r
2451 dnl  needs it.  A quick test on a few systems shows that it's generally not
2452 dnl  touched at all.
2453 dnl
2454 dnl POSIX:
2455 dnl      int strerror_r(int errnum, char *buf, size_t n);
2456 dnl
2457 AC_DEFUN([CURL_CHECK_STRERROR_R],
2458 [
2459   AC_CHECK_FUNCS(strerror_r)
2460
2461   if test "x$ac_cv_func_strerror_r" = "xyes"; then
2462
2463     AC_MSG_CHECKING(whether strerror_r is declared)
2464     AC_EGREP_CPP(strerror_r,[
2465 #include <string.h>],[
2466       AC_MSG_RESULT(yes)],[
2467       AC_MSG_RESULT(no)
2468       AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
2469       AC_EGREP_CPP(strerror_r,[
2470 #define _REENTRANT
2471 #include <string.h>],[
2472         CPPFLAGS="-D_REENTRANT $CPPFLAGS"
2473         AC_MSG_RESULT(yes)],
2474         AC_MSG_RESULT(no)
2475         AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
2476        ) dnl with _THREAD_SAFE
2477     ]) dnl plain cpp for it
2478
2479     dnl determine if this strerror_r() is glibc or POSIX
2480     AC_MSG_CHECKING([for a glibc strerror_r API])
2481     AC_TRY_RUN([
2482 #include <string.h>
2483 #include <errno.h>
2484 int
2485 main () {
2486   char buffer[1024]; /* big enough to play with */
2487   char *string =
2488     strerror_r(EACCES, buffer, sizeof(buffer));
2489     /* this should've returned a string */
2490     if(!string || !string[0])
2491       return 99;
2492     return 0;
2493 }
2494 ],
2495     GLIBC_STRERROR_R="1"
2496     AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
2497     AC_MSG_RESULT([yes]),
2498     AC_MSG_RESULT([no]),
2499
2500     dnl Use an inferior method of strerror_r detection while cross-compiling
2501     AC_EGREP_CPP(yes, [
2502 #include <features.h>
2503 #ifdef __GLIBC__
2504 yes
2505 #endif
2506 ], 
2507       dnl looks like glibc, so assume a glibc-style strerror_r()
2508       GLIBC_STRERROR_R="1"
2509       AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
2510       AC_MSG_RESULT([yes]),
2511       AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
2512     ) dnl while cross-compiling
2513     )
2514
2515     if test -z "$GLIBC_STRERROR_R"; then
2516
2517       AC_MSG_CHECKING([for a POSIX strerror_r API])
2518       AC_TRY_RUN([
2519 #include <string.h>
2520 #include <errno.h>
2521 int
2522 main () {
2523   char buffer[1024]; /* big enough to play with */
2524   int error =
2525     strerror_r(EACCES, buffer, sizeof(buffer));
2526     /* This should've returned zero, and written an error string in the
2527        buffer.*/
2528     if(!buffer[0] || error)
2529       return 99;
2530     return 0;
2531 }
2532 ],
2533       AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-style strerror_r()])
2534       AC_MSG_RESULT([yes]),
2535       AC_MSG_RESULT([no]) ,
2536       dnl cross-compiling!
2537       AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
2538     )
2539
2540     fi dnl if not using glibc API
2541
2542   fi dnl we have a strerror_r
2543
2544 ])
2545
2546 AC_DEFUN([CURL_CHECK_INET_NTOA_R],
2547 [
2548   dnl determine if function definition for inet_ntoa_r exists.
2549   AC_CHECK_FUNCS(inet_ntoa_r,[
2550     AC_MSG_CHECKING(whether inet_ntoa_r is declared)
2551     AC_EGREP_CPP(inet_ntoa_r,[
2552 #include <arpa/inet.h>],[
2553       AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
2554       AC_MSG_RESULT(yes)],[
2555       AC_MSG_RESULT(no)
2556       AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
2557       AC_EGREP_CPP(inet_ntoa_r,[
2558 #define _REENTRANT
2559 #include <arpa/inet.h>],[
2560         AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
2561         AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
2562         AC_MSG_RESULT(yes)],
2563         AC_MSG_RESULT(no))])])
2564 ])
2565
2566
2567 dnl CURL_CHECK_GETHOSTBYADDR_R
2568 dnl -------------------------------------------------
2569 dnl check number of arguments for gethostbyaddr_r, it
2570 dnl might take either 5, 7, or 8 arguments.
2571
2572 AC_DEFUN([CURL_CHECK_GETHOSTBYADDR_R], [
2573   #
2574   AC_MSG_CHECKING([for gethostbyaddr_r])
2575   AC_LINK_IFELSE([
2576     AC_LANG_FUNC_LINK_TRY([gethostbyaddr_r])
2577   ],[
2578     AC_MSG_RESULT([yes])
2579     tmp_cv_gethostbyaddr_r="yes"
2580   ],[
2581     AC_MSG_RESULT([no])
2582     tmp_cv_gethostbyaddr_r="no"
2583   ])
2584   #
2585   if test "$tmp_cv_gethostbyaddr_r" != "yes"; then
2586     AC_MSG_CHECKING([deeper for gethostbyaddr_r])
2587     AC_LINK_IFELSE([
2588       AC_LANG_PROGRAM([[
2589       ]],[[
2590         gethostbyaddr_r();
2591       ]])
2592     ],[
2593       AC_MSG_RESULT([yes])
2594       tmp_cv_gethostbyaddr_r="yes"
2595     ],[
2596       AC_MSG_RESULT([but still no])
2597       tmp_cv_gethostbyaddr_r="no"
2598     ])
2599   fi
2600   #
2601   if test "$tmp_cv_gethostbyaddr_r" = "yes"; then
2602
2603     ac_cv_gethostbyaddr_r_args="unknown"
2604
2605     AC_MSG_CHECKING([if gethostbyaddr_r takes 5 arguments])
2606     AC_COMPILE_IFELSE([
2607       AC_LANG_PROGRAM([[
2608 #include <sys/types.h>
2609 #include <netdb.h>
2610       ]],[[
2611         char * address;
2612         int length;
2613         int type;
2614         struct hostent h;
2615         struct hostent_data hdata;
2616         int rc;
2617         rc = gethostbyaddr_r(address, length, type, &h, &hdata);
2618       ]])
2619     ],[
2620       AC_MSG_RESULT([yes])
2621       AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
2622       ac_cv_gethostbyaddr_r_args="5"
2623     ],[
2624       AC_MSG_RESULT([no])
2625     ])
2626
2627     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2628       AC_MSG_CHECKING([if gethostbyaddr_r with -D_REENTRANT takes 5 arguments])
2629       AC_COMPILE_IFELSE([
2630         AC_LANG_PROGRAM([[
2631 #define _REENTRANT
2632 #include <sys/types.h>
2633 #include <netdb.h>
2634         ]],[[
2635           char * address;
2636           int length;
2637           int type;
2638           struct hostent h;
2639           struct hostent_data hdata;
2640           int rc;
2641           rc = gethostbyaddr_r(address, length, type, &h, &hdata);
2642         ]])
2643       ],[
2644         AC_MSG_RESULT([yes])
2645         AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
2646         AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
2647         ac_cv_gethostbyaddr_r_args="5"
2648       ],[
2649         AC_MSG_RESULT([no])
2650       ])
2651     fi
2652
2653     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2654       AC_MSG_CHECKING([if gethostbyaddr_r takes 7 arguments])
2655       AC_COMPILE_IFELSE([
2656         AC_LANG_PROGRAM([[
2657 #include <sys/types.h>
2658 #include <netdb.h>
2659         ]],[[
2660           char * address;
2661           int length;
2662           int type;
2663           struct hostent h;
2664           char buffer[8192];
2665           int h_errnop;
2666           struct hostent * hp;
2667           hp = gethostbyaddr_r(address, length, type, &h,
2668                                buffer, 8192, &h_errnop);
2669         ]])
2670       ],[
2671         AC_MSG_RESULT([yes])
2672         AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args])
2673         ac_cv_gethostbyaddr_r_args="7"
2674       ],[
2675         AC_MSG_RESULT([no])
2676       ])
2677     fi
2678
2679     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2680       AC_MSG_CHECKING([if gethostbyaddr_r takes 8 arguments])
2681       AC_COMPILE_IFELSE([
2682         AC_LANG_PROGRAM([[
2683 #include <sys/types.h>
2684 #include <netdb.h>
2685         ]],[[
2686           char * address;
2687           int length;
2688           int type;
2689           struct hostent h;
2690           char buffer[8192];
2691           int h_errnop;
2692           struct hostent * hp;
2693           int rc;
2694           rc = gethostbyaddr_r(address, length, type, &h,
2695                                buffer, 8192, &hp, &h_errnop);
2696         ]])
2697       ],[
2698         AC_MSG_RESULT([yes])
2699         AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
2700         ac_cv_gethostbyaddr_r_args="8"
2701       ],[
2702         AC_MSG_RESULT([no])
2703       ])
2704     fi
2705
2706     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2707       AC_MSG_WARN([Cannot find out how to use gethostbyaddr_r])
2708       AC_MSG_WARN([HAVE_GETHOSTBYADDR_R will not be defined])
2709       ac_cv_func_gethostbyaddr_r="no"
2710     else
2711       AC_DEFINE_UNQUOTED(HAVE_GETHOSTBYADDR_R, 1,
2712         [Define to 1 if you have the gethostbyaddr_r function.])
2713       ac_cv_func_gethostbyaddr_r="yes"
2714     fi
2715
2716   else
2717     ac_cv_func_gethostbyaddr_r="no"
2718   fi
2719 ])
2720
2721
2722 dnl CURL_CHECK_GETHOSTBYNAME_R
2723 dnl -------------------------------------------------
2724 dnl check number of arguments for gethostbyname_r, it
2725 dnl might take either 3, 5, or 6 arguments.
2726
2727 AC_DEFUN([CURL_CHECK_GETHOSTBYNAME_R], [
2728   #
2729   AC_MSG_CHECKING([for gethostbyname_r])
2730   AC_LINK_IFELSE([
2731     AC_LANG_FUNC_LINK_TRY([gethostbyname_r])
2732   ],[
2733     AC_MSG_RESULT([yes])
2734     tmp_cv_gethostbyname_r="yes"
2735   ],[
2736     AC_MSG_RESULT([no])
2737     tmp_cv_gethostbyname_r="no"
2738   ])
2739   #
2740   if test "$tmp_cv_gethostbyname_r" != "yes"; then
2741     AC_MSG_CHECKING([deeper for gethostbyname_r])
2742     AC_LINK_IFELSE([
2743       AC_LANG_PROGRAM([[
2744       ]],[[
2745         gethostbyname_r();
2746       ]])
2747     ],[
2748       AC_MSG_RESULT([yes])
2749       tmp_cv_gethostbyname_r="yes"
2750     ],[
2751       AC_MSG_RESULT([but still no])
2752       tmp_cv_gethostbyname_r="no"
2753     ])
2754   fi
2755   #
2756   if test "$tmp_cv_gethostbyname_r" = "yes"; then
2757
2758     ac_cv_gethostbyname_r_args="unknown"
2759
2760     AC_MSG_CHECKING([if gethostbyname_r takes 3 arguments])
2761     AC_COMPILE_IFELSE([
2762       AC_LANG_PROGRAM([[
2763 #include <string.h>
2764 #include <sys/types.h>
2765 #include <netdb.h>
2766 #undef NULL
2767 #define NULL (void *)0
2768         int
2769         gethostbyname_r(const char *, struct hostent *,
2770                         struct hostent_data *);
2771       ]],[[
2772         struct hostent_data data;
2773         gethostbyname_r(NULL, NULL, NULL);
2774       ]])
2775     ],[
2776       AC_MSG_RESULT([yes])
2777       AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
2778       ac_cv_gethostbyname_r_args="3"
2779     ],[
2780       AC_MSG_RESULT([no])
2781     ])
2782
2783     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2784       AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
2785       AC_COMPILE_IFELSE([
2786         AC_LANG_PROGRAM([[
2787 #define _REENTRANT
2788 #include <string.h>
2789 #include <sys/types.h>
2790 #include <netdb.h>
2791 #undef NULL
2792 #define NULL (void *)0
2793           int
2794           gethostbyname_r(const char *, struct hostent *,
2795                           struct hostent_data *);
2796         ]],[[
2797           struct hostent_data data;
2798           gethostbyname_r(NULL, NULL, NULL);
2799         ]])
2800       ],[
2801         AC_MSG_RESULT([yes])
2802         AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
2803         AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
2804         ac_cv_gethostbyname_r_args="3"
2805       ],[
2806         AC_MSG_RESULT([no])
2807       ])
2808     fi
2809
2810     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2811       AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
2812       AC_COMPILE_IFELSE([
2813         AC_LANG_PROGRAM([[
2814 #include <sys/types.h>
2815 #include <netdb.h>
2816 #undef NULL
2817 #define NULL (void *)0
2818           struct hostent *
2819           gethostbyname_r(const char *, struct hostent *,
2820                           char *, int, int *);
2821         ]],[[
2822           gethostbyname_r(NULL, NULL, NULL, 0, NULL);
2823         ]])
2824       ],[
2825         AC_MSG_RESULT([yes])
2826         AC_DEFINE(HAVE_GETHOSTBYNAME_R_5, 1, [gethostbyname_r() takes 5 args])
2827         ac_cv_gethostbyname_r_args="5"
2828       ],[
2829         AC_MSG_RESULT([no])
2830       ])
2831     fi
2832
2833     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2834       AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
2835       AC_COMPILE_IFELSE([
2836         AC_LANG_PROGRAM([[
2837 #include <sys/types.h>
2838 #include <netdb.h>
2839 #undef NULL
2840 #define NULL (void *)0
2841           int
2842           gethostbyname_r(const char *, struct hostent *,
2843                           char *, size_t, struct hostent **, int *);
2844         ]],[[
2845           gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);
2846         ]])
2847       ],[
2848         AC_MSG_RESULT([yes])
2849         AC_DEFINE(HAVE_GETHOSTBYNAME_R_6, 1, [gethostbyname_r() takes 6 args])
2850         ac_cv_gethostbyname_r_args="6"
2851       ],[
2852         AC_MSG_RESULT([no])
2853       ])
2854     fi
2855
2856     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2857       AC_MSG_WARN([Cannot find out how to use gethostbyname_r])
2858       AC_MSG_WARN([HAVE_GETHOSTBYNAME_R will not be defined])
2859       ac_cv_func_gethostbyname_r="no"
2860     else
2861       AC_DEFINE_UNQUOTED(HAVE_GETHOSTBYNAME_R, 1,
2862         [Define to 1 if you have the gethostbyname_r function.])
2863       ac_cv_func_gethostbyname_r="yes"
2864     fi
2865
2866   else
2867     ac_cv_func_gethostbyname_r="no"
2868   fi
2869 ])
2870
2871
2872 dnl **********************************************************************
2873 dnl CURL_DETECT_ICC ([ACTION-IF-YES])
2874 dnl
2875 dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
2876 dnl sets the $ICC variable to "yes" or "no"
2877 dnl **********************************************************************
2878 AC_DEFUN([CURL_DETECT_ICC],
2879 [
2880     ICC="no"
2881     AC_MSG_CHECKING([for icc in use])
2882     if test "$GCC" = "yes"; then
2883        dnl check if this is icc acting as gcc in disguise
2884        AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
2885          dnl action if the text is found, this it has not been replaced by the
2886          dnl cpp
2887          ICC="no",
2888          dnl the text was not found, it was replaced by the cpp
2889          ICC="yes"
2890          AC_MSG_RESULT([yes])
2891          [$1]
2892        )
2893     fi
2894     if test "$ICC" = "no"; then
2895         # this is not ICC
2896         AC_MSG_RESULT([no])
2897     fi
2898 ])
2899
2900 dnl We create a function for detecting which compiler we use and then set as
2901 dnl pendantic compiler options as possible for that particular compiler. The
2902 dnl options are only used for debug-builds.
2903
2904 AC_DEFUN([CURL_CC_DEBUG_OPTS],
2905 [
2906     if test "z$ICC" = "z"; then
2907       CURL_DETECT_ICC
2908     fi
2909
2910     if test "$GCC" = "yes"; then
2911
2912        dnl figure out gcc version!
2913        AC_MSG_CHECKING([gcc version])
2914        gccver=`$CC -dumpversion`
2915        num1=`echo $gccver | cut -d . -f1`
2916        num2=`echo $gccver | cut -d . -f2`
2917        gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
2918        AC_MSG_RESULT($gccver)
2919
2920        if test "$ICC" = "yes"; then
2921          dnl this is icc, not gcc.
2922
2923          dnl ICC warnings we ignore:
2924          dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
2925          dnl   "invalid format string conversion"
2926          dnl * 279 warns on static conditions in while expressions
2927          dnl * 981 warns on "operands are evaluated in unspecified order"
2928          dnl * 1418 "external definition with no prior declaration"
2929          dnl * 1419 warns on "external declaration in primary source file"
2930          dnl   which we know and do on purpose.
2931
2932          WARN="-wd279,269,981,1418,1419"
2933
2934          if test "$gccnum" -gt "600"; then
2935             dnl icc 6.0 and older doesn't have the -Wall flag
2936             WARN="-Wall $WARN"
2937          fi
2938        else dnl $ICC = yes
2939          dnl this is a set of options we believe *ALL* gcc versions support:
2940          WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
2941
2942          dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
2943
2944          if test "$gccnum" -ge "207"; then
2945            dnl gcc 2.7 or later
2946            WARN="$WARN -Wmissing-declarations"
2947          fi
2948
2949          if test "$gccnum" -gt "295"; then
2950            dnl only if the compiler is newer than 2.95 since we got lots of
2951            dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
2952            dnl gcc 2.95.4 on FreeBSD 4.9!
2953            WARN="$WARN -Wundef -Wno-long-long -Wsign-compare -Wshadow -Wno-multichar"
2954          fi
2955
2956          if test "$gccnum" -ge "296"; then
2957            dnl gcc 2.96 or later
2958            WARN="$WARN -Wfloat-equal"
2959          fi
2960
2961          if test "$gccnum" -gt "296"; then
2962            dnl this option does not exist in 2.96
2963            WARN="$WARN -Wno-format-nonliteral"
2964          fi
2965
2966          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
2967          dnl on i686-Linux as it gives us heaps with false positives.
2968          dnl Also, on gcc 4.0.X it is totally unbearable and complains all
2969          dnl over making it unusable for generic purposes. Let's not use it.
2970
2971          if test "$gccnum" -ge "303"; then
2972            dnl gcc 3.3 and later
2973            WARN="$WARN -Wendif-labels -Wstrict-prototypes"
2974          fi
2975
2976          if test "$gccnum" -ge "304"; then
2977            # try these on gcc 3.4
2978            WARN="$WARN -Wdeclaration-after-statement"
2979          fi
2980
2981          for flag in $CPPFLAGS; do
2982            case "$flag" in
2983             -I*)
2984               dnl Include path, provide a -isystem option for the same dir
2985               dnl to prevent warnings in those dirs. The -isystem was not very
2986               dnl reliable on earlier gcc versions.
2987               add=`echo $flag | sed 's/^-I/-isystem /g'`
2988               WARN="$WARN $add"
2989               ;;
2990            esac
2991          done
2992
2993        fi dnl $ICC = no
2994
2995        CFLAGS="$CFLAGS $WARN"
2996
2997       AC_MSG_NOTICE([Added this set of compiler options: $WARN])
2998
2999     else dnl $GCC = yes
3000
3001       AC_MSG_NOTICE([Added no extra compiler options])
3002
3003     fi dnl $GCC = yes
3004
3005     dnl strip off optimizer flags
3006     NEWFLAGS=""
3007     for flag in $CFLAGS; do
3008       case "$flag" in
3009       -O*)
3010         dnl echo "cut off $flag"
3011         ;;
3012       *)
3013         NEWFLAGS="$NEWFLAGS $flag"
3014         ;;
3015       esac
3016     done
3017     CFLAGS=$NEWFLAGS
3018
3019 ]) dnl end of AC_DEFUN()
3020
3021 # This is only a temporary fix. This macro is here to replace the broken one
3022 # delivered by the automake project (including the 1.9.6 release). As soon as
3023 # they ship a working version we SHOULD remove this work-around.
3024
3025 AC_DEFUN([AM_MISSING_HAS_RUN],
3026 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
3027 test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
3028 # Use eval to expand $SHELL
3029 if eval "$MISSING --run true"; then
3030   am_missing_run="$MISSING --run "
3031 else
3032   am_missing_run=
3033   AC_MSG_WARN([`missing' script is too old or missing])
3034 fi
3035 ])
3036
3037
3038 dnl CURL_VERIFY_RUNTIMELIBS
3039 dnl -------------------------------------------------
3040 dnl Verify that the shared libs found so far can be used when running
3041 dnl programs, since otherwise the situation will create odd configure errors
3042 dnl that are misleading people.
3043 dnl
3044 dnl Make sure this test is run BEFORE the first test in the script that
3045 dnl runs anything, which at the time of this writing is the AC_CHECK_SIZEOF
3046 dnl macro. It must also run AFTER all lib-checking macros are complete.
3047
3048 AC_DEFUN([CURL_VERIFY_RUNTIMELIBS], [
3049
3050   dnl this test is of course not sensible if we are cross-compiling!
3051   if test "x$cross_compiling" != xyes; then
3052
3053     dnl just run a program to verify that the libs checked for previous to this
3054     dnl point also is available run-time!
3055     AC_MSG_CHECKING([run-time libs availability])
3056     AC_TRY_RUN([
3057 main()
3058 {
3059   return 0;
3060 }
3061 ],
3062     AC_MSG_RESULT([fine]),
3063     AC_MSG_RESULT([failed])
3064     AC_MSG_ERROR([one or more libs available at link-time are not available run-time. Libs used at link-time: $LIBS])
3065     )
3066
3067     dnl if this test fails, configure has already stopped
3068   fi
3069 ])
3070
3071
3072 dnl CURL_CHECK_VARIADIC_MACROS
3073 dnl -------------------------------------------------
3074 dnl Check compiler support of variadic macros
3075
3076 AC_DEFUN([CURL_CHECK_VARIADIC_MACROS], [
3077   AC_CACHE_CHECK([for compiler support of C99 variadic macro style],
3078     [curl_cv_variadic_macros_c99], [
3079     AC_COMPILE_IFELSE([
3080       AC_LANG_PROGRAM([[
3081 #define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
3082 #define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
3083         int fun3(int arg1, int arg2, int arg3);
3084         int fun2(int arg1, int arg2);
3085         int fun3(int arg1, int arg2, int arg3)
3086         { return arg1 + arg2 + arg3; }
3087         int fun2(int arg1, int arg2)
3088         { return arg1 + arg2; }
3089       ]],[[
3090         int res3 = c99_vmacro3(1, 2, 3);
3091         int res2 = c99_vmacro2(1, 2);
3092       ]])
3093     ],[
3094       curl_cv_variadic_macros_c99="yes"
3095     ],[
3096       curl_cv_variadic_macros_c99="no"
3097     ])
3098   ])
3099   case "$curl_cv_variadic_macros_c99" in
3100     yes)
3101       AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_C99, 1,
3102         [Define to 1 if compiler supports C99 variadic macro style.])
3103       ;;
3104   esac
3105   AC_CACHE_CHECK([for compiler support of old gcc variadic macro style],
3106     [curl_cv_variadic_macros_gcc], [
3107     AC_COMPILE_IFELSE([
3108       AC_LANG_PROGRAM([[
3109 #define gcc_vmacro3(first, args...) fun3(first, args)
3110 #define gcc_vmacro2(first, args...) fun2(first, args)
3111         int fun3(int arg1, int arg2, int arg3);
3112         int fun2(int arg1, int arg2);
3113         int fun3(int arg1, int arg2, int arg3)
3114         { return arg1 + arg2 + arg3; }
3115         int fun2(int arg1, int arg2)
3116         { return arg1 + arg2; }
3117       ]],[[
3118         int res3 = gcc_vmacro3(1, 2, 3);
3119         int res2 = gcc_vmacro2(1, 2);
3120       ]])
3121     ],[
3122       curl_cv_variadic_macros_gcc="yes"
3123     ],[
3124       curl_cv_variadic_macros_gcc="no"
3125     ])
3126   ])
3127   case "$curl_cv_variadic_macros_gcc" in
3128     yes)
3129       AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_GCC, 1,
3130         [Define to 1 if compiler supports old gcc variadic macro style.])
3131       ;;
3132   esac
3133 ])
3134
3135
3136 dnl CURL_CHECK_CA_BUNDLE
3137 dnl -------------------------------------------------
3138 dnl Check if a default ca-bundle should be used
3139 dnl
3140 dnl regarding the paths this will scan:
3141 dnl /etc/ssl/certs/ca-certificates.crt Debian systems
3142 dnl /etc/pki/tls/certs/ca-bundle.crt Redhat and Mandriva
3143 dnl /usr/share/ssl/certs/ca-bundle.crt old(er) Redhat
3144 dnl /etc/ssl/certs/ (ca path) SUSE
3145
3146 AC_DEFUN([CURL_CHECK_CA_BUNDLE], [
3147
3148   AC_MSG_CHECKING([default CA cert bundle/path])
3149
3150   AC_ARG_WITH(ca-bundle,
3151 AC_HELP_STRING([--with-ca-bundle=FILE], [File name to use as CA bundle])
3152 AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]),
3153   [
3154     want_ca="$withval"
3155     if test "x$want_ca" = "xyes"; then
3156       AC_MSG_ERROR([--with-ca-bundle=FILE requires a path to the CA bundle])
3157     fi
3158   ],
3159   [ want_ca="unset" ])
3160   AC_ARG_WITH(ca-path,
3161 AC_HELP_STRING([--with-ca-path=DIRECTORY], [Directory to use as CA path])
3162 AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
3163   [
3164     want_capath="$withval"
3165     if test "x$want_capath" = "xyes"; then
3166       AC_MSG_ERROR([--with-ca-path=DIRECTORY requires a path to the CA path directory])
3167     fi
3168   ],
3169   [ want_capath="unset"])
3170
3171   if test "x$want_ca" != "xno" -a "x$want_ca" != "xunset" -a \
3172           "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
3173     dnl both given
3174     AC_MSG_ERROR([Can't specify both --with-ca-bundle and --with-ca-path.])
3175   elif test "x$want_ca" != "xno" -a "x$want_ca" != "xunset"; then
3176     dnl --with-ca-bundle given
3177     ca="$want_ca"
3178     capath="no"
3179   elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
3180     dnl --with-ca-path given
3181     if test "x$OPENSSL_ENABLED" != "x1"; then
3182       AC_MSG_ERROR([--with-ca-path only works with openSSL])
3183     fi
3184     capath="$want_capath"
3185     ca="no"
3186   else
3187     dnl neither of --with-ca-* given
3188     dnl first try autodetecting a CA bundle , then a CA path
3189     dnl both autodetections can be skipped by --without-ca-*
3190     ca="no"
3191     capath="no"
3192     if test "x$want_ca" = "xunset"; then
3193       dnl the path we previously would have installed the curl ca bundle
3194       dnl to, and thus we now check for an already existing cert in that place
3195       dnl in case we find no other
3196       if test "x$prefix" != xNONE; then
3197         cac="${prefix}/share/curl/curl-ca-bundle.crt"
3198       else
3199         cac="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
3200       fi
3201
3202       for a in /etc/ssl/certs/ca-certificates.crt \
3203                /etc/pki/tls/certs/ca-bundle.crt \
3204                /usr/share/ssl/certs/ca-bundle.crt \
3205                "$cac"; do
3206         if test -f "$a"; then
3207           ca="$a"
3208           break
3209         fi
3210       done
3211     fi
3212     if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \
3213             "x$OPENSSL_ENABLED" = "x1"; then
3214       for a in /etc/ssl/certs/; do
3215         if test -d "$a" && ls "$a"/[[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]].0 >/dev/null 2>/dev/null; then
3216           capath="$a"
3217           break
3218         fi
3219       done
3220     fi
3221   fi
3222         
3223     
3224
3225   if test "x$ca" != "xno"; then
3226     CURL_CA_BUNDLE='"'$ca'"'
3227     AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle])
3228     AC_SUBST(CURL_CA_BUNDLE)
3229     AC_MSG_RESULT([$ca])
3230   elif test "x$capath" != "xno"; then
3231     CURL_CA_PATH="\"$capath\""
3232     AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path])
3233     AC_MSG_RESULT([$capath (capath)])
3234   else
3235     AC_MSG_RESULT([no])
3236   fi
3237 ])
3238