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