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