1 #***************************************************************************
3 # Project ___| | | | _ \| |
5 # | (__| |_| | _ <| |___
6 # \___|\___/|_| \_\_____|
8 # Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
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.
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.
18 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 # KIND, either express or implied.
22 ###########################################################################
24 dnl CURL_CHECK_HEADER_WINDOWS
25 dnl -------------------------------------------------
26 dnl Check for compilable and valid windows.h header
28 AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
29 AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
33 #ifndef WIN32_LEAN_AND_MEAN
34 #define WIN32_LEAN_AND_MEAN
41 ac_cv_header_windows_h="yes"
43 ac_cv_header_windows_h="no"
46 if test "x$ac_cv_header_windows_h" = "xyes"; then
47 AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
48 [Define to 1 if you have the windows.h header file.])
49 AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
50 [Define to avoid automatic inclusion of winsock.h])
55 dnl CURL_CHECK_HEADER_WINSOCK
56 dnl -------------------------------------------------
57 dnl Check for compilable and valid winsock.h header
59 AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
60 AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
61 AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
65 #ifndef WIN32_LEAN_AND_MEAN
66 #define WIN32_LEAN_AND_MEAN
71 int dummy=WSACleanup();
74 ac_cv_header_winsock_h="yes"
76 ac_cv_header_winsock_h="no"
79 if test "x$ac_cv_header_winsock_h" = "xyes"; then
80 AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
81 [Define to 1 if you have the winsock.h header file.])
86 dnl CURL_CHECK_HEADER_WINSOCK2
87 dnl -------------------------------------------------
88 dnl Check for compilable and valid winsock2.h header
90 AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
91 AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
92 AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
96 #ifndef WIN32_LEAN_AND_MEAN
97 #define WIN32_LEAN_AND_MEAN
100 #include <winsock2.h>
102 int dummy=2*IPPROTO_ESP;
105 ac_cv_header_winsock2_h="yes"
107 ac_cv_header_winsock2_h="no"
110 if test "x$ac_cv_header_winsock2_h" = "xyes"; then
111 AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
112 [Define to 1 if you have the winsock2.h header file.])
117 dnl CURL_CHECK_HEADER_WS2TCPIP
118 dnl -------------------------------------------------
119 dnl Check for compilable and valid ws2tcpip.h header
121 AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
122 AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
123 AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
127 #ifndef WIN32_LEAN_AND_MEAN
128 #define WIN32_LEAN_AND_MEAN
131 #include <winsock2.h>
132 #include <ws2tcpip.h>
134 int dummy=2*IP_PKTINFO;
137 ac_cv_header_ws2tcpip_h="yes"
139 ac_cv_header_ws2tcpip_h="no"
142 if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then
143 AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
144 [Define to 1 if you have the ws2tcpip.h header file.])
149 dnl CURL_CHECK_TYPE_SOCKLEN_T
150 dnl -------------------------------------------------
151 dnl Check for existing socklen_t type, and provide
152 dnl an equivalent type if socklen_t not available
154 AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
155 AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
156 AC_CHECK_TYPE([socklen_t], ,[
157 AC_CACHE_CHECK([for socklen_t equivalent],
158 [curl_cv_socklen_t_equiv], [
159 curl_cv_socklen_t_equiv="unknown"
160 for arg2 in "struct sockaddr" void; do
161 for t in int size_t unsigned long "unsigned long"; do
165 #ifdef HAVE_WINDOWS_H
166 #ifndef WIN32_LEAN_AND_MEAN
167 #define WIN32_LEAN_AND_MEAN
170 #ifdef HAVE_WINSOCK2_H
171 #include <winsock2.h>
173 #ifdef HAVE_WINSOCK_H
178 #ifdef HAVE_SYS_TYPES_H
179 #include <sys/types.h>
181 #ifdef HAVE_SYS_SOCKET_H
182 #include <sys/socket.h>
185 int getpeername (int, $arg2 *, $t *);
188 getpeername(0,0,&len);
191 curl_cv_socklen_t_equiv="$t"
197 if test "$curl_cv_socklen_t_equiv" = "unknown"; then
198 AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
200 AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
201 [type to use in place of socklen_t if not defined])
205 #ifdef HAVE_WINDOWS_H
206 #ifndef WIN32_LEAN_AND_MEAN
207 #define WIN32_LEAN_AND_MEAN
210 #ifdef HAVE_WINSOCK2_H
211 #include <winsock2.h>
212 #ifdef HAVE_WS2TCPIP_H
213 #include <ws2tcpip.h>
217 #ifdef HAVE_SYS_TYPES_H
218 #include <sys/types.h>
220 #ifdef HAVE_SYS_SOCKET_H
221 #include <sys/socket.h>
228 dnl CURL_CHECK_FUNC_GETNAMEINFO
229 dnl -------------------------------------------------
230 dnl Test if the getnameinfo function is available,
231 dnl and check the types of five of its arguments.
232 dnl If the function succeeds HAVE_GETNAMEINFO will be
233 dnl defined, defining the types of the arguments in
234 dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
235 dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7,
236 dnl and also defining the type qualifier of first
237 dnl argument in GETNAMEINFO_QUAL_ARG1.
239 AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
240 AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
241 AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
242 AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
244 AC_MSG_CHECKING([for getnameinfo])
246 AC_LANG_FUNC_LINK_TRY([getnameinfo])
249 curl_cv_getnameinfo="yes"
252 curl_cv_getnameinfo="no"
255 if test "$curl_cv_getnameinfo" != "yes"; then
256 AC_MSG_CHECKING([deeper for getnameinfo])
262 curl_cv_getnameinfo="yes"
264 AC_MSG_RESULT([but still no])
265 curl_cv_getnameinfo="no"
269 if test "$curl_cv_getnameinfo" != "yes"; then
270 AC_MSG_CHECKING([deeper and deeper for getnameinfo])
273 #ifdef HAVE_WINDOWS_H
274 #ifndef WIN32_LEAN_AND_MEAN
275 #define WIN32_LEAN_AND_MEAN
278 #ifdef HAVE_WINSOCK2_H
279 #include <winsock2.h>
280 #ifdef HAVE_WS2TCPIP_H
281 #include <ws2tcpip.h>
285 #ifdef HAVE_SYS_TYPES_H
286 #include <sys/types.h>
288 #ifdef HAVE_SYS_SOCKET_H
289 #include <sys/socket.h>
296 getnameinfo(0, 0, 0, 0, 0, 0, 0);
299 curl_cv_getnameinfo="yes"
301 AC_MSG_RESULT([but still no])
302 curl_cv_getnameinfo="no"
306 if test "$curl_cv_getnameinfo" = "yes"; then
307 AC_CACHE_CHECK([types of arguments for getnameinfo],
308 [curl_cv_func_getnameinfo_args], [
309 curl_cv_func_getnameinfo_args="unknown"
310 for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
311 for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
312 for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
313 for gni_arg7 in 'int' 'unsigned int'; do
317 #ifdef HAVE_WINDOWS_H
318 #ifndef WIN32_LEAN_AND_MEAN
319 #define WIN32_LEAN_AND_MEAN
321 #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
323 #define _WIN32_WINNT 0x0501
326 #ifdef HAVE_WINSOCK2_H
327 #include <winsock2.h>
328 #ifdef HAVE_WS2TCPIP_H
329 #include <ws2tcpip.h>
332 #define GNICALLCONV WSAAPI
334 #ifdef HAVE_SYS_TYPES_H
335 #include <sys/types.h>
337 #ifdef HAVE_SYS_SOCKET_H
338 #include <sys/socket.h>
345 extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
351 $gni_arg46 hostlen=0;
352 $gni_arg46 servlen=0;
354 int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
357 curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
365 if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
366 AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
367 AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
369 gni_prev_IFS=$IFS; IFS=','
370 set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
373 AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
374 [Define to the type of arg 2 for getnameinfo.])
375 AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
376 [Define to the type of args 4 and 6 for getnameinfo.])
377 AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
378 [Define to the type of arg 7 for getnameinfo.])
380 gni_qual_type_arg1=$[1]
382 case "$gni_qual_type_arg1" in
385 gni_type_arg1=`echo $gni_qual_type_arg1 | sed 's/^const //'`
389 gni_type_arg1=$gni_qual_type_arg1
393 AC_DEFINE_UNQUOTED(GETNAMEINFO_QUAL_ARG1, "$gni_qual_arg1",
394 [Define to the type qualifier of arg 1 for getnameinfo.])
395 AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, "$gni_type_arg1",
396 [Define to the type of arg 1 for getnameinfo.])
398 AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
399 [Define to 1 if you have the getnameinfo function.])
400 ac_cv_func_getnameinfo="yes"
406 dnl CURL_CHECK_NONBLOCKING_SOCKET
407 dnl -------------------------------------------------
408 dnl Check for how to set a socket to non-blocking state. There seems to exist
409 dnl four known different ways, with the one used almost everywhere being POSIX
410 dnl and XPG3, while the other different ways for different systems (old BSD,
411 dnl Windows and Amiga).
413 dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
414 dnl O_NONBLOCK define is found but does not work. This condition is attempted
415 dnl to get caught in this script by using an excessive number of #ifdefs...
417 AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
419 AC_MSG_CHECKING([non-blocking sockets style])
422 /* headers for O_NONBLOCK test */
423 #include <sys/types.h>
427 /* try to compile O_NONBLOCK */
429 #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
430 # if defined(__SVR4) || defined(__srv4__)
431 # define PLATFORM_SOLARIS
433 # define PLATFORM_SUNOS4
436 #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
437 # define PLATFORM_AIX_V3
440 #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
441 #error "O_NONBLOCK does not work on this platform"
444 int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
446 dnl the O_NONBLOCK test was fine
447 nonblock="O_NONBLOCK"
448 AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
450 dnl the code was bad, try a different program now, test 2
453 /* headers for FIONBIO test */
457 /* FIONBIO source test (old-style unix) */
459 int flags = ioctl(socket, FIONBIO, &flags);
461 dnl FIONBIO test was good
463 AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
465 dnl FIONBIO test was also bad
466 dnl the code was bad, try a different program now, test 3
469 /* headers for ioctlsocket test (Windows) */
471 #ifdef HAVE_WINDOWS_H
472 #ifndef WIN32_LEAN_AND_MEAN
473 #define WIN32_LEAN_AND_MEAN
476 #ifdef HAVE_WINSOCK2_H
477 #include <winsock2.h>
479 #ifdef HAVE_WINSOCK_H
485 /* ioctlsocket source code */
487 unsigned long flags = 0;
488 sd = socket(0, 0, 0);
489 ioctlsocket(sd, FIONBIO, &flags);
491 dnl ioctlsocket test was good
492 nonblock="ioctlsocket"
493 AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
495 dnl ioctlsocket didnt compile!, go to test 4
498 /* headers for IoctlSocket test (Amiga?) */
499 #include <sys/ioctl.h>
501 /* IoctlSocket source code */
503 int flags = IoctlSocket(socket, FIONBIO, (long)1);
505 dnl ioctlsocket test was good
506 nonblock="IoctlSocket"
507 AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
509 dnl Ioctlsocket didnt compile, do test 5!
511 /* headers for SO_NONBLOCK test (BeOS) */
514 /* SO_NONBLOCK source code */
517 int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
519 dnl the SO_NONBLOCK test was good
520 nonblock="SO_NONBLOCK"
521 AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
523 dnl test 5 didnt compile!
525 AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
527 dnl end of fifth test
530 dnl end of forth test
533 dnl end of third test
536 dnl end of second test
539 dnl end of non-blocking try-compile test
540 AC_MSG_RESULT($nonblock)
542 if test "$nonblock" = "nada"; then
543 AC_MSG_WARN([non-block sockets disabled])
548 dnl TYPE_SOCKADDR_STORAGE
549 dnl -------------------------------------------------
550 dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
551 dnl AIX 4.3 is one known exception.
552 AC_DEFUN([TYPE_SOCKADDR_STORAGE],
554 AC_CHECK_TYPE([struct sockaddr_storage],
555 AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
556 [if struct sockaddr_storage is defined]), ,
559 #ifdef HAVE_WINDOWS_H
560 #ifndef WIN32_LEAN_AND_MEAN
561 #define WIN32_LEAN_AND_MEAN
564 #ifdef HAVE_WINSOCK2_H
565 #include <winsock2.h>
568 #ifdef HAVE_SYS_TYPES_H
569 #include <sys/types.h>
571 #ifdef HAVE_SYS_SOCKET_H
572 #include <sys/socket.h>
574 #ifdef HAVE_NETINET_IN_H
575 #include <netinet/in.h>
577 #ifdef HAVE_ARPA_INET_H
578 #include <arpa/inet.h>
586 dnl -------------------------------------------------
587 dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
588 dnl and a few other things.
589 AC_DEFUN([TYPE_IN_ADDR_T],
591 AC_CHECK_TYPE([in_addr_t], ,[
592 AC_MSG_CHECKING([for in_addr_t equivalent])
593 AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
595 curl_cv_in_addr_t_equiv=
596 for t in "unsigned long" int size_t unsigned long; do
599 #ifdef HAVE_WINDOWS_H
600 #ifndef WIN32_LEAN_AND_MEAN
601 #define WIN32_LEAN_AND_MEAN
604 #ifdef HAVE_WINSOCK2_H
605 #include <winsock2.h>
607 #ifdef HAVE_WINSOCK_H
612 #ifdef HAVE_SYS_TYPES_H
613 #include <sys/types.h>
615 #ifdef HAVE_SYS_SOCKET_H
616 #include <sys/socket.h>
618 #ifdef HAVE_NETINET_IN_H
619 #include <netinet/in.h>
621 #ifdef HAVE_ARPA_INET_H
622 #include <arpa/inet.h>
626 $t data = inet_addr ("1.2.3.4");
628 curl_cv_in_addr_t_equiv="$t"
633 if test "x$curl_cv_in_addr_t_equiv" = x; then
634 AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
637 AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
638 AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
639 [type to use in place of in_addr_t if not defined])],
642 #ifdef HAVE_WINDOWS_H
643 #ifndef WIN32_LEAN_AND_MEAN
644 #define WIN32_LEAN_AND_MEAN
647 #ifdef HAVE_WINSOCK2_H
648 #include <winsock2.h>
650 #ifdef HAVE_WINSOCK_H
655 #ifdef HAVE_SYS_TYPES_H
656 #include <sys/types.h>
658 #ifdef HAVE_SYS_SOCKET_H
659 #include <sys/socket.h>
661 #ifdef HAVE_NETINET_IN_H
662 #include <netinet/in.h>
664 #ifdef HAVE_ARPA_INET_H
665 #include <arpa/inet.h>
671 dnl ************************************************************
672 dnl check for "localhost", if it doesn't exist, we can't do the
673 dnl gethostbyname_r tests!
676 AC_DEFUN([CURL_CHECK_WORKING_RESOLVER],[
677 AC_MSG_CHECKING([if "localhost" resolves])
680 #include <sys/types.h>
686 h = gethostbyname("localhost");
687 exit (h == NULL ? 1 : 0); }],[
688 AC_MSG_RESULT(yes)],[
690 AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve])
696 dnl ************************************************************
697 dnl check for working getaddrinfo() that works with AI_NUMERICHOST
699 AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
700 AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
703 #include <sys/types.h>
704 #include <sys/socket.h>
708 struct addrinfo hints, *ai;
711 memset(&hints, 0, sizeof(hints));
712 hints.ai_flags = AI_NUMERICHOST;
713 hints.ai_family = AF_UNSPEC;
714 hints.ai_socktype = SOCK_STREAM;
715 error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
722 ac_cv_working_getaddrinfo="yes"
724 ac_cv_working_getaddrinfo="no"
726 ac_cv_working_getaddrinfo="yes"
728 if test "$ac_cv_working_getaddrinfo" = "yes"; then
729 AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works])
730 AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
733 AC_SUBST(IPV6_ENABLED)
737 dnl ************************************************************
738 dnl check for working NI_WITHSCOPEID in getnameinfo()
740 AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID],[
741 AC_CACHE_CHECK(for working NI_WITHSCOPEID, ac_cv_working_ni_withscopeid,[
745 #include <sys/types.h>
746 #include <sys/socket.h>
750 #ifdef NI_WITHSCOPEID
751 struct sockaddr_storage ss;
752 int sslen = sizeof(ss);
754 char hbuf[NI_MAXHOST];
755 int fd = socket(AF_INET6, SOCK_STREAM, 0);
758 return 1; /* couldn't create socket of either kind */
761 rc = getsockname(fd, (struct sockaddr *)&ss, &sslen);
763 perror("getsockname()");
767 rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf),
769 NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID);
772 printf("rc = %s\n", gai_strerror(rc));
776 return 0; /* everything works fine, use NI_WITHSCOPEID! */
778 return 4; /* we don't seem to have the definition, don't use it */
783 [ ac_cv_working_ni_withscopeid="yes" ],
785 [ ac_cv_working_ni_withscopeid="no" ],
786 dnl we cross-compile, check the headers using the preprocessor
792 #include <sys/types.h>
793 #include <sys/socket.h>
796 #ifdef NI_WITHSCOPEID
800 ac_cv_working_ni_withscopeid="yes",
801 ac_cv_working_ni_withscopeid="no" )
804 ) dnl end of AC_RUN_IFELSE
806 ]) dnl end of AC_CACHE_CHECK
808 if test "$ac_cv_working_ni_withscopeid" = "yes"; then
809 AC_DEFINE(HAVE_NI_WITHSCOPEID, 1,
810 [Define if NI_WITHSCOPEID exists and works])
813 ]) dnl end of AC_DEFUN
816 AC_DEFUN([CURL_CHECK_LOCALTIME_R],
818 dnl check for localtime_r
819 AC_CHECK_FUNCS(localtime_r,[
820 AC_MSG_CHECKING(whether localtime_r is declared)
821 AC_EGREP_CPP(localtime_r,[
823 AC_MSG_RESULT(yes)],[
825 AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared)
826 AC_EGREP_CPP(localtime_r,[
829 AC_DEFINE(NEED_REENTRANT)
831 AC_MSG_RESULT(no))])])
835 dnl This function checks for strerror_r(). If it isn't found at first, it
836 dnl retries with _THREAD_SAFE defined, as that is what AIX seems to require
837 dnl in order to find this function.
839 dnl If the function is found, it will then proceed to check how the function
840 dnl actually works: glibc-style or POSIX-style.
843 dnl char *strerror_r(int errnum, char *buf, size_t n);
845 dnl What this one does is to return the error string (no surprises there),
846 dnl but it doesn't usually copy anything into buf! The 'buf' and 'n'
847 dnl parameters are only meant as an optional working area, in case strerror_r
848 dnl needs it. A quick test on a few systems shows that it's generally not
852 dnl int strerror_r(int errnum, char *buf, size_t n);
854 AC_DEFUN([CURL_CHECK_STRERROR_R],
856 AC_CHECK_FUNCS(strerror_r)
858 if test "x$ac_cv_func_strerror_r" = "xyes"; then
860 AC_MSG_CHECKING(whether strerror_r is declared)
861 AC_EGREP_CPP(strerror_r,[
862 #include <string.h>],[
863 AC_MSG_RESULT(yes)],[
865 AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
866 AC_EGREP_CPP(strerror_r,[
868 #include <string.h>],[
869 CPPFLAGS="-D_REENTRANT $CPPFLAGS"
872 AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
873 ) dnl with _THREAD_SAFE
874 ]) dnl plain cpp for it
876 dnl determine if this strerror_r() is glibc or POSIX
877 AC_MSG_CHECKING([for a glibc strerror_r API])
883 char buffer[1024]; /* big enough to play with */
885 strerror_r(EACCES, buffer, sizeof(buffer));
886 /* this should've returned a string */
887 if(!string || !string[0])
893 AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
894 AC_MSG_RESULT([yes]),
897 dnl Use an inferior method of strerror_r detection while cross-compiling
899 #include <features.h>
904 dnl looks like glibc, so assume a glibc-style strerror_r()
906 AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
907 AC_MSG_RESULT([yes]),
908 AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
909 ) dnl while cross-compiling
912 if test -z "$GLIBC_STRERROR_R"; then
914 AC_MSG_CHECKING([for a POSIX strerror_r API])
920 char buffer[1024]; /* big enough to play with */
922 strerror_r(EACCES, buffer, sizeof(buffer));
923 /* This should've returned zero, and written an error string in the
925 if(!buffer[0] || error)
930 AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-style strerror_r()])
931 AC_MSG_RESULT([yes]),
932 AC_MSG_RESULT([no]) ,
934 AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
937 fi dnl if not using glibc API
939 fi dnl we have a strerror_r
943 AC_DEFUN([CURL_CHECK_INET_NTOA_R],
945 dnl determine if function definition for inet_ntoa_r exists.
946 AC_CHECK_FUNCS(inet_ntoa_r,[
947 AC_MSG_CHECKING(whether inet_ntoa_r is declared)
948 AC_EGREP_CPP(inet_ntoa_r,[
949 #include <arpa/inet.h>],[
950 AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
951 AC_MSG_RESULT(yes)],[
953 AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
954 AC_EGREP_CPP(inet_ntoa_r,[
956 #include <arpa/inet.h>],[
957 AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
958 AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
960 AC_MSG_RESULT(no))])])
963 AC_DEFUN([CURL_CHECK_GETHOSTBYADDR_R],
965 dnl check for number of arguments to gethostbyaddr_r. it might take
966 dnl either 5, 7, or 8 arguments.
967 AC_CHECK_FUNCS(gethostbyaddr_r,[
968 AC_MSG_CHECKING(if gethostbyaddr_r takes 5 arguments)
970 #include <sys/types.h>
971 #include <netdb.h>],[
976 struct hostent_data hdata;
978 rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
980 AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
981 ac_cv_gethostbyaddr_args=5],[
983 AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
986 #include <sys/types.h>
987 #include <netdb.h>],[
992 struct hostent_data hdata;
994 rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
996 AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
997 AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
998 ac_cv_gethostbyaddr_args=5],[
1000 AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
1002 #include <sys/types.h>
1003 #include <netdb.h>],[
1010 struct hostent * hp;
1012 hp = gethostbyaddr_r(address, length, type, &h,
1013 buffer, 8192, &h_errnop);],[
1015 AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args] )
1016 ac_cv_gethostbyaddr_args=7],[
1018 AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
1020 #include <sys/types.h>
1021 #include <netdb.h>],[
1028 struct hostent * hp;
1031 rc = gethostbyaddr_r(address, length, type, &h,
1032 buffer, 8192, &hp, &h_errnop);],[
1034 AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
1035 ac_cv_gethostbyaddr_args=8],[
1037 have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
1040 AC_DEFUN([CURL_CHECK_GETHOSTBYNAME_R],
1042 dnl check for number of arguments to gethostbyname_r. it might take
1043 dnl either 3, 5, or 6 arguments.
1044 AC_CHECK_FUNCS(gethostbyname_r,[
1045 AC_MSG_CHECKING([if gethostbyname_r takes 3 arguments])
1048 #include <sys/types.h>
1051 #define NULL (void *)0
1054 gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
1055 struct hostent_data data;
1056 gethostbyname_r(NULL, NULL, NULL);],[
1058 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
1059 ac_cv_gethostbyname_args=3],[
1061 AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
1066 #include <sys/types.h>
1069 #define NULL (void *)0
1072 gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
1073 struct hostent_data data;
1074 gethostbyname_r(NULL, NULL, NULL);],[
1076 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
1077 AC_DEFINE(NEED_REENTRANT, 1, [needs REENTRANT])
1078 ac_cv_gethostbyname_args=3],[
1080 AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
1082 #include <sys/types.h>
1085 #define NULL (void *)0
1088 gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
1089 gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
1091 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5, 1, [gethostbyname_r() takes 5 args])
1092 ac_cv_gethostbyname_args=5],[
1094 AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
1096 #include <sys/types.h>
1099 #define NULL (void *)0
1102 gethostbyname_r(const char *, struct hostent *, char *, size_t,
1103 struct hostent **, int *);],[
1104 gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
1106 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6, 1, [gethostbyname_r() takes 6 args])
1107 ac_cv_gethostbyname_args=6],[
1109 have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],
1110 [ac_cv_gethostbyname_args=0])],
1111 [ac_cv_gethostbyname_args=0])],
1112 [ac_cv_gethostbyname_args=0])],
1113 [ac_cv_gethostbyname_args=0])])
1115 if test "$ac_cv_func_gethostbyname_r" = "yes"; then
1116 if test "$ac_cv_gethostbyname_args" = "0"; then
1117 dnl there's a gethostbyname_r() function, but we don't know how
1118 dnl many arguments it wants!
1119 AC_MSG_ERROR([couldn't figure out how to use gethostbyname_r()])
1125 dnl **********************************************************************
1126 dnl CURL_DETECT_ICC ([ACTION-IF-YES])
1128 dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
1129 dnl sets the $ICC variable to "yes" or "no"
1130 dnl **********************************************************************
1131 AC_DEFUN([CURL_DETECT_ICC],
1134 AC_MSG_CHECKING([for icc in use])
1135 if test "$GCC" = "yes"; then
1136 dnl check if this is icc acting as gcc in disguise
1137 AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
1138 dnl action if the text is found, this it has not been replaced by the
1141 dnl the text was not found, it was replaced by the cpp
1143 AC_MSG_RESULT([yes])
1147 if test "$ICC" = "no"; then
1153 dnl We create a function for detecting which compiler we use and then set as
1154 dnl pendantic compiler options as possible for that particular compiler. The
1155 dnl options are only used for debug-builds.
1157 AC_DEFUN([CURL_CC_DEBUG_OPTS],
1159 if test "z$ICC" = "z"; then
1163 if test "$GCC" = "yes"; then
1165 dnl figure out gcc version!
1166 AC_MSG_CHECKING([gcc version])
1167 gccver=`$CC -dumpversion`
1168 num1=`echo $gccver | cut -d . -f1`
1169 num2=`echo $gccver | cut -d . -f2`
1170 gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
1171 AC_MSG_RESULT($gccver)
1173 if test "$ICC" = "yes"; then
1174 dnl this is icc, not gcc.
1176 dnl ICC warnings we ignore:
1177 dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
1178 dnl "invalid format string conversion"
1179 dnl * 279 warns on static conditions in while expressions
1180 dnl * 981 warns on "operands are evaluated in unspecified order"
1181 dnl * 1418 "external definition with no prior declaration"
1182 dnl * 1419 warns on "external declaration in primary source file"
1183 dnl which we know and do on purpose.
1185 WARN="-wd279,269,981,1418,1419"
1187 if test "$gccnum" -gt "600"; then
1188 dnl icc 6.0 and older doesn't have the -Wall flag
1192 dnl this is a set of options we believe *ALL* gcc versions support:
1193 WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
1195 dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
1197 if test "$gccnum" -ge "207"; then
1198 dnl gcc 2.7 or later
1199 WARN="$WARN -Wmissing-declarations"
1202 if test "$gccnum" -gt "295"; then
1203 dnl only if the compiler is newer than 2.95 since we got lots of
1204 dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
1205 dnl gcc 2.95.4 on FreeBSD 4.9!
1206 WARN="$WARN -Wundef -Wno-long-long -Wsign-compare"
1209 if test "$gccnum" -ge "296"; then
1210 dnl gcc 2.96 or later
1211 WARN="$WARN -Wfloat-equal"
1214 if test "$gccnum" -gt "296"; then
1215 dnl this option does not exist in 2.96
1216 WARN="$WARN -Wno-format-nonliteral"
1219 dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
1220 dnl on i686-Linux as it gives us heaps with false positives.
1221 dnl Also, on gcc 4.0.X it is totally unbearable and complains all
1222 dnl over making it unusable for generic purposes. Let's not use it.
1224 if test "$gccnum" -ge "303"; then
1225 dnl gcc 3.3 and later
1226 WARN="$WARN -Wendif-labels -Wstrict-prototypes"
1229 if test "$gccnum" -ge "304"; then
1230 # try these on gcc 3.4
1231 WARN="$WARN -Wdeclaration-after-statement"
1234 for flag in $CPPFLAGS; do
1237 dnl Include path, provide a -isystem option for the same dir
1238 dnl to prevent warnings in those dirs. The -isystem was not very
1239 dnl reliable on earlier gcc versions.
1240 add=`echo $flag | sed 's/^-I/-isystem /g'`
1248 CFLAGS="$CFLAGS $WARN"
1250 AC_MSG_NOTICE([Added this set of compiler options: $WARN])
1254 AC_MSG_NOTICE([Added no extra compiler options])
1258 dnl strip off optimizer flags
1260 for flag in $CFLAGS; do
1263 dnl echo "cut off $flag"
1266 NEWFLAGS="$NEWFLAGS $flag"
1272 ]) dnl end of AC_DEFUN()
1275 dnl Determine the name of the library to pass to dlopen() based on the name
1276 dnl that would normally be given to AC_CHECK_LIB. The preprocessor symbol
1277 dnl given is set to the quoted library file name.
1278 dnl The standard dynamic library file name is first generated, based on the
1279 dnl current system type, then a search is performed for that file on the
1280 dnl standard dynamic library path. If it is a symbolic link, the destination
1281 dnl of the link is used as the file name, after stripping off any minor
1282 dnl version numbers. If a library file can't be found, a guess is made.
1283 dnl This macro assumes AC_PROG_LIBTOOL has been called and requires perl
1284 dnl to be available in the PATH, or $PERL to be set to its location.
1286 dnl CURL_DLLIB_NAME(VARIABLE, library_name)
1287 dnl e.g. CURL_DLLIB_NAME(LDAP_NAME, ldap) on a Linux system might result
1288 dnl in LDAP_NAME holding the string "libldap.so.2".
1290 AC_DEFUN([CURL_DLLIB_NAME],
1292 AC_MSG_CHECKING([name of dynamic library $2])
1293 dnl The shared library extension variable name changes from version to
1294 dnl version of libtool. Try a few names then just set one statically.
1295 test -z "$shared_ext" && shared_ext="$shrext_cmds"
1296 test -z "$shared_ext" && shared_ext="$shrext"
1297 test -z "$shared_ext" && shared_ext=".so"
1299 dnl Create the library link name of the correct form for this platform
1300 LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'`
1301 DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
1302 DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"`
1304 dnl Synthesize a likely dynamic library name in case we can't find an actual one
1305 SO_NAME_SPEC="$soname_spec"
1306 dnl soname_spec undefined when identical to the 1st entry in library_names_spec
1307 test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'`
1308 DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"`
1310 if test "$cross_compiling" = yes; then
1311 dnl Can't look at filesystem when cross-compiling
1312 AC_DEFINE_UNQUOTED($1, "$DLGUESSSOFILE", [$2 dynamic library file])
1313 AC_MSG_RESULT([$DLGUESSSOFILE (guess while cross-compiling)])
1317 if test "$sys_lib_dlsearch_path_spec" ; then
1318 dnl Search for the link library name and see what it points to.
1319 for direc in $sys_lib_dlsearch_path_spec ; do
1320 DLTRYFILE="$direc/$DLGUESSFILE"
1321 dnl Find where the symbolic link for this name points
1322 changequote(<<, >>)dnl
1324 DLFOUNDFILE=`${PERL:-perl} -e 'use File::Basename; (basename(readlink($ARGV[0])) =~ /^(.*[^\d]\.\d+)[\d\.]*$/ && print ${1}) || exit 1;' "$DLTRYFILE" 2>&5`
1326 changequote([, ])dnl
1327 if test "$?" -eq "0"; then
1328 dnl Found the file link
1334 if test -z "$DLFOUNDFILE" ; then
1335 dnl Couldn't find a link library, so guess at a name.
1336 DLFOUNDFILE="$DLGUESSSOFILE"
1339 AC_DEFINE_UNQUOTED($1, "$DLFOUNDFILE", [$2 dynamic library file])
1340 AC_MSG_RESULT($DLFOUNDFILE)
1344 # This is only a temporary fix. This macro is here to replace the broken one
1345 # delivered by the automake project (including the 1.9.6 release). As soon as
1346 # they ship a working version we SHOULD remove this work-around.
1348 AC_DEFUN([AM_MISSING_HAS_RUN],
1349 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
1350 test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
1351 # Use eval to expand $SHELL
1352 if eval "$MISSING --run true"; then
1353 am_missing_run="$MISSING --run "
1356 AC_MSG_WARN([`missing' script is too old or missing])