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, 1, [use O_NONBLOCK for non-blocking sockets])
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, 1, [use FIONBIO for non-blocking sockets])
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, 1, [use ioctlsocket() for non-blocking sockets])
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, 1, [use Ioctlsocket() for non-blocking sockets])
84 dnl ioctlsocket didnt compile!
86 AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
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 curl_cv_in_addr_t_equiv=
156 for t in "unsigned long" int size_t unsigned long; do
158 #include <sys/types.h>
159 #include <sys/socket.h>
160 #include <arpa/inet.h>
162 $t data = inet_addr ("1.2.3.4");
164 curl_cv_in_addr_t_equiv="$t"
169 if test "x$curl_cv_in_addr_t_equiv" = x; then
170 AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
173 AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
174 AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
175 [type to use in place of in_addr_t if not defined])],
176 [#include <sys/types.h>
177 #include <sys/socket.h>
178 #include <arpa/inet.h>])
181 dnl ************************************************************
182 dnl check for "localhost", if it doesn't exist, we can't do the
183 dnl gethostbyname_r tests!
186 AC_DEFUN(CURL_CHECK_WORKING_RESOLVER,[
187 AC_MSG_CHECKING([if "localhost" resolves])
190 #include <sys/types.h>
196 h = gethostbyname("localhost");
197 exit (h == NULL ? 1 : 0); }],[
198 AC_MSG_RESULT(yes)],[
200 AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve])
206 dnl ************************************************************
207 dnl check for working getaddrinfo()
209 AC_DEFUN(CURL_CHECK_WORKING_GETADDRINFO,[
210 AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
213 #include <sys/types.h>
214 #include <sys/socket.h>
217 struct addrinfo hints, *ai;
220 memset(&hints, 0, sizeof(hints));
221 hints.ai_family = AF_UNSPEC;
222 hints.ai_socktype = SOCK_STREAM;
223 error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
232 ac_cv_working_getaddrinfo="yes"
234 ac_cv_working_getaddrinfo="no"
236 ac_cv_working_getaddrinfo="yes"
238 if test "$ac_cv_working_getaddrinfo" = "yes"; then
239 AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works])
240 AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
243 AC_SUBST(IPV6_ENABLED)
248 AC_DEFUN(CURL_CHECK_LOCALTIME_R,
250 dnl check for a few thread-safe functions
251 AC_CHECK_FUNCS(localtime_r,[
252 AC_MSG_CHECKING(whether localtime_r is declared)
253 AC_EGREP_CPP(localtime_r,[
255 AC_MSG_RESULT(yes)],[
257 AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared)
258 AC_EGREP_CPP(localtime_r,[
261 AC_DEFINE(NEED_REENTRANT)
263 AC_MSG_RESULT(no))])])
266 AC_DEFUN(CURL_CHECK_INET_NTOA_R,
268 dnl determine if function definition for inet_ntoa_r exists.
269 AC_CHECK_FUNCS(inet_ntoa_r,[
270 AC_MSG_CHECKING(whether inet_ntoa_r is declared)
271 AC_EGREP_CPP(inet_ntoa_r,[
272 #include <arpa/inet.h>],[
273 AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
274 AC_MSG_RESULT(yes)],[
276 AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
277 AC_EGREP_CPP(inet_ntoa_r,[
279 #include <arpa/inet.h>],[
280 AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
281 AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
283 AC_MSG_RESULT(no))])])
286 AC_DEFUN(CURL_CHECK_GETHOSTBYADDR_R,
288 dnl check for number of arguments to gethostbyaddr_r. it might take
289 dnl either 5, 7, or 8 arguments.
290 AC_CHECK_FUNCS(gethostbyaddr_r,[
291 AC_MSG_CHECKING(if gethostbyaddr_r takes 5 arguments)
293 #include <sys/types.h>
294 #include <netdb.h>],[
299 struct hostent_data hdata;
301 rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
303 AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
304 ac_cv_gethostbyaddr_args=5],[
306 AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
309 #include <sys/types.h>
310 #include <netdb.h>],[
315 struct hostent_data hdata;
317 rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
319 AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
320 AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
321 ac_cv_gethostbyaddr_args=5],[
323 AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
325 #include <sys/types.h>
326 #include <netdb.h>],[
335 hp = gethostbyaddr_r(address, length, type, &h,
336 buffer, 8192, &h_errnop);],[
338 AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args] )
339 ac_cv_gethostbyaddr_args=7],[
341 AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
343 #include <sys/types.h>
344 #include <netdb.h>],[
354 rc = gethostbyaddr_r(address, length, type, &h,
355 buffer, 8192, &hp, &h_errnop);],[
357 AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
358 ac_cv_gethostbyaddr_args=8],[
360 have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
363 AC_DEFUN(CURL_CHECK_GETHOSTBYNAME_R,
365 dnl check for number of arguments to gethostbyname_r. it might take
366 dnl either 3, 5, or 6 arguments.
367 AC_CHECK_FUNCS(gethostbyname_r,[
368 AC_MSG_CHECKING([if gethostbyname_r takes 3 arguments])
371 #include <sys/types.h>
374 #define NULL (void *)0
377 gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
378 struct hostent_data data;
379 gethostbyname_r(NULL, NULL, NULL);],[
381 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
382 ac_cv_gethostbyname_args=3],[
384 AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
389 #include <sys/types.h>
392 #define NULL (void *)0
395 gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
396 struct hostent_data data;
397 gethostbyname_r(NULL, NULL, NULL);],[
399 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
400 AC_DEFINE(NEED_REENTRANT, 1, [needs 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, 1, [gethostbyname_r() takes 5 args])
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, 1, [gethostbyname_r() takes 6 args])
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()])