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