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
2455# This is only a temporary fix. This macro is here to replace the broken one
2456# delivered by the automake project (including the 1.9.6 release). As soon as
2457# they ship a working version we SHOULD remove this work-around.
2458
2459AC_DEFUN([AM_MISSING_HAS_RUN],
2460[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
2461test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
2462# Use eval to expand $SHELL
2463if eval "$MISSING --run true"; then
2464  am_missing_run="$MISSING --run "
2465else
2466  am_missing_run=
2467  AC_MSG_WARN([`missing' script is too old or missing])
2468fi
2469])
2470
2471
2472dnl CURL_VERIFY_RUNTIMELIBS
2473dnl -------------------------------------------------
2474dnl Verify that the shared libs found so far can be used when running
2475dnl programs, since otherwise the situation will create odd configure errors
2476dnl that are misleading people.
2477dnl
2478dnl Make sure this test is run BEFORE the first test in the script that
2479dnl runs anything, which at the time of this writing is the AC_CHECK_SIZEOF
2480dnl macro. It must also run AFTER all lib-checking macros are complete.
2481
2482AC_DEFUN([CURL_VERIFY_RUNTIMELIBS], [
2483
2484  dnl this test is of course not sensible if we are cross-compiling!
2485  if test "x$cross_compiling" != xyes; then
2486
2487    dnl just run a program to verify that the libs checked for previous to this
2488    dnl point also is available run-time!
2489    AC_MSG_CHECKING([run-time libs availability])
2490    AC_TRY_RUN([
2491main()
2492{
2493  return 0;
2494}
2495],
2496    AC_MSG_RESULT([fine]),
2497    AC_MSG_RESULT([failed])
2498    AC_MSG_ERROR([one or more libs available at link-time are not available run-time. Libs used at link-time: $LIBS])
2499    )
2500
2501    dnl if this test fails, configure has already stopped
2502  fi
2503])
2504
2505
2506dnl CURL_CHECK_VARIADIC_MACROS
2507dnl -------------------------------------------------
2508dnl Check compiler support of variadic macros
2509
2510AC_DEFUN([CURL_CHECK_VARIADIC_MACROS], [
2511  AC_CACHE_CHECK([for compiler support of C99 variadic macro style],
2512    [curl_cv_variadic_macros_c99], [
2513    AC_COMPILE_IFELSE([
2514      AC_LANG_PROGRAM([[
2515#define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
2516#define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
2517        int fun3(int arg1, int arg2, int arg3);
2518        int fun2(int arg1, int arg2);
2519        int fun3(int arg1, int arg2, int arg3)
2520        { return arg1 + arg2 + arg3; }
2521        int fun2(int arg1, int arg2)
2522        { return arg1 + arg2; }
2523      ]],[[
2524        int res3 = c99_vmacro3(1, 2, 3);
2525        int res2 = c99_vmacro2(1, 2);
2526      ]])
2527    ],[
2528      curl_cv_variadic_macros_c99="yes"
2529    ],[
2530      curl_cv_variadic_macros_c99="no"
2531    ])
2532  ])
2533  case "$curl_cv_variadic_macros_c99" in
2534    yes)
2535      AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_C99, 1,
2536        [Define to 1 if compiler supports C99 variadic macro style.])
2537      ;;
2538  esac
2539  AC_CACHE_CHECK([for compiler support of old gcc variadic macro style],
2540    [curl_cv_variadic_macros_gcc], [
2541    AC_COMPILE_IFELSE([
2542      AC_LANG_PROGRAM([[
2543#define gcc_vmacro3(first, args...) fun3(first, args)
2544#define gcc_vmacro2(first, args...) fun2(first, args)
2545        int fun3(int arg1, int arg2, int arg3);
2546        int fun2(int arg1, int arg2);
2547        int fun3(int arg1, int arg2, int arg3)
2548        { return arg1 + arg2 + arg3; }
2549        int fun2(int arg1, int arg2)
2550        { return arg1 + arg2; }
2551      ]],[[
2552        int res3 = gcc_vmacro3(1, 2, 3);
2553        int res2 = gcc_vmacro2(1, 2);
2554      ]])
2555    ],[
2556      curl_cv_variadic_macros_gcc="yes"
2557    ],[
2558      curl_cv_variadic_macros_gcc="no"
2559    ])
2560  ])
2561  case "$curl_cv_variadic_macros_gcc" in
2562    yes)
2563      AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_GCC, 1,
2564        [Define to 1 if compiler supports old gcc variadic macro style.])
2565      ;;
2566  esac
2567])
2568
2569
2570dnl CURL_CHECK_CA_BUNDLE
2571dnl -------------------------------------------------
2572dnl Check if a default ca-bundle should be used
2573dnl
2574dnl regarding the paths this will scan:
2575dnl /etc/ssl/certs/ca-certificates.crt Debian systems
2576dnl /etc/pki/tls/certs/ca-bundle.crt Redhat and Mandriva
2577dnl /usr/share/ssl/certs/ca-bundle.crt old(er) Redhat
2578dnl /usr/local/share/certs/ca-root.crt FreeBSD
2579dnl /etc/ssl/cert.pem OpenBSD
2580dnl /etc/ssl/certs/ (ca path) SUSE
2581
2582AC_DEFUN([CURL_CHECK_CA_BUNDLE], [
2583
2584  AC_MSG_CHECKING([default CA cert bundle/path])
2585
2586  AC_ARG_WITH(ca-bundle,
2587AC_HELP_STRING([--with-ca-bundle=FILE], [File name to use as CA bundle])
2588AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]),
2589  [
2590    want_ca="$withval"
2591    if test "x$want_ca" = "xyes"; then
2592      AC_MSG_ERROR([--with-ca-bundle=FILE requires a path to the CA bundle])
2593    fi
2594  ],
2595  [ want_ca="unset" ])
2596  AC_ARG_WITH(ca-path,
2597AC_HELP_STRING([--with-ca-path=DIRECTORY], [Directory to use as CA path])
2598AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
2599  [
2600    want_capath="$withval"
2601    if test "x$want_capath" = "xyes"; then
2602      AC_MSG_ERROR([--with-ca-path=DIRECTORY requires a path to the CA path directory])
2603    fi
2604  ],
2605  [ want_capath="unset"])
2606
2607  if test "x$want_ca" != "xno" -a "x$want_ca" != "xunset" -a \
2608          "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
2609    dnl both given
2610    AC_MSG_ERROR([Can't specify both --with-ca-bundle and --with-ca-path.])
2611  elif test "x$want_ca" != "xno" -a "x$want_ca" != "xunset"; then
2612    dnl --with-ca-bundle given
2613    ca="$want_ca"
2614    capath="no"
2615  elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
2616    dnl --with-ca-path given
2617    if test "x$OPENSSL_ENABLED" != "x1"; then
2618      AC_MSG_ERROR([--with-ca-path only works with openSSL])
2619    fi
2620    capath="$want_capath"
2621    ca="no"
2622  else
2623    dnl first try autodetecting a CA bundle , then a CA path
2624    dnl both autodetections can be skipped by --without-ca-*
2625    ca="no"
2626    capath="no"
2627    if test "x$cross_compiling" != "xyes"; then
2628      dnl NOT cross-compiling and...
2629      dnl neither of the --with-ca-* options are provided
2630      if test "x$want_ca" = "xunset"; then
2631        dnl the path we previously would have installed the curl ca bundle
2632        dnl to, and thus we now check for an already existing cert in that
2633        dnl place in case we find no other
2634        if test "x$prefix" != xNONE; then
2635          cac="${prefix}/share/curl/curl-ca-bundle.crt"
2636        else
2637          cac="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
2638        fi
2639
2640        for a in /etc/ssl/certs/ca-certificates.crt \
2641                 /etc/pki/tls/certs/ca-bundle.crt \
2642                 /usr/share/ssl/certs/ca-bundle.crt \
2643                 /usr/local/share/certs/ca-root.crt \
2644                 /etc/ssl/cert.pem \
2645                 "$cac"; do
2646          if test -f "$a"; then
2647            ca="$a"
2648            break
2649          fi
2650        done
2651      fi
2652      if test "x$want_capath" = "xunset" -a "x$ca" = "xno" -a \
2653              "x$OPENSSL_ENABLED" = "x1"; then
2654        for a in /etc/ssl/certs/; do
2655          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
2656            capath="$a"
2657            break
2658          fi
2659        done
2660      fi
2661    else
2662      dnl no option given and cross-compiling
2663      AC_MSG_WARN([skipped the ca-cert path detection when cross-compiling])
2664    fi
2665  fi
2666
2667  if test "x$ca" != "xno"; then
2668    CURL_CA_BUNDLE='"'$ca'"'
2669    AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [Location of default ca bundle])
2670    AC_SUBST(CURL_CA_BUNDLE)
2671    AC_MSG_RESULT([$ca])
2672  elif test "x$capath" != "xno"; then
2673    CURL_CA_PATH="\"$capath\""
2674    AC_DEFINE_UNQUOTED(CURL_CA_PATH, "$capath", [Location of default ca path])
2675    AC_MSG_RESULT([$capath (capath)])
2676  else
2677    AC_MSG_RESULT([no])
2678  fi
2679])
2680
2681
2682dnl DO_CURL_OFF_T_CHECK (TYPE, SIZE)
2683dnl -------------------------------------------------
2684dnl Internal macro for CURL_CONFIGURE_CURL_OFF_T
2685
2686AC_DEFUN([DO_CURL_OFF_T_CHECK], [
2687  AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
2688  if test "$curl_typeof_curl_off_t" = "unknown" && test ! -z "$1"; then
2689    tmp_includes=""
2690    tmp_source=""
2691    tmp_fmt=""
2692    case XC_SH_TR_SH([$1]) in
2693      int64_t)
2694        tmp_includes="$curl_includes_inttypes"
2695        tmp_source="char f@<:@@:>@ = PRId64;"
2696        tmp_fmt="PRId64"
2697        ;;
2698      int32_t)
2699        tmp_includes="$curl_includes_inttypes"
2700        tmp_source="char f@<:@@:>@ = PRId32;"
2701        tmp_fmt="PRId32"
2702        ;;
2703      int16_t)
2704        tmp_includes="$curl_includes_inttypes"
2705        tmp_source="char f@<:@@:>@ = PRId16;"
2706        tmp_fmt="PRId16"
2707        ;;
2708    esac
2709    AC_COMPILE_IFELSE([
2710      AC_LANG_PROGRAM([[
2711        $tmp_includes
2712        typedef $1 curl_off_t;
2713        typedef char dummy_arr[sizeof(curl_off_t) == $2 ? 1 : -1];
2714      ]],[[
2715        $tmp_source
2716        curl_off_t dummy;
2717      ]])
2718    ],[
2719      if test -z "$tmp_fmt"; then
2720        curl_typeof_curl_off_t="$1"
2721        curl_sizeof_curl_off_t="$2"
2722      else
2723        CURL_CHECK_DEF([$tmp_fmt], [$curl_includes_inttypes], [silent])
2724        AS_VAR_PUSHDEF([tmp_HaveFmtDef], [curl_cv_have_def_$tmp_fmt])dnl
2725        AS_VAR_PUSHDEF([tmp_FmtDef], [curl_cv_def_$tmp_fmt])dnl
2726        if test AS_VAR_GET(tmp_HaveFmtDef) = "yes"; then
2727          curl_format_curl_off_t=AS_VAR_GET(tmp_FmtDef)
2728          curl_typeof_curl_off_t="$1"
2729          curl_sizeof_curl_off_t="$2"
2730        fi
2731        AS_VAR_POPDEF([tmp_FmtDef])dnl
2732        AS_VAR_POPDEF([tmp_HaveFmtDef])dnl
2733      fi
2734    ])
2735  fi
2736])
2737
2738
2739dnl DO_CURL_OFF_T_SUFFIX_CHECK (TYPE)
2740dnl -------------------------------------------------
2741dnl Internal macro for CURL_CONFIGURE_CURL_OFF_T
2742
2743AC_DEFUN([DO_CURL_OFF_T_SUFFIX_CHECK], [
2744  AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
2745  AC_MSG_CHECKING([constant suffix string for curl_off_t])
2746  #
2747  curl_suffix_curl_off_t="unknown"
2748  curl_suffix_curl_off_tu="unknown"
2749  #
2750  case XC_SH_TR_SH([$1]) in
2751    long_long | __longlong | __longlong_t)
2752      tst_suffixes="LL::"
2753      ;;
2754    long)
2755      tst_suffixes="L::"
2756      ;;
2757    int)
2758      tst_suffixes="::"
2759      ;;
2760    __int64 | int64_t)
2761      tst_suffixes="LL:i64::"
2762      ;;
2763    __int32 | int32_t)
2764      tst_suffixes="L:i32::"
2765      ;;
2766    __int16 | int16_t)
2767      tst_suffixes="L:i16::"
2768      ;;
2769    *)
2770      AC_MSG_ERROR([unexpected data type $1])
2771      ;;
2772  esac
2773  #
2774  old_IFS=$IFS; IFS=':'
2775  for tmp_ssuf in $tst_suffixes ; do
2776    IFS=$old_IFS
2777    if test "x$curl_suffix_curl_off_t" = "xunknown"; then
2778      case $tmp_ssuf in
2779        i64 | i32 | i16)
2780          tmp_usuf="u$tmp_ssuf"
2781          ;;
2782        LL | L)
2783          tmp_usuf="U$tmp_ssuf"
2784          ;;
2785        *)
2786          tmp_usuf=""
2787          ;;
2788      esac
2789      AC_COMPILE_IFELSE([
2790        AC_LANG_PROGRAM([[
2791          $curl_includes_inttypes
2792          typedef $1 new_t;
2793        ]],[[
2794          new_t s1;
2795          new_t s2;
2796          s1 = -10$tmp_ssuf ;
2797          s2 =  20$tmp_ssuf ;
2798          if(s1 > s2)
2799            return 1;
2800        ]])
2801      ],[
2802        curl_suffix_curl_off_t="$tmp_ssuf"
2803        curl_suffix_curl_off_tu="$tmp_usuf"
2804      ])
2805    fi
2806  done
2807  IFS=$old_IFS
2808  #
2809  if test "x$curl_suffix_curl_off_t" = "xunknown"; then
2810    AC_MSG_ERROR([cannot find constant suffix string for curl_off_t.])
2811  else
2812    AC_MSG_RESULT([$curl_suffix_curl_off_t])
2813    AC_MSG_CHECKING([constant suffix string for unsigned curl_off_t])
2814    AC_MSG_RESULT([$curl_suffix_curl_off_tu])
2815  fi
2816  #
2817])
2818
2819
2820dnl CURL_CONFIGURE_CURL_OFF_T
2821dnl -------------------------------------------------
2822dnl Find out suitable curl_off_t data type definition and associated
2823dnl items, and make the appropriate definitions used in template file
2824dnl include/curl/curlbuild.h.in to properly configure the library.
2825
2826AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
2827  AC_REQUIRE([CURL_INCLUDES_INTTYPES])dnl
2828  #
2829  AC_BEFORE([$0],[AC_SYS_LARGEFILE])dnl
2830  AC_BEFORE([$0],[CURL_CONFIGURE_REENTRANT])dnl
2831  AC_BEFORE([$0],[CURL_CHECK_AIX_ALL_SOURCE])dnl
2832  #
2833  if test -z "$SED"; then
2834    AC_MSG_ERROR([SED not set. Cannot continue without SED being set.])
2835  fi
2836  #
2837  AC_CHECK_SIZEOF(long)
2838  AC_CHECK_SIZEOF(void*)
2839  #
2840  if test -z "$ac_cv_sizeof_long" ||
2841    test "$ac_cv_sizeof_long" -eq "0"; then
2842    AC_MSG_ERROR([cannot find out size of long.])
2843  fi
2844  if test -z "$ac_cv_sizeof_voidp" ||
2845     test "$ac_cv_sizeof_voidp" -eq "0"; then
2846    AC_MSG_ERROR([cannot find out size of void*.])
2847  fi
2848  #
2849  x_LP64_long=""
2850  x_LP32_long=""
2851  x_LP16_long=""
2852  #
2853  if test "$ac_cv_sizeof_long" -eq "8" &&
2854     test "$ac_cv_sizeof_voidp" -ge "8"; then
2855    x_LP64_long="long"
2856  elif test "$ac_cv_sizeof_long" -eq "4" &&
2857       test "$ac_cv_sizeof_voidp" -ge "4"; then
2858    x_LP32_long="long"
2859  elif test "$ac_cv_sizeof_long" -eq "2" &&
2860       test "$ac_cv_sizeof_voidp" -ge "2"; then
2861    x_LP16_long="long"
2862  fi
2863  #
2864  dnl DO_CURL_OFF_T_CHECK results are stored in next 3 vars
2865  #
2866  curl_typeof_curl_off_t="unknown"
2867  curl_sizeof_curl_off_t="unknown"
2868  curl_format_curl_off_t="unknown"
2869  curl_format_curl_off_tu="unknown"
2870  #
2871  if test "$curl_typeof_curl_off_t" = "unknown"; then
2872    AC_MSG_CHECKING([for 64-bit curl_off_t data type])
2873    for t8 in          \
2874      "$x_LP64_long"   \
2875      'int64_t'        \
2876      '__int64'        \
2877      'long long'      \
2878      '__longlong'     \
2879      '__longlong_t'   ; do
2880      DO_CURL_OFF_T_CHECK([$t8], [8])
2881    done
2882    AC_MSG_RESULT([$curl_typeof_curl_off_t])
2883  fi
2884  if test "$curl_typeof_curl_off_t" = "unknown"; then
2885    AC_MSG_CHECKING([for 32-bit curl_off_t data type])
2886    for t4 in          \
2887      "$x_LP32_long"   \
2888      'int32_t'        \
2889      '__int32'        \
2890      'int'            ; do
2891      DO_CURL_OFF_T_CHECK([$t4], [4])
2892    done
2893    AC_MSG_RESULT([$curl_typeof_curl_off_t])
2894  fi
2895  if test "$curl_typeof_curl_off_t" = "unknown"; then
2896    AC_MSG_CHECKING([for 16-bit curl_off_t data type])
2897    for t2 in          \
2898      "$x_LP16_long"   \
2899      'int16_t'        \
2900      '__int16'        \
2901      'int'            ; do
2902      DO_CURL_OFF_T_CHECK([$t2], [2])
2903    done
2904    AC_MSG_RESULT([$curl_typeof_curl_off_t])
2905  fi
2906  if test "$curl_typeof_curl_off_t" = "unknown"; then
2907    AC_MSG_ERROR([cannot find data type for curl_off_t.])
2908  fi
2909  #
2910  AC_MSG_CHECKING([size of curl_off_t])
2911  AC_MSG_RESULT([$curl_sizeof_curl_off_t])
2912  #
2913  AC_MSG_CHECKING([formatting string directive for curl_off_t])
2914  if test "$curl_format_curl_off_t" != "unknown"; then
2915    x_pull_headers="yes"
2916    curl_format_curl_off_t=`echo "$curl_format_curl_off_t" | "$SED" 's/[["]]//g'`
2917    curl_format_curl_off_tu=`echo "$curl_format_curl_off_t" | "$SED" 's/i$/u/'`
2918    curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/d$/u/'`
2919    curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/D$/U/'`
2920  else
2921    x_pull_headers="no"
2922    case XC_SH_TR_SH([$curl_typeof_curl_off_t]) in
2923      long_long | __longlong | __longlong_t)
2924        curl_format_curl_off_t="lld"
2925        curl_format_curl_off_tu="llu"
2926        ;;
2927      long)
2928        curl_format_curl_off_t="ld"
2929        curl_format_curl_off_tu="lu"
2930        ;;
2931      int)
2932        curl_format_curl_off_t="d"
2933        curl_format_curl_off_tu="u"
2934        ;;
2935      __int64)
2936        curl_format_curl_off_t="I64d"
2937        curl_format_curl_off_tu="I64u"
2938        ;;
2939      __int32)
2940        curl_format_curl_off_t="I32d"
2941        curl_format_curl_off_tu="I32u"
2942        ;;
2943      __int16)
2944        curl_format_curl_off_t="I16d"
2945        curl_format_curl_off_tu="I16u"
2946        ;;
2947      *)
2948        AC_MSG_ERROR([cannot find print format string for curl_off_t.])
2949        ;;
2950    esac
2951  fi
2952  AC_MSG_RESULT(["$curl_format_curl_off_t"])
2953  #
2954  AC_MSG_CHECKING([formatting string directive for unsigned curl_off_t])
2955  AC_MSG_RESULT(["$curl_format_curl_off_tu"])
2956  #
2957  DO_CURL_OFF_T_SUFFIX_CHECK([$curl_typeof_curl_off_t])
2958  #
2959  if test "$x_pull_headers" = "yes"; then
2960    if test "x$ac_cv_header_sys_types_h" = "xyes"; then
2961      CURL_DEFINE_UNQUOTED([CURL_PULL_SYS_TYPES_H])
2962    fi
2963    if test "x$ac_cv_header_stdint_h" = "xyes"; then
2964      CURL_DEFINE_UNQUOTED([CURL_PULL_STDINT_H])
2965    fi
2966    if test "x$ac_cv_header_inttypes_h" = "xyes"; then
2967      CURL_DEFINE_UNQUOTED([CURL_PULL_INTTYPES_H])
2968    fi
2969  fi
2970  #
2971  CURL_DEFINE_UNQUOTED([CURL_TYPEOF_CURL_OFF_T], [$curl_typeof_curl_off_t])
2972  CURL_DEFINE_UNQUOTED([CURL_FORMAT_CURL_OFF_T], ["$curl_format_curl_off_t"])
2973  CURL_DEFINE_UNQUOTED([CURL_FORMAT_CURL_OFF_TU], ["$curl_format_curl_off_tu"])
2974  CURL_DEFINE_UNQUOTED([CURL_FORMAT_OFF_T], ["%$curl_format_curl_off_t"])
2975  CURL_DEFINE_UNQUOTED([CURL_SIZEOF_CURL_OFF_T], [$curl_sizeof_curl_off_t])
2976  CURL_DEFINE_UNQUOTED([CURL_SUFFIX_CURL_OFF_T], [$curl_suffix_curl_off_t])
2977  CURL_DEFINE_UNQUOTED([CURL_SUFFIX_CURL_OFF_TU], [$curl_suffix_curl_off_tu])
2978  #
2979])
2980
2981
2982dnl CURL_CHECK_WIN32_LARGEFILE
2983dnl -------------------------------------------------
2984dnl Check if curl's WIN32 large file will be used
2985
2986AC_DEFUN([CURL_CHECK_WIN32_LARGEFILE], [
2987  AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
2988  AC_MSG_CHECKING([whether build target supports WIN32 file API])
2989  curl_win32_file_api="no"
2990  if test "$ac_cv_header_windows_h" = "yes"; then
2991    if test x"$enable_largefile" != "xno"; then
2992      AC_COMPILE_IFELSE([
2993        AC_LANG_PROGRAM([[
2994        ]],[[
2995#if !defined(_WIN32_WCE) && \
2996    (defined(__MINGW32__) || \
2997    (defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64))))
2998          int dummy=1;
2999#else
3000          WIN32 large file API not supported.
3001#endif
3002        ]])
3003      ],[
3004        curl_win32_file_api="win32_large_files"
3005      ])
3006    fi
3007    if test "$curl_win32_file_api" = "no"; then
3008      AC_COMPILE_IFELSE([
3009        AC_LANG_PROGRAM([[
3010        ]],[[
3011#if defined(_WIN32_WCE) || defined(__MINGW32__) || defined(_MSC_VER)
3012          int dummy=1;
3013#else
3014          WIN32 small file API not supported.
3015#endif
3016        ]])
3017      ],[
3018        curl_win32_file_api="win32_small_files"
3019      ])
3020    fi
3021  fi
3022  case "$curl_win32_file_api" in
3023    win32_large_files)
3024      AC_MSG_RESULT([yes (large file enabled)])
3025      AC_DEFINE_UNQUOTED(USE_WIN32_LARGE_FILES, 1,
3026        [Define to 1 if you are building a Windows target with large file support.])
3027      ;;
3028    win32_small_files)
3029      AC_MSG_RESULT([yes (large file disabled)])
3030      AC_DEFINE_UNQUOTED(USE_WIN32_SMALL_FILES, 1,
3031        [Define to 1 if you are building a Windows target without large file support.])
3032      ;;
3033    *)
3034      AC_MSG_RESULT([no])
3035      ;;
3036  esac
3037])
3038
3039dnl CURL_EXPORT_PCDIR ($pcdir)
3040dnl ------------------------
3041dnl if $pcdir is not empty, set PKG_CONFIG_LIBDIR to $pcdir and export
3042dnl
3043dnl we need this macro since pkg-config distinguishes among empty and unset
3044dnl variable while checking PKG_CONFIG_LIBDIR
3045dnl
3046
3047AC_DEFUN([CURL_EXPORT_PCDIR], [
3048    if test -n "$1"; then
3049      PKG_CONFIG_LIBDIR="$1"
3050      export PKG_CONFIG_LIBDIR
3051    fi
3052])
3053
3054dnl CURL_CHECK_PKGCONFIG ($module, [$pcdir])
3055dnl ------------------------
3056dnl search for the pkg-config tool. Set the PKGCONFIG variable to hold the
3057dnl path to it, or 'no' if not found/present.
3058dnl
3059dnl If pkg-config is present, check that it has info about the $module or
3060dnl return "no" anyway!
3061dnl
3062dnl Optionally PKG_CONFIG_LIBDIR may be given as $pcdir.
3063dnl
3064
3065AC_DEFUN([CURL_CHECK_PKGCONFIG], [
3066
3067    PKGCONFIG="no"
3068
3069    AC_PATH_TOOL( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
3070
3071    if test x$PKGCONFIG != xno; then
3072      AC_MSG_CHECKING([for $1 options with pkg-config])
3073      dnl ask pkg-config about $1
3074      itexists=`CURL_EXPORT_PCDIR([$2]) dnl
3075        $PKGCONFIG --exists $1 >/dev/null 2>&1 && echo 1`
3076
3077      if test -z "$itexists"; then
3078        dnl pkg-config does not have info about the given module! set the
3079        dnl variable to 'no'
3080        PKGCONFIG="no"
3081        AC_MSG_RESULT([no])
3082      else
3083        AC_MSG_RESULT([found])
3084      fi
3085    fi
3086])
3087
3088
3089dnl CURL_GENERATE_CONFIGUREHELP_PM
3090dnl -------------------------------------------------
3091dnl Generate test harness configurehelp.pm module, defining and
3092dnl initializing some perl variables with values which are known
3093dnl when the configure script runs. For portability reasons, test
3094dnl harness needs information on how to run the C preprocessor.
3095
3096AC_DEFUN([CURL_GENERATE_CONFIGUREHELP_PM], [
3097  AC_REQUIRE([AC_PROG_CPP])dnl
3098  tmp_cpp=`eval echo "$ac_cpp" 2>/dev/null`
3099  if test -z "$tmp_cpp"; then
3100    tmp_cpp='cpp'
3101  fi
3102  cat >./tests/configurehelp.pm <<_EOF
3103[@%:@] This is a generated file.  Do not edit.
3104
3105package configurehelp;
3106
3107use strict;
3108use warnings;
3109use Exporter;
3110
3111use vars qw(
3112    @ISA
3113    @EXPORT_OK
3114    \$Cpreprocessor
3115    );
3116
3117@ISA = qw(Exporter);
3118
3119@EXPORT_OK = qw(
3120    \$Cpreprocessor
3121    );
3122
3123\$Cpreprocessor = '$tmp_cpp';
3124
31251;
3126_EOF
3127])
3128