fallback to gettimeofday when monotonic clock is unavailable at run-time
[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 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_SYS_TIME_H
1990 #include <sys/time.h>
1991 #ifdef TIME_WITH_SYS_TIME
1992 #include <time.h>
1993 #endif
1994 #else
1995 #ifdef HAVE_TIME_H
1996 #include <time.h>
1997 #endif
1998 #endif
1999     ]],[[
2000       struct timespec ts;
2001       (void)clock_gettime(CLOCK_MONOTONIC, &ts);
2002     ]])
2003   ],[
2004     AC_MSG_RESULT([yes])
2005     ac_cv_func_clock_gettime="yes"
2006   ],[
2007     AC_MSG_RESULT([no])
2008     ac_cv_func_clock_gettime="no"
2009   ])
2010   dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally postponed
2011   dnl until library linking and run-time checks for clock_gettime succeed.
2012 ]) dnl AC_DEFUN
2013
2014
2015 dnl CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC
2016 dnl -------------------------------------------------
2017 dnl If monotonic clock_gettime is available then,
2018 dnl check and prepended to LIBS any needed libraries.
2019
2020 AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
2021   AC_REQUIRE([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC])dnl
2022   #
2023   if test "$ac_cv_func_clock_gettime" = "yes"; then
2024     #
2025     AC_MSG_CHECKING([for clock_gettime in libraries])
2026     #
2027     curl_cv_save_LIBS="$LIBS"
2028     curl_cv_gclk_LIBS="unknown"
2029     #
2030     for x_xlibs in '' '-lrt' '-lposix4' ; do
2031       if test "$curl_cv_gclk_LIBS" = "unknown"; then
2032         if test -z "$x_xlibs"; then
2033           LIBS="$curl_cv_save_LIBS"
2034         else
2035           LIBS="$x_xlibs $curl_cv_save_LIBS"
2036         fi
2037         AC_LINK_IFELSE([
2038           AC_LANG_PROGRAM([[
2039 #ifdef HAVE_SYS_TYPES_H
2040 #include <sys/types.h>
2041 #endif
2042 #ifdef HAVE_SYS_TIME_H
2043 #include <sys/time.h>
2044 #ifdef TIME_WITH_SYS_TIME
2045 #include <time.h>
2046 #endif
2047 #else
2048 #ifdef HAVE_TIME_H
2049 #include <time.h>
2050 #endif
2051 #endif
2052           ]],[[
2053             struct timespec ts;
2054             (void)clock_gettime(CLOCK_MONOTONIC, &ts);
2055           ]])
2056         ],[
2057           curl_cv_gclk_LIBS="$x_xlibs"
2058         ])
2059       fi
2060     done
2061     #
2062     LIBS="$curl_cv_save_LIBS"
2063     #
2064     case X-"$curl_cv_gclk_LIBS" in
2065       X-unknown)
2066         AC_MSG_RESULT([cannot find clock_gettime])
2067         AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined])
2068         ac_cv_func_clock_gettime="no"
2069         ;;
2070       X-)
2071         AC_MSG_RESULT([no additional lib required])
2072         ac_cv_func_clock_gettime="yes"
2073         ;;
2074       *)
2075         if test -z "$curl_cv_save_LIBS"; then
2076           LIBS="$curl_cv_gclk_LIBS"
2077         else
2078           LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS"
2079         fi
2080         AC_MSG_RESULT([$curl_cv_gclk_LIBS])
2081         ac_cv_func_clock_gettime="yes"
2082         ;;
2083     esac
2084     #
2085     dnl only do runtime verification when not cross-compiling
2086     if test "x$cross_compiling" != "xyes" &&
2087       test "$ac_cv_func_clock_gettime" = "yes"; then
2088       AC_MSG_CHECKING([if monotonic clock_gettime works])
2089       AC_RUN_IFELSE([
2090         AC_LANG_PROGRAM([[
2091 #ifdef HAVE_SYS_TYPES_H
2092 #include <sys/types.h>
2093 #endif
2094 #ifdef HAVE_SYS_TIME_H
2095 #include <sys/time.h>
2096 #ifdef TIME_WITH_SYS_TIME
2097 #include <time.h>
2098 #endif
2099 #else
2100 #ifdef HAVE_TIME_H
2101 #include <time.h>
2102 #endif
2103 #endif
2104         ]],[[
2105           struct timespec ts;
2106           if (0 == clock_gettime(CLOCK_MONOTONIC, &ts))
2107             exit(0);
2108           else
2109             exit(1);
2110         ]])
2111       ],[
2112         AC_MSG_RESULT([yes])
2113       ],[
2114         AC_MSG_RESULT([no])
2115         AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined])
2116         ac_cv_func_clock_gettime="no"
2117         LIBS="$curl_cv_save_LIBS"
2118       ])
2119     fi
2120     #
2121     case "$ac_cv_func_clock_gettime" in
2122       yes)
2123         AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME_MONOTONIC, 1,
2124           [Define to 1 if you have the clock_gettime function and monotonic timer.])
2125         ;;
2126     esac
2127     #
2128   fi
2129   #
2130 ]) dnl AC_DEFUN
2131
2132
2133 dnl CURL_CHECK_FUNC_SELECT
2134 dnl -------------------------------------------------
2135 dnl Test if the socket select() function is available,
2136 dnl and check its return type and the types of its
2137 dnl arguments. If the function succeeds HAVE_SELECT
2138 dnl will be defined, defining the types of the
2139 dnl arguments in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234
2140 dnl and SELECT_TYPE_ARG5, defining the type of the
2141 dnl function return value in SELECT_TYPE_RETV, and
2142 dnl also defining the type qualifier of fifth argument
2143 dnl in SELECT_QUAL_ARG5.
2144
2145 AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
2146   AC_REQUIRE([CURL_CHECK_STRUCT_TIMEVAL])dnl
2147   AC_CHECK_HEADERS(sys/select.h sys/socket.h)
2148   #
2149   AC_MSG_CHECKING([for select])
2150   AC_LINK_IFELSE([
2151     AC_LANG_PROGRAM([[
2152 #undef inline
2153 #ifdef HAVE_WINDOWS_H
2154 #ifndef WIN32_LEAN_AND_MEAN
2155 #define WIN32_LEAN_AND_MEAN
2156 #endif
2157 #include <windows.h>
2158 #ifdef HAVE_WINSOCK2_H
2159 #include <winsock2.h>
2160 #else
2161 #ifdef HAVE_WINSOCK_H
2162 #include <winsock.h>
2163 #endif
2164 #endif
2165 #endif
2166 #ifdef HAVE_SYS_TYPES_H
2167 #include <sys/types.h>
2168 #endif
2169 #ifdef HAVE_SYS_TIME_H
2170 #include <sys/time.h>
2171 #ifdef TIME_WITH_SYS_TIME
2172 #include <time.h>
2173 #endif
2174 #else
2175 #ifdef HAVE_TIME_H
2176 #include <time.h>
2177 #endif
2178 #endif
2179 #ifndef HAVE_WINDOWS_H
2180 #ifdef HAVE_SYS_SELECT_H
2181 #include <sys/select.h>
2182 #endif
2183 #ifdef HAVE_SYS_SOCKET_H
2184 #include <sys/socket.h>
2185 #endif
2186 #endif
2187     ]],[[
2188       select(0, 0, 0, 0, 0);
2189     ]])
2190   ],[
2191     AC_MSG_RESULT([yes])
2192     curl_cv_select="yes"
2193   ],[
2194     AC_MSG_RESULT([no])
2195     curl_cv_select="no"
2196   ])
2197   #
2198   if test "$curl_cv_select" = "yes"; then
2199     AC_CACHE_CHECK([types of args and return type for select],
2200       [curl_cv_func_select_args], [
2201       curl_cv_func_select_args="unknown"
2202       for sel_retv in 'int' 'ssize_t'; do
2203         for sel_arg1 in 'int' 'ssize_t' 'size_t' 'unsigned long int' 'unsigned int'; do
2204           for sel_arg234 in 'fd_set *' 'int *' 'void *'; do
2205             for sel_arg5 in 'struct timeval *' 'const struct timeval *'; do
2206               if test "$curl_cv_func_select_args" = "unknown"; then
2207                 AC_COMPILE_IFELSE([
2208                   AC_LANG_PROGRAM([[
2209 #undef inline
2210 #ifdef HAVE_WINDOWS_H
2211 #ifndef WIN32_LEAN_AND_MEAN
2212 #define WIN32_LEAN_AND_MEAN
2213 #endif
2214 #include <windows.h>
2215 #ifdef HAVE_WINSOCK2_H
2216 #include <winsock2.h>
2217 #else
2218 #ifdef HAVE_WINSOCK_H
2219 #include <winsock.h>
2220 #endif
2221 #endif
2222 #define SELECTCALLCONV PASCAL
2223 #endif
2224 #ifdef HAVE_SYS_TYPES_H
2225 #include <sys/types.h>
2226 #endif
2227 #ifdef HAVE_SYS_TIME_H
2228 #include <sys/time.h>
2229 #ifdef TIME_WITH_SYS_TIME
2230 #include <time.h>
2231 #endif
2232 #else
2233 #ifdef HAVE_TIME_H
2234 #include <time.h>
2235 #endif
2236 #endif
2237 #ifndef HAVE_WINDOWS_H
2238 #ifdef HAVE_SYS_SELECT_H
2239 #include <sys/select.h>
2240 #endif
2241 #ifdef HAVE_SYS_SOCKET_H
2242 #include <sys/socket.h>
2243 #endif
2244 #define SELECTCALLCONV
2245 #endif
2246 #ifndef HAVE_STRUCT_TIMEVAL
2247                     struct timeval {
2248                       long tv_sec;
2249                       long tv_usec;
2250                     };
2251 #endif
2252                     extern $sel_retv SELECTCALLCONV select($sel_arg1,
2253                                                            $sel_arg234,
2254                                                            $sel_arg234,
2255                                                            $sel_arg234,
2256                                                            $sel_arg5);
2257                   ]],[[
2258                     $sel_arg1   nfds=0;
2259                     $sel_arg234 rfds=0;
2260                     $sel_arg234 wfds=0;
2261                     $sel_arg234 efds=0;
2262                     $sel_retv res = select(nfds, rfds, wfds, efds, 0);
2263                   ]])
2264                 ],[
2265                   curl_cv_func_select_args="$sel_arg1,$sel_arg234,$sel_arg5,$sel_retv"
2266                 ])
2267               fi
2268             done
2269           done
2270         done
2271       done
2272     ]) # AC_CACHE_CHECK
2273     if test "$curl_cv_func_select_args" = "unknown"; then
2274       AC_MSG_WARN([Cannot find proper types to use for select args])
2275       AC_MSG_WARN([HAVE_SELECT will not be defined])
2276     else
2277       select_prev_IFS=$IFS; IFS=','
2278       set dummy `echo "$curl_cv_func_select_args" | sed 's/\*/\*/g'`
2279       IFS=$select_prev_IFS
2280       shift
2281       #
2282       sel_qual_type_arg5=$[3]
2283       #
2284       AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1, $[1],
2285         [Define to the type of arg 1 for select.])
2286       AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234, $[2],
2287         [Define to the type of args 2, 3 and 4 for select.])
2288       AC_DEFINE_UNQUOTED(SELECT_TYPE_RETV, $[4],
2289         [Define to the function return type for select.])
2290       #
2291       prev_sh_opts=$-
2292       #
2293       case $prev_sh_opts in
2294         *f*)
2295           ;;
2296         *)
2297           set -f
2298           ;;
2299       esac
2300       #
2301       case "$sel_qual_type_arg5" in
2302         const*)
2303           sel_qual_arg5=const
2304           sel_type_arg5=`echo $sel_qual_type_arg5 | sed 's/^const //'`
2305         ;;
2306         *)
2307           sel_qual_arg5=
2308           sel_type_arg5=$sel_qual_type_arg5
2309         ;;
2310       esac
2311       #
2312       AC_DEFINE_UNQUOTED(SELECT_QUAL_ARG5, $sel_qual_arg5,
2313         [Define to the type qualifier of arg 5 for select.])
2314       AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5, $sel_type_arg5,
2315         [Define to the type of arg 5 for select.])
2316       #
2317       case $prev_sh_opts in
2318         *f*)
2319           ;;
2320         *)
2321           set +f
2322           ;;
2323       esac
2324       #
2325       AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
2326         [Define to 1 if you have the select function.])
2327       ac_cv_func_select="yes"
2328     fi
2329   fi
2330 ]) # AC_DEFUN
2331
2332
2333 dnl ************************************************************
2334 dnl check for "localhost", if it doesn't exist, we can't do the
2335 dnl gethostbyname_r tests!
2336 dnl 
2337
2338 AC_DEFUN([CURL_CHECK_WORKING_RESOLVER],[
2339 AC_MSG_CHECKING([if "localhost" resolves])
2340 AC_TRY_RUN([
2341 #include <string.h>
2342 #include <sys/types.h>
2343 #include <netdb.h>
2344 #ifndef NULL
2345 #define NULL (void *)0
2346 #endif
2347
2348 int
2349 main () {
2350 struct hostent *h;
2351 h = gethostbyname("localhost");
2352 exit (h == NULL ? 1 : 0); }],[
2353       AC_MSG_RESULT(yes)],[
2354       AC_MSG_RESULT(no)
2355       AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve])
2356
2357       ]
2358 )
2359 ])
2360
2361 dnl ************************************************************
2362 dnl check for working getaddrinfo() that works with AI_NUMERICHOST
2363 dnl
2364 AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
2365   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
2366   AC_TRY_RUN( [
2367 #include <netdb.h>
2368 #include <sys/types.h>
2369 #include <sys/socket.h>
2370
2371 int main(void)
2372 {
2373     struct addrinfo hints, *ai;
2374     int error;
2375
2376     memset(&hints, 0, sizeof(hints));
2377     hints.ai_flags = AI_NUMERICHOST;
2378     hints.ai_family = AF_UNSPEC;
2379     hints.ai_socktype = SOCK_STREAM;
2380     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
2381     if (error) {
2382         return 1;
2383     }
2384     return 0;
2385 }
2386 ],[
2387   ac_cv_working_getaddrinfo="yes"
2388 ],[
2389   ac_cv_working_getaddrinfo="no"
2390 ],[
2391   ac_cv_working_getaddrinfo="yes"
2392 ])])
2393 if test "$ac_cv_working_getaddrinfo" = "yes"; then
2394   AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works])
2395   AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
2396
2397   IPV6_ENABLED=1
2398   AC_SUBST(IPV6_ENABLED)
2399 fi
2400 ])
2401
2402
2403 AC_DEFUN([CURL_CHECK_LOCALTIME_R],
2404 [
2405   dnl check for localtime_r
2406   AC_CHECK_FUNCS(localtime_r,[
2407     AC_MSG_CHECKING(whether localtime_r is declared)
2408     AC_EGREP_CPP(localtime_r,[
2409 #include <time.h>],[
2410       AC_MSG_RESULT(yes)],[
2411       AC_MSG_RESULT(no)
2412       AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared)
2413       AC_EGREP_CPP(localtime_r,[
2414 #define _REENTRANT
2415 #include <time.h>],[
2416         AC_DEFINE(NEED_REENTRANT)
2417         AC_MSG_RESULT(yes)],
2418         AC_MSG_RESULT(no))])])
2419 ])
2420
2421 dnl
2422 dnl This function checks for strerror_r(). If it isn't found at first, it
2423 dnl retries with _THREAD_SAFE defined, as that is what AIX seems to require
2424 dnl in order to find this function.
2425 dnl
2426 dnl If the function is found, it will then proceed to check how the function
2427 dnl actually works: glibc-style or POSIX-style.
2428 dnl
2429 dnl glibc:
2430 dnl      char *strerror_r(int errnum, char *buf, size_t n);
2431 dnl  
2432 dnl  What this one does is to return the error string (no surprises there),
2433 dnl  but it doesn't usually copy anything into buf!  The 'buf' and 'n'
2434 dnl  parameters are only meant as an optional working area, in case strerror_r
2435 dnl  needs it.  A quick test on a few systems shows that it's generally not
2436 dnl  touched at all.
2437 dnl
2438 dnl POSIX:
2439 dnl      int strerror_r(int errnum, char *buf, size_t n);
2440 dnl
2441 AC_DEFUN([CURL_CHECK_STRERROR_R],
2442 [
2443   AC_CHECK_FUNCS(strerror_r)
2444
2445   if test "x$ac_cv_func_strerror_r" = "xyes"; then
2446
2447     AC_MSG_CHECKING(whether strerror_r is declared)
2448     AC_EGREP_CPP(strerror_r,[
2449 #include <string.h>],[
2450       AC_MSG_RESULT(yes)],[
2451       AC_MSG_RESULT(no)
2452       AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
2453       AC_EGREP_CPP(strerror_r,[
2454 #define _REENTRANT
2455 #include <string.h>],[
2456         CPPFLAGS="-D_REENTRANT $CPPFLAGS"
2457         AC_MSG_RESULT(yes)],
2458         AC_MSG_RESULT(no)
2459         AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
2460        ) dnl with _THREAD_SAFE
2461     ]) dnl plain cpp for it
2462
2463     dnl determine if this strerror_r() is glibc or POSIX
2464     AC_MSG_CHECKING([for a glibc strerror_r API])
2465     AC_TRY_RUN([
2466 #include <string.h>
2467 #include <errno.h>
2468 int
2469 main () {
2470   char buffer[1024]; /* big enough to play with */
2471   char *string =
2472     strerror_r(EACCES, buffer, sizeof(buffer));
2473     /* this should've returned a string */
2474     if(!string || !string[0])
2475       return 99;
2476     return 0;
2477 }
2478 ],
2479     GLIBC_STRERROR_R="1"
2480     AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
2481     AC_MSG_RESULT([yes]),
2482     AC_MSG_RESULT([no]),
2483
2484     dnl Use an inferior method of strerror_r detection while cross-compiling
2485     AC_EGREP_CPP(yes, [
2486 #include <features.h>
2487 #ifdef __GLIBC__
2488 yes
2489 #endif
2490 ], 
2491       dnl looks like glibc, so assume a glibc-style strerror_r()
2492       GLIBC_STRERROR_R="1"
2493       AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
2494       AC_MSG_RESULT([yes]),
2495       AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
2496     ) dnl while cross-compiling
2497     )
2498
2499     if test -z "$GLIBC_STRERROR_R"; then
2500
2501       AC_MSG_CHECKING([for a POSIX strerror_r API])
2502       AC_TRY_RUN([
2503 #include <string.h>
2504 #include <errno.h>
2505 int
2506 main () {
2507   char buffer[1024]; /* big enough to play with */
2508   int error =
2509     strerror_r(EACCES, buffer, sizeof(buffer));
2510     /* This should've returned zero, and written an error string in the
2511        buffer.*/
2512     if(!buffer[0] || error)
2513       return 99;
2514     return 0;
2515 }
2516 ],
2517       AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-style strerror_r()])
2518       AC_MSG_RESULT([yes]),
2519       AC_MSG_RESULT([no]) ,
2520       dnl cross-compiling!
2521       AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
2522     )
2523
2524     fi dnl if not using glibc API
2525
2526   fi dnl we have a strerror_r
2527
2528 ])
2529
2530 AC_DEFUN([CURL_CHECK_INET_NTOA_R],
2531 [
2532   dnl determine if function definition for inet_ntoa_r exists.
2533   AC_CHECK_FUNCS(inet_ntoa_r,[
2534     AC_MSG_CHECKING(whether inet_ntoa_r is declared)
2535     AC_EGREP_CPP(inet_ntoa_r,[
2536 #include <arpa/inet.h>],[
2537       AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
2538       AC_MSG_RESULT(yes)],[
2539       AC_MSG_RESULT(no)
2540       AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
2541       AC_EGREP_CPP(inet_ntoa_r,[
2542 #define _REENTRANT
2543 #include <arpa/inet.h>],[
2544         AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
2545         AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
2546         AC_MSG_RESULT(yes)],
2547         AC_MSG_RESULT(no))])])
2548 ])
2549
2550
2551 dnl CURL_CHECK_GETHOSTBYADDR_R
2552 dnl -------------------------------------------------
2553 dnl check number of arguments for gethostbyaddr_r, it
2554 dnl might take either 5, 7, or 8 arguments.
2555
2556 AC_DEFUN([CURL_CHECK_GETHOSTBYADDR_R], [
2557   #
2558   AC_MSG_CHECKING([for gethostbyaddr_r])
2559   AC_LINK_IFELSE([
2560     AC_LANG_FUNC_LINK_TRY([gethostbyaddr_r])
2561   ],[
2562     AC_MSG_RESULT([yes])
2563     tmp_cv_gethostbyaddr_r="yes"
2564   ],[
2565     AC_MSG_RESULT([no])
2566     tmp_cv_gethostbyaddr_r="no"
2567   ])
2568   #
2569   if test "$tmp_cv_gethostbyaddr_r" != "yes"; then
2570     AC_MSG_CHECKING([deeper for gethostbyaddr_r])
2571     AC_LINK_IFELSE([
2572       AC_LANG_PROGRAM([[
2573       ]],[[
2574         gethostbyaddr_r();
2575       ]])
2576     ],[
2577       AC_MSG_RESULT([yes])
2578       tmp_cv_gethostbyaddr_r="yes"
2579     ],[
2580       AC_MSG_RESULT([but still no])
2581       tmp_cv_gethostbyaddr_r="no"
2582     ])
2583   fi
2584   #
2585   if test "$tmp_cv_gethostbyaddr_r" = "yes"; then
2586
2587     ac_cv_gethostbyaddr_r_args="unknown"
2588
2589     AC_MSG_CHECKING([if gethostbyaddr_r takes 5 arguments])
2590     AC_COMPILE_IFELSE([
2591       AC_LANG_PROGRAM([[
2592 #include <sys/types.h>
2593 #include <netdb.h>
2594       ]],[[
2595         char * address;
2596         int length;
2597         int type;
2598         struct hostent h;
2599         struct hostent_data hdata;
2600         int rc;
2601         rc = gethostbyaddr_r(address, length, type, &h, &hdata);
2602       ]])
2603     ],[
2604       AC_MSG_RESULT([yes])
2605       AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
2606       ac_cv_gethostbyaddr_r_args="5"
2607     ],[
2608       AC_MSG_RESULT([no])
2609     ])
2610
2611     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2612       AC_MSG_CHECKING([if gethostbyaddr_r with -D_REENTRANT takes 5 arguments])
2613       AC_COMPILE_IFELSE([
2614         AC_LANG_PROGRAM([[
2615 #define _REENTRANT
2616 #include <sys/types.h>
2617 #include <netdb.h>
2618         ]],[[
2619           char * address;
2620           int length;
2621           int type;
2622           struct hostent h;
2623           struct hostent_data hdata;
2624           int rc;
2625           rc = gethostbyaddr_r(address, length, type, &h, &hdata);
2626         ]])
2627       ],[
2628         AC_MSG_RESULT([yes])
2629         AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
2630         AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
2631         ac_cv_gethostbyaddr_r_args="5"
2632       ],[
2633         AC_MSG_RESULT([no])
2634       ])
2635     fi
2636
2637     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2638       AC_MSG_CHECKING([if gethostbyaddr_r takes 7 arguments])
2639       AC_COMPILE_IFELSE([
2640         AC_LANG_PROGRAM([[
2641 #include <sys/types.h>
2642 #include <netdb.h>
2643         ]],[[
2644           char * address;
2645           int length;
2646           int type;
2647           struct hostent h;
2648           char buffer[8192];
2649           int h_errnop;
2650           struct hostent * hp;
2651           hp = gethostbyaddr_r(address, length, type, &h,
2652                                buffer, 8192, &h_errnop);
2653         ]])
2654       ],[
2655         AC_MSG_RESULT([yes])
2656         AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args])
2657         ac_cv_gethostbyaddr_r_args="7"
2658       ],[
2659         AC_MSG_RESULT([no])
2660       ])
2661     fi
2662
2663     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2664       AC_MSG_CHECKING([if gethostbyaddr_r takes 8 arguments])
2665       AC_COMPILE_IFELSE([
2666         AC_LANG_PROGRAM([[
2667 #include <sys/types.h>
2668 #include <netdb.h>
2669         ]],[[
2670           char * address;
2671           int length;
2672           int type;
2673           struct hostent h;
2674           char buffer[8192];
2675           int h_errnop;
2676           struct hostent * hp;
2677           int rc;
2678           rc = gethostbyaddr_r(address, length, type, &h,
2679                                buffer, 8192, &hp, &h_errnop);
2680         ]])
2681       ],[
2682         AC_MSG_RESULT([yes])
2683         AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
2684         ac_cv_gethostbyaddr_r_args="8"
2685       ],[
2686         AC_MSG_RESULT([no])
2687       ])
2688     fi
2689
2690     if test "$ac_cv_gethostbyaddr_r_args" = "unknown"; then
2691       AC_MSG_WARN([Cannot find out how to use gethostbyaddr_r])
2692       AC_MSG_WARN([HAVE_GETHOSTBYADDR_R will not be defined])
2693       ac_cv_func_gethostbyaddr_r="no"
2694     else
2695       AC_DEFINE_UNQUOTED(HAVE_GETHOSTBYADDR_R, 1,
2696         [Define to 1 if you have the gethostbyaddr_r function.])
2697       ac_cv_func_gethostbyaddr_r="yes"
2698     fi
2699
2700   else
2701     ac_cv_func_gethostbyaddr_r="no"
2702   fi
2703 ])
2704
2705
2706 dnl CURL_CHECK_GETHOSTBYNAME_R
2707 dnl -------------------------------------------------
2708 dnl check number of arguments for gethostbyname_r, it
2709 dnl might take either 3, 5, or 6 arguments.
2710
2711 AC_DEFUN([CURL_CHECK_GETHOSTBYNAME_R], [
2712   #
2713   AC_MSG_CHECKING([for gethostbyname_r])
2714   AC_LINK_IFELSE([
2715     AC_LANG_FUNC_LINK_TRY([gethostbyname_r])
2716   ],[
2717     AC_MSG_RESULT([yes])
2718     tmp_cv_gethostbyname_r="yes"
2719   ],[
2720     AC_MSG_RESULT([no])
2721     tmp_cv_gethostbyname_r="no"
2722   ])
2723   #
2724   if test "$tmp_cv_gethostbyname_r" != "yes"; then
2725     AC_MSG_CHECKING([deeper for gethostbyname_r])
2726     AC_LINK_IFELSE([
2727       AC_LANG_PROGRAM([[
2728       ]],[[
2729         gethostbyname_r();
2730       ]])
2731     ],[
2732       AC_MSG_RESULT([yes])
2733       tmp_cv_gethostbyname_r="yes"
2734     ],[
2735       AC_MSG_RESULT([but still no])
2736       tmp_cv_gethostbyname_r="no"
2737     ])
2738   fi
2739   #
2740   if test "$tmp_cv_gethostbyname_r" = "yes"; then
2741
2742     ac_cv_gethostbyname_r_args="unknown"
2743
2744     AC_MSG_CHECKING([if gethostbyname_r takes 3 arguments])
2745     AC_COMPILE_IFELSE([
2746       AC_LANG_PROGRAM([[
2747 #include <string.h>
2748 #include <sys/types.h>
2749 #include <netdb.h>
2750 #undef NULL
2751 #define NULL (void *)0
2752         int
2753         gethostbyname_r(const char *, struct hostent *,
2754                         struct hostent_data *);
2755       ]],[[
2756         struct hostent_data data;
2757         gethostbyname_r(NULL, NULL, NULL);
2758       ]])
2759     ],[
2760       AC_MSG_RESULT([yes])
2761       AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
2762       ac_cv_gethostbyname_r_args="3"
2763     ],[
2764       AC_MSG_RESULT([no])
2765     ])
2766
2767     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2768       AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
2769       AC_COMPILE_IFELSE([
2770         AC_LANG_PROGRAM([[
2771 #define _REENTRANT
2772 #include <string.h>
2773 #include <sys/types.h>
2774 #include <netdb.h>
2775 #undef NULL
2776 #define NULL (void *)0
2777           int
2778           gethostbyname_r(const char *, struct hostent *,
2779                           struct hostent_data *);
2780         ]],[[
2781           struct hostent_data data;
2782           gethostbyname_r(NULL, NULL, NULL);
2783         ]])
2784       ],[
2785         AC_MSG_RESULT([yes])
2786         AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
2787         AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
2788         ac_cv_gethostbyname_r_args="3"
2789       ],[
2790         AC_MSG_RESULT([no])
2791       ])
2792     fi
2793
2794     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2795       AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
2796       AC_COMPILE_IFELSE([
2797         AC_LANG_PROGRAM([[
2798 #include <sys/types.h>
2799 #include <netdb.h>
2800 #undef NULL
2801 #define NULL (void *)0
2802           struct hostent *
2803           gethostbyname_r(const char *, struct hostent *,
2804                           char *, int, int *);
2805         ]],[[
2806           gethostbyname_r(NULL, NULL, NULL, 0, NULL);
2807         ]])
2808       ],[
2809         AC_MSG_RESULT([yes])
2810         AC_DEFINE(HAVE_GETHOSTBYNAME_R_5, 1, [gethostbyname_r() takes 5 args])
2811         ac_cv_gethostbyname_r_args="5"
2812       ],[
2813         AC_MSG_RESULT([no])
2814       ])
2815     fi
2816
2817     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2818       AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
2819       AC_COMPILE_IFELSE([
2820         AC_LANG_PROGRAM([[
2821 #include <sys/types.h>
2822 #include <netdb.h>
2823 #undef NULL
2824 #define NULL (void *)0
2825           int
2826           gethostbyname_r(const char *, struct hostent *,
2827                           char *, size_t, struct hostent **, int *);
2828         ]],[[
2829           gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);
2830         ]])
2831       ],[
2832         AC_MSG_RESULT([yes])
2833         AC_DEFINE(HAVE_GETHOSTBYNAME_R_6, 1, [gethostbyname_r() takes 6 args])
2834         ac_cv_gethostbyname_r_args="6"
2835       ],[
2836         AC_MSG_RESULT([no])
2837       ])
2838     fi
2839
2840     if test "$ac_cv_gethostbyname_r_args" = "unknown"; then
2841       AC_MSG_WARN([Cannot find out how to use gethostbyname_r])
2842       AC_MSG_WARN([HAVE_GETHOSTBYNAME_R will not be defined])
2843       ac_cv_func_gethostbyname_r="no"
2844     else
2845       AC_DEFINE_UNQUOTED(HAVE_GETHOSTBYNAME_R, 1,
2846         [Define to 1 if you have the gethostbyname_r function.])
2847       ac_cv_func_gethostbyname_r="yes"
2848     fi
2849
2850   else
2851     ac_cv_func_gethostbyname_r="no"
2852   fi
2853 ])
2854
2855
2856 dnl **********************************************************************
2857 dnl CURL_DETECT_ICC ([ACTION-IF-YES])
2858 dnl
2859 dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
2860 dnl sets the $ICC variable to "yes" or "no"
2861 dnl **********************************************************************
2862 AC_DEFUN([CURL_DETECT_ICC],
2863 [
2864     ICC="no"
2865     AC_MSG_CHECKING([for icc in use])
2866     if test "$GCC" = "yes"; then
2867        dnl check if this is icc acting as gcc in disguise
2868        AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
2869          dnl action if the text is found, this it has not been replaced by the
2870          dnl cpp
2871          ICC="no",
2872          dnl the text was not found, it was replaced by the cpp
2873          ICC="yes"
2874          AC_MSG_RESULT([yes])
2875          [$1]
2876        )
2877     fi
2878     if test "$ICC" = "no"; then
2879         # this is not ICC
2880         AC_MSG_RESULT([no])
2881     fi
2882 ])
2883
2884 dnl We create a function for detecting which compiler we use and then set as
2885 dnl pendantic compiler options as possible for that particular compiler. The
2886 dnl options are only used for debug-builds.
2887
2888 AC_DEFUN([CURL_CC_DEBUG_OPTS],
2889 [
2890     if test "z$ICC" = "z"; then
2891       CURL_DETECT_ICC
2892     fi
2893
2894     if test "$GCC" = "yes"; then
2895
2896        dnl figure out gcc version!
2897        AC_MSG_CHECKING([gcc version])
2898        gccver=`$CC -dumpversion`
2899        num1=`echo $gccver | cut -d . -f1`
2900        num2=`echo $gccver | cut -d . -f2`
2901        gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
2902        AC_MSG_RESULT($gccver)
2903
2904        if test "$ICC" = "yes"; then
2905          dnl this is icc, not gcc.
2906
2907          dnl ICC warnings we ignore:
2908          dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
2909          dnl   "invalid format string conversion"
2910          dnl * 279 warns on static conditions in while expressions
2911          dnl * 981 warns on "operands are evaluated in unspecified order"
2912          dnl * 1418 "external definition with no prior declaration"
2913          dnl * 1419 warns on "external declaration in primary source file"
2914          dnl   which we know and do on purpose.
2915
2916          WARN="-wd279,269,981,1418,1419"
2917
2918          if test "$gccnum" -gt "600"; then
2919             dnl icc 6.0 and older doesn't have the -Wall flag
2920             WARN="-Wall $WARN"
2921          fi
2922        else dnl $ICC = yes
2923          dnl this is a set of options we believe *ALL* gcc versions support:
2924          WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
2925
2926          dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
2927
2928          if test "$gccnum" -ge "207"; then
2929            dnl gcc 2.7 or later
2930            WARN="$WARN -Wmissing-declarations"
2931          fi
2932
2933          if test "$gccnum" -gt "295"; then
2934            dnl only if the compiler is newer than 2.95 since we got lots of
2935            dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
2936            dnl gcc 2.95.4 on FreeBSD 4.9!
2937            WARN="$WARN -Wundef -Wno-long-long -Wsign-compare -Wshadow -Wno-multichar"
2938          fi
2939
2940          if test "$gccnum" -ge "296"; then
2941            dnl gcc 2.96 or later
2942            WARN="$WARN -Wfloat-equal"
2943          fi
2944
2945          if test "$gccnum" -gt "296"; then
2946            dnl this option does not exist in 2.96
2947            WARN="$WARN -Wno-format-nonliteral"
2948          fi
2949
2950          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
2951          dnl on i686-Linux as it gives us heaps with false positives.
2952          dnl Also, on gcc 4.0.X it is totally unbearable and complains all
2953          dnl over making it unusable for generic purposes. Let's not use it.
2954
2955          if test "$gccnum" -ge "303"; then
2956            dnl gcc 3.3 and later
2957            WARN="$WARN -Wendif-labels -Wstrict-prototypes"
2958          fi
2959
2960          if test "$gccnum" -ge "304"; then
2961            # try these on gcc 3.4
2962            WARN="$WARN -Wdeclaration-after-statement"
2963          fi
2964
2965          for flag in $CPPFLAGS; do
2966            case "$flag" in
2967             -I*)
2968               dnl Include path, provide a -isystem option for the same dir
2969               dnl to prevent warnings in those dirs. The -isystem was not very
2970               dnl reliable on earlier gcc versions.
2971               add=`echo $flag | sed 's/^-I/-isystem /g'`
2972               WARN="$WARN $add"
2973               ;;
2974            esac
2975          done
2976
2977        fi dnl $ICC = no
2978
2979        CFLAGS="$CFLAGS $WARN"
2980
2981       AC_MSG_NOTICE([Added this set of compiler options: $WARN])
2982
2983     else dnl $GCC = yes
2984
2985       AC_MSG_NOTICE([Added no extra compiler options])
2986
2987     fi dnl $GCC = yes
2988
2989     dnl strip off optimizer flags
2990     NEWFLAGS=""
2991     for flag in $CFLAGS; do
2992       case "$flag" in
2993       -O*)
2994         dnl echo "cut off $flag"
2995         ;;
2996       *)
2997         NEWFLAGS="$NEWFLAGS $flag"
2998         ;;
2999       esac
3000     done
3001     CFLAGS=$NEWFLAGS
3002
3003 ]) dnl end of AC_DEFUN()
3004
3005 # This is only a temporary fix. This macro is here to replace the broken one
3006 # delivered by the automake project (including the 1.9.6 release). As soon as
3007 # they ship a working version we SHOULD remove this work-around.
3008
3009 AC_DEFUN([AM_MISSING_HAS_RUN],
3010 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
3011 test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
3012 # Use eval to expand $SHELL
3013 if eval "$MISSING --run true"; then
3014   am_missing_run="$MISSING --run "
3015 else
3016   am_missing_run=
3017   AC_MSG_WARN([`missing' script is too old or missing])
3018 fi
3019 ])
3020
3021
3022 dnl CURL_VERIFY_RUNTIMELIBS
3023 dnl -------------------------------------------------
3024 dnl Verify that the shared libs found so far can be used when running
3025 dnl programs, since otherwise the situation will create odd configure errors
3026 dnl that are misleading people.
3027 dnl
3028 dnl Make sure this test is run BEFORE the first test in the script that
3029 dnl runs anything, which at the time of this writing is the AC_CHECK_SIZEOF
3030 dnl macro. It must also run AFTER all lib-checking macros are complete.
3031
3032 AC_DEFUN([CURL_VERIFY_RUNTIMELIBS], [
3033
3034   dnl this test is of course not sensible if we are cross-compiling!
3035   if test "x$cross_compiling" != xyes; then
3036
3037     dnl just run a program to verify that the libs checked for previous to this
3038     dnl point also is available run-time!
3039     AC_MSG_CHECKING([run-time libs availability])
3040     AC_TRY_RUN([
3041 main()
3042 {
3043   return 0;
3044 }
3045 ],
3046     AC_MSG_RESULT([fine]),
3047     AC_MSG_RESULT([failed])
3048     AC_MSG_ERROR([one or more libs available at link-time are not available run-time. Libs used at link-time: $LIBS])
3049     )
3050
3051     dnl if this test fails, configure has already stopped
3052   fi
3053 ])
3054
3055
3056 dnl CURL_CHECK_VARIADIC_MACROS
3057 dnl -------------------------------------------------
3058 dnl Check compiler support of variadic macros
3059
3060 AC_DEFUN([CURL_CHECK_VARIADIC_MACROS], [
3061   AC_CACHE_CHECK([for compiler support of C99 variadic macro style],
3062     [curl_cv_variadic_macros_c99], [
3063     AC_COMPILE_IFELSE([
3064       AC_LANG_PROGRAM([[
3065 #define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
3066 #define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
3067         int fun3(int arg1, int arg2, int arg3);
3068         int fun2(int arg1, int arg2);
3069         int fun3(int arg1, int arg2, int arg3)
3070         { return arg1 + arg2 + arg3; }
3071         int fun2(int arg1, int arg2)
3072         { return arg1 + arg2; }
3073       ]],[[
3074         int res3 = c99_vmacro3(1, 2, 3);
3075         int res2 = c99_vmacro2(1, 2);
3076       ]])
3077     ],[
3078       curl_cv_variadic_macros_c99="yes"
3079     ],[
3080       curl_cv_variadic_macros_c99="no"
3081     ])
3082   ])
3083   case "$curl_cv_variadic_macros_c99" in
3084     yes)
3085       AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_C99, 1,
3086         [Define to 1 if compiler supports C99 variadic macro style.])
3087       ;;
3088   esac
3089   AC_CACHE_CHECK([for compiler support of old gcc variadic macro style],
3090     [curl_cv_variadic_macros_gcc], [
3091     AC_COMPILE_IFELSE([
3092       AC_LANG_PROGRAM([[
3093 #define gcc_vmacro3(first, args...) fun3(first, args)
3094 #define gcc_vmacro2(first, args...) fun2(first, args)
3095         int fun3(int arg1, int arg2, int arg3);
3096         int fun2(int arg1, int arg2);
3097         int fun3(int arg1, int arg2, int arg3)
3098         { return arg1 + arg2 + arg3; }
3099         int fun2(int arg1, int arg2)
3100         { return arg1 + arg2; }
3101       ]],[[
3102         int res3 = gcc_vmacro3(1, 2, 3);
3103         int res2 = gcc_vmacro2(1, 2);
3104       ]])
3105     ],[
3106       curl_cv_variadic_macros_gcc="yes"
3107     ],[
3108       curl_cv_variadic_macros_gcc="no"
3109     ])
3110   ])
3111   case "$curl_cv_variadic_macros_gcc" in
3112     yes)
3113       AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_GCC, 1,
3114         [Define to 1 if compiler supports old gcc variadic macro style.])
3115       ;;
3116   esac
3117 ])
3118
3119
3120 dnl CURL_CHECK_CA_BUNDLE
3121 dnl -------------------------------------------------
3122 dnl Check if a default ca-bundle should be used
3123 dnl
3124 dnl regarding the paths this will scan:
3125 dnl /etc/ssl/certs/ca-certificates.crt Debian systems
3126 dnl /etc/pki/tls/certs/ca-bundle.crt Redhat and Mandriva
3127 dnl /usr/share/ssl/certs/ca-bundle.crt old(er) Redhat
3128 dnl /etc/ssl/certs/ (ca path) SUSE
3129
3130 AC_DEFUN([CURL_CHECK_CA_BUNDLE], [
3131
3132   AC_MSG_CHECKING([default CA cert bundle/path])
3133
3134   AC_ARG_WITH(ca-bundle,
3135 AC_HELP_STRING([--with-ca-bundle=FILE], [File name to use as CA bundle])
3136 AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]),
3137   [
3138     want_ca="$withval"
3139     if test "x$want_ca" = "xyes"; then
3140       AC_MSG_ERROR([--with-ca-bundle=FILE requires a path to the CA bundle])
3141     fi
3142   ],
3143   [ want_ca="unset" ])
3144   AC_ARG_WITH(ca-path,
3145 AC_HELP_STRING([--with-ca-path=DIRECTORY], [Directory to use as CA path])
3146 AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
3147   [
3148     want_capath="$withval"
3149     if test "x$want_capath" = "xyes"; then
3150       AC_MSG_ERROR([--with-ca-path=DIRECTORY requires a path to the CA path directory])
3151     fi
3152   ],
3153   [ want_capath="unset"])
3154
3155   if test "x$want_ca" != "xno" -a "x$want_ca" != "xunset" -a \
3156           "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
3157     dnl both given
3158     AC_MSG_ERROR([Can't specify both --with-ca-bundle and --with-ca-path.])
3159   elif test "x$want_ca" != "xno" -a "x$want_ca" != "xunset"; then
3160     dnl --with-ca-bundle given
3161     ca="$want_ca"
3162     capath="no"
3163   elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
3164     dnl --with-ca-path given
3165     if test "x$OPENSSL_ENABLED" != "x1"; then
3166       AC_MSG_ERROR([--with-ca-path only works with openSSL])
3167     fi
3168     capath="$want_capath"
3169     ca="no"
3170   else
3171     dnl neither of --with-ca-* given
3172     dnl first try autodetecting a CA bundle , then a CA path
3173     dnl both autodetections can be skipped by --without-ca-*
3174     ca="no"
3175     capath="no"
3176     if test "x$want_ca" = "xunset"; then
3177       dnl the path we previously would have installed the curl ca bundle
3178       dnl to, and thus we now check for an already existing cert in that place
3179       dnl in case we find no other
3180       if test "x$prefix" != xNONE; then
3181         cac="${prefix}/share/curl/curl-ca-bundle.crt"
3182       else
3183         cac="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
3184       fi
3185
3186       for a in /etc/ssl/certs/ca-certificates.crt \
3187                /etc/pki/tls/certs/ca-bundle.crt \
3188                /usr/share/ssl/certs/ca-bundle.crt \
3189                "$cac"; do
3190         if test -f "$a"; then
3191           ca="$a"
3192           break
3193         fi
3194       done
3195     fi
3196     if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \
3197             "x$OPENSSL_ENABLED" = "x1"; then
3198       for a in /etc/ssl/certs/; do
3199         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
3200           capath="$a"
3201           break
3202         fi
3203       done
3204     fi
3205   fi
3206         
3207     
3208
3209   if test "x$ca" != "xno"; then
3210     CURL_CA_BUNDLE='"'$ca'"'
3211     AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle])
3212     AC_SUBST(CURL_CA_BUNDLE)
3213     AC_MSG_RESULT([$ca])
3214   elif test "x$capath" != "xno"; then
3215     CURL_CA_PATH="\"$capath\""
3216     AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path])
3217     AC_MSG_RESULT([$capath (capath)])
3218   else
3219     AC_MSG_RESULT([no])
3220   fi
3221 ])
3222