1 dnl Check for how to set a socket to non-blocking state. There seems to exist
2 dnl four known different ways, with the one used almost everywhere being POSIX
3 dnl and XPG3, while the other different ways for different systems (old BSD,
4 dnl Windows and Amiga).
6 dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
7 dnl O_NONBLOCK define is found but does not work. This condition is attempted
8 dnl to get caught in this script by using an excessive number of #ifdefs...
10 AC_DEFUN(CURL_CHECK_NONBLOCKING_SOCKET,
12 AC_MSG_CHECKING([non-blocking sockets style])
15 /* headers for O_NONBLOCK test */
16 #include <sys/types.h>
20 /* try to compile O_NONBLOCK */
22 #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
23 # if defined(__SVR4) || defined(__srv4__)
24 # define PLATFORM_SOLARIS
26 # define PLATFORM_SUNOS4
29 #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
30 # define PLATFORM_AIX_V3
33 #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3)
34 #error "O_NONBLOCK does not work on this platform"
37 int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
39 dnl the O_NONBLOCK test was fine
41 AC_DEFINE(HAVE_O_NONBLOCK)
43 dnl the code was bad, try a different program now, test 2
46 /* headers for FIONBIO test */
50 /* FIONBIO source test */
51 int flags = ioctl(socket, FIONBIO, &flags);
53 dnl FIONBIO test was good
55 AC_DEFINE(HAVE_FIONBIO)
57 dnl FIONBIO test was also bad
58 dnl the code was bad, try a different program now, test 3
61 /* headers for ioctlsocket test (cygwin?) */
64 /* ioctlsocket source code */
65 int flags = ioctlsocket(socket, FIONBIO, &flags);
67 dnl ioctlsocket test was good
68 nonblock="ioctlsocket"
69 AC_DEFINE(HAVE_IOCTLSOCKET)
71 dnl ioctlsocket didnt compile!
74 /* headers for IoctlSocket test (Amiga?) */
75 #include <sys/ioctl.h>
77 /* IoctlSocket source code */
78 int flags = IoctlSocket(socket, FIONBIO, (long)1);
80 dnl ioctlsocket test was good
81 nonblock="IoctlSocket"
82 AC_DEFINE(HAVE_IOCTLSOCKET_CASE)
84 dnl ioctlsocket didnt compile!
86 AC_DEFINE(HAVE_DISABLED_NONBLOCKING)
94 dnl end of second test
97 dnl end of non-blocking try-compile test
98 AC_MSG_RESULT($nonblock)
100 if test "$nonblock" = "nada"; then
101 AC_MSG_WARN([non-block sockets disabled])
105 dnl Check for socklen_t: historically on BSD it is an int, and in
106 dnl POSIX 1g it is a type of its own, but some platforms use different
107 dnl types for the argument to getsockopt, getpeername, etc. So we
108 dnl have to test to find something that will work.
109 AC_DEFUN([TYPE_SOCKLEN_T],
111 AC_CHECK_TYPE([socklen_t], ,[
112 AC_MSG_CHECKING([for socklen_t equivalent])
113 AC_CACHE_VAL([curl_cv_socklen_t_equiv],
115 # Systems have either "struct sockaddr *" or
116 # "void *" as the second argument to getpeername
117 curl_cv_socklen_t_equiv=
118 for arg2 in "struct sockaddr" void; do
119 for t in int size_t unsigned long "unsigned long"; do
121 #include <sys/types.h>
122 #include <sys/socket.h>
124 int getpeername (int, $arg2 *, $t *);
127 getpeername(0,0,&len);
129 curl_cv_socklen_t_equiv="$t"
135 if test "x$curl_cv_socklen_t_equiv" = x; then
136 AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
139 AC_MSG_RESULT($curl_cv_socklen_t_equiv)
140 AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
141 [type to use in place of socklen_t if not defined])],
142 [#include <sys/types.h>
143 #include <sys/socket.h>])
146 dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
147 dnl and a few other things. If not found, we set it to unsigned int, as even
148 dnl 64-bit implementations use to set it to a 32-bit type.
149 AC_DEFUN([TYPE_IN_ADDR_T],
151 AC_CHECK_TYPE([in_addr_t], ,[
152 AC_MSG_CHECKING([for in_addr_t equivalent])
153 AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
155 # Systems have either "struct sockaddr *" or
156 # "void *" as the second argument to getpeername
157 curl_cv_in_addr_t_equiv=
158 for t in int size_t unsigned long "unsigned long"; do
160 #include <sys/types.h>
161 #include <sys/socket.h>
162 #include <arpa/inet.h>
164 $t data = inet_addr ("1.2.3.4");
166 curl_cv_in_addr_t_equiv="$t"
171 if test "x$curl_cv_in_addr_t_equiv" = x; then
172 AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
175 AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
176 AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
177 [type to use in place of in_addr_t if not defined])],
178 [#include <sys/types.h>
179 #include <sys/socket.h>
180 #include <arpa/inet.h>])
183 dnl ************************************************************
184 dnl check for "localhost", if it doesn't exist, we can't do the
185 dnl gethostbyname_r tests!
188 AC_DEFUN(CURL_CHECK_WORKING_RESOLVER,[
189 AC_MSG_CHECKING([if "localhost" resolves])
192 #include <sys/types.h>
198 h = gethostbyname("localhost");
199 exit (h == NULL ? 1 : 0); }],[
200 AC_MSG_RESULT(yes)],[
202 AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve])
208 dnl ************************************************************
209 dnl check for working getaddrinfo()
211 AC_DEFUN(CURL_CHECK_WORKING_GETADDRINFO,[
212 AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
215 #include <sys/types.h>
216 #include <sys/socket.h>
219 struct addrinfo hints, *ai;
222 memset(&hints, 0, sizeof(hints));
223 hints.ai_family = AF_UNSPEC;
224 hints.ai_socktype = SOCK_STREAM;
225 error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
234 ac_cv_working_getaddrinfo="yes"
236 ac_cv_working_getaddrinfo="no"
238 ac_cv_working_getaddrinfo="yes"
240 if test "$ac_cv_working_getaddrinfo" = "yes"; then
241 AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works])
242 AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
245 AC_SUBST(IPV6_ENABLED)
250 AC_DEFUN(CURL_CHECK_LOCALTIME_R,
252 dnl check for a few thread-safe functions
253 AC_CHECK_FUNCS(localtime_r,[
254 AC_MSG_CHECKING(whether localtime_r is declared)
255 AC_EGREP_CPP(localtime_r,[
257 AC_MSG_RESULT(yes)],[
259 AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared)
260 AC_EGREP_CPP(localtime_r,[
263 AC_DEFINE(NEED_REENTRANT)
265 AC_MSG_RESULT(no))])])
268 AC_DEFUN(CURL_CHECK_INET_NTOA_R,
270 dnl determine if function definition for inet_ntoa_r exists.
271 AC_CHECK_FUNCS(inet_ntoa_r,[
272 AC_MSG_CHECKING(whether inet_ntoa_r is declared)
273 AC_EGREP_CPP(inet_ntoa_r,[
274 #include <arpa/inet.h>],[
275 AC_DEFINE(HAVE_INET_NTOA_R_DECL)
276 AC_MSG_RESULT(yes)],[
278 AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
279 AC_EGREP_CPP(inet_ntoa_r,[
281 #include <arpa/inet.h>],[
282 AC_DEFINE(HAVE_INET_NTOA_R_DECL)
283 AC_DEFINE(NEED_REENTRANT)
285 AC_MSG_RESULT(no))])])
288 AC_DEFUN(CURL_CHECK_GETHOSTBYADDR_R,
290 dnl check for number of arguments to gethostbyaddr_r. it might take
291 dnl either 5, 7, or 8 arguments.
292 AC_CHECK_FUNCS(gethostbyaddr_r,[
293 AC_MSG_CHECKING(if gethostbyaddr_r takes 5 arguments)
295 #include <sys/types.h>
296 #include <netdb.h>],[
301 struct hostent_data hdata;
303 rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
305 AC_DEFINE(HAVE_GETHOSTBYADDR_R_5)
306 ac_cv_gethostbyaddr_args=5],[
308 AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
311 #include <sys/types.h>
312 #include <netdb.h>],[
317 struct hostent_data hdata;
319 rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
321 AC_DEFINE(HAVE_GETHOSTBYADDR_R_5)
322 AC_DEFINE(NEED_REENTRANT)
323 ac_cv_gethostbyaddr_args=5],[
325 AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
327 #include <sys/types.h>
328 #include <netdb.h>],[
337 hp = gethostbyaddr_r(address, length, type, &h,
338 buffer, 8192, &h_errnop);],[
340 AC_DEFINE(HAVE_GETHOSTBYADDR_R_7)
341 ac_cv_gethostbyaddr_args=7],[
343 AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
345 #include <sys/types.h>
346 #include <netdb.h>],[
356 rc = gethostbyaddr_r(address, length, type, &h,
357 buffer, 8192, &hp, &h_errnop);],[
359 AC_DEFINE(HAVE_GETHOSTBYADDR_R_8)
360 ac_cv_gethostbyaddr_args=8],[
362 have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
365 AC_DEFUN(CURL_CHECK_GETHOSTBYNAME_R,
367 dnl check for number of arguments to gethostbyname_r. it might take
368 dnl either 3, 5, or 6 arguments.
369 AC_CHECK_FUNCS(gethostbyname_r,[
370 AC_MSG_CHECKING([if gethostbyname_r takes 3 arguments])
373 #include <sys/types.h>
376 #define NULL (void *)0
379 gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
380 gethostbyname_r(NULL, NULL, NULL);],[
382 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3)
383 ac_cv_gethostbyname_args=3],[
385 AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
390 #include <sys/types.h>
393 #define NULL (void *)0
396 gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
397 gethostbyname_r(NULL, NULL, NULL);],[
399 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3)
400 AC_DEFINE(NEED_REENTRANT)
401 ac_cv_gethostbyname_args=3],[
403 AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
405 #include <sys/types.h>
408 #define NULL (void *)0
411 gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
412 gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
414 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5)
415 ac_cv_gethostbyname_args=5],[
417 AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
419 #include <sys/types.h>
422 #define NULL (void *)0
425 gethostbyname_r(const char *, struct hostent *, char *, size_t,
426 struct hostent **, int *);],[
427 gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
429 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6)
430 ac_cv_gethostbyname_args=6],[
432 have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],
433 [ac_cv_gethostbyname_args=0])],
434 [ac_cv_gethostbyname_args=0])],
435 [ac_cv_gethostbyname_args=0])],
436 [ac_cv_gethostbyname_args=0])])
438 if test "$ac_cv_func_gethostbyname_r" = "yes"; then
439 if test "$ac_cv_gethostbyname_args" = "0"; then
440 dnl there's a gethostbyname_r() function, but we don't know how
441 dnl many arguments it wants!
442 AC_MSG_ERROR([couldn't figure out how to use gethostbyname_r()])