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