fix C style comment
[platform/upstream/c-ares.git] / acinclude.m4
1
2
3 dnl CURL_CHECK_COMPILER_HALT_ON_ERROR
4 dnl -------------------------------------------------
5 dnl Verifies if the compiler actually halts after the
6 dnl compilation phase without generating any object
7 dnl code file, when the source compiles with errors.
8
9 AC_DEFUN([CURL_CHECK_COMPILER_HALT_ON_ERROR], [
10   AC_MSG_CHECKING([if compiler halts on compilation errors])
11   AC_COMPILE_IFELSE([
12     AC_LANG_PROGRAM([[
13     ]],[[
14       force compilation error
15     ]])
16   ],[
17     AC_MSG_RESULT([no])
18     AC_MSG_ERROR([compiler does not halt on compilation errors.])
19   ],[
20     AC_MSG_RESULT([yes])
21   ])
22 ])
23
24
25 dnl CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
26 dnl -------------------------------------------------
27 dnl Verifies if the compiler actually halts after the
28 dnl compilation phase without generating any object
29 dnl code file, when the source code tries to define a
30 dnl type for a constant array with negative dimension.
31
32 AC_DEFUN([CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE], [
33   AC_REQUIRE([CURL_CHECK_COMPILER_HALT_ON_ERROR])dnl
34   AC_MSG_CHECKING([if compiler halts on negative sized arrays])
35   AC_COMPILE_IFELSE([
36     AC_LANG_PROGRAM([[
37       typedef char bad_t[sizeof(char) == sizeof(int) ? -1 : -1 ];
38     ]],[[
39       bad_t dummy;
40     ]])
41   ],[
42     AC_MSG_RESULT([no])
43     AC_MSG_ERROR([compiler does not halt on negative sized arrays.])
44   ],[
45     AC_MSG_RESULT([yes])
46   ])
47 ])
48
49
50 dnl CURL_CHECK_DEF(SYMBOL, [INCLUDES], [SILENT])
51 dnl -------------------------------------------------
52 dnl Use the C preprocessor to find out if the given object-style symbol
53 dnl is defined and get its expansion. This macro will not use default
54 dnl includes even if no INCLUDES argument is given. This macro will run
55 dnl silently when invoked with three arguments.
56
57 AC_DEFUN([CURL_CHECK_DEF], [
58   AS_VAR_PUSHDEF([ac_HaveDef], [curl_cv_have_def_$1])dnl
59   AS_VAR_PUSHDEF([ac_Def], [curl_cv_def_$1])dnl
60   ifelse($3,,[AC_MSG_CHECKING([for preprocessor definition of $1])])
61   tmp_exp=""
62   AC_PREPROC_IFELSE([
63     AC_LANG_SOURCE(
64 ifelse($2,,,[$2])[[
65 #ifdef $1
66 CURL_DEF_TOKEN $1
67 #endif
68     ]])
69   ],[
70     tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
71       "$GREP" CURL_DEF_TOKEN 2>/dev/null | \
72       "$SED" 's/.*CURL_DEF_TOKEN[[ ]]//' 2>/dev/null | \
73       "$SED" 'q' 2>/dev/null`
74     if test "$tmp_exp" = "$1"; then
75       tmp_exp=""
76     fi
77   ])
78   if test -z "$tmp_exp"; then
79     AS_VAR_SET([ac_HaveDef], [no])
80     ifelse($3,,[AC_MSG_RESULT([no])])
81   else
82     AS_VAR_SET([ac_HaveDef], [yes])
83     AS_VAR_SET([ac_Def], [$tmp_exp])
84     ifelse($3,,[AC_MSG_RESULT([$tmp_exp])])
85   fi
86   AS_VAR_POPDEF([ac_Def])dnl
87   AS_VAR_POPDEF([ac_HaveDef])dnl
88 ])
89
90
91 dnl CURL_CHECK_HEADER_WINDOWS
92 dnl -------------------------------------------------
93 dnl Check for compilable and valid windows.h header 
94
95 AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
96   AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
97     AC_COMPILE_IFELSE([
98       AC_LANG_PROGRAM([[
99 #undef inline
100 #ifndef WIN32_LEAN_AND_MEAN
101 #define WIN32_LEAN_AND_MEAN
102 #endif
103 #include <windows.h>
104       ]],[[
105 #if defined(__CYGWIN__) || defined(__CEGCC__)
106         HAVE_WINDOWS_H shall not be defined.
107 #else
108         int dummy=2*WINVER;
109 #endif
110       ]])
111     ],[
112       ac_cv_header_windows_h="yes"
113     ],[
114       ac_cv_header_windows_h="no"
115     ])
116   ])
117   case "$ac_cv_header_windows_h" in
118     yes)
119       AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
120         [Define to 1 if you have the windows.h header file.])
121       AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
122         [Define to avoid automatic inclusion of winsock.h])
123       ;;
124   esac
125 ])
126
127
128 dnl CURL_CHECK_NATIVE_WINDOWS
129 dnl -------------------------------------------------
130 dnl Check if building a native Windows target
131
132 AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
133   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
134   AC_CACHE_CHECK([whether build target is a native Windows one], [ac_cv_native_windows], [
135     if test "$ac_cv_header_windows_h" = "no"; then
136       ac_cv_native_windows="no"
137     else
138       AC_COMPILE_IFELSE([
139         AC_LANG_PROGRAM([[
140         ]],[[
141 #if defined(__MINGW32__) || defined(__MINGW32CE__) || \
142    (defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)))
143           int dummy=1;
144 #else
145           Not a native Windows build target.
146 #endif
147         ]])
148       ],[
149         ac_cv_native_windows="yes"
150       ],[
151         ac_cv_native_windows="no"
152       ])
153     fi
154   ])
155   case "$ac_cv_native_windows" in
156     yes)
157       AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
158         [Define to 1 if you are building a native Windows target.])
159       ;;
160   esac
161 ])
162
163
164 dnl CURL_CHECK_HEADER_WINSOCK
165 dnl -------------------------------------------------
166 dnl Check for compilable and valid winsock.h header 
167
168 AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
169   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
170   AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
171     AC_COMPILE_IFELSE([
172       AC_LANG_PROGRAM([[
173 #undef inline
174 #ifndef WIN32_LEAN_AND_MEAN
175 #define WIN32_LEAN_AND_MEAN
176 #endif
177 #include <windows.h>
178 #include <winsock.h>
179       ]],[[
180 #if defined(__CYGWIN__) || defined(__CEGCC__)
181         HAVE_WINSOCK_H shall not be defined.
182 #else
183         int dummy=WSACleanup();
184 #endif
185       ]])
186     ],[
187       ac_cv_header_winsock_h="yes"
188     ],[
189       ac_cv_header_winsock_h="no"
190     ])
191   ])
192   case "$ac_cv_header_winsock_h" in
193     yes)
194       AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
195         [Define to 1 if you have the winsock.h header file.])
196       ;;
197   esac
198 ])
199
200
201 dnl CURL_CHECK_HEADER_WINSOCK2
202 dnl -------------------------------------------------
203 dnl Check for compilable and valid winsock2.h header 
204
205 AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
206   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
207   AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
208     AC_COMPILE_IFELSE([
209       AC_LANG_PROGRAM([[
210 #undef inline
211 #ifndef WIN32_LEAN_AND_MEAN
212 #define WIN32_LEAN_AND_MEAN
213 #endif
214 #include <windows.h>
215 #include <winsock2.h>
216       ]],[[
217 #if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__)
218         HAVE_WINSOCK2_H shall not be defined.
219 #else
220         int dummy=2*IPPROTO_ESP;
221 #endif
222       ]])
223     ],[
224       ac_cv_header_winsock2_h="yes"
225     ],[
226       ac_cv_header_winsock2_h="no"
227     ])
228   ])
229   case "$ac_cv_header_winsock2_h" in
230     yes)
231       AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
232         [Define to 1 if you have the winsock2.h header file.])
233       ;;
234   esac
235 ])
236
237
238 dnl CURL_CHECK_HEADER_WS2TCPIP
239 dnl -------------------------------------------------
240 dnl Check for compilable and valid ws2tcpip.h header
241
242 AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
243   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
244   AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
245     AC_COMPILE_IFELSE([
246       AC_LANG_PROGRAM([[
247 #undef inline
248 #ifndef WIN32_LEAN_AND_MEAN
249 #define WIN32_LEAN_AND_MEAN
250 #endif
251 #include <windows.h>
252 #include <winsock2.h>
253 #include <ws2tcpip.h>
254       ]],[[
255 #if defined(__CYGWIN__) || defined(__CEGCC__) || defined(__MINGW32CE__)
256         HAVE_WS2TCPIP_H shall not be defined.
257 #else
258         int dummy=2*IP_PKTINFO;
259 #endif
260       ]])
261     ],[
262       ac_cv_header_ws2tcpip_h="yes"
263     ],[
264       ac_cv_header_ws2tcpip_h="no"
265     ])
266   ])
267   case "$ac_cv_header_ws2tcpip_h" in
268     yes)
269       AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
270         [Define to 1 if you have the ws2tcpip.h header file.])
271       ;;
272   esac
273 ])
274
275
276 dnl CURL_CHECK_HEADER_MALLOC
277 dnl -------------------------------------------------
278 dnl Check for compilable and valid malloc.h header,
279 dnl and check if it is needed even with stdlib.h
280
281 AC_DEFUN([CURL_CHECK_HEADER_MALLOC], [
282   AC_CACHE_CHECK([for malloc.h], [ac_cv_header_malloc_h], [
283     AC_COMPILE_IFELSE([
284       AC_LANG_PROGRAM([[
285 #include <malloc.h>
286       ]],[[
287         void *p = malloc(10);
288         void *q = calloc(10,10);
289         free(p);
290         free(q);
291       ]])
292     ],[
293       ac_cv_header_malloc_h="yes"
294     ],[
295       ac_cv_header_malloc_h="no"
296     ])
297   ])
298   if test "$ac_cv_header_malloc_h" = "yes"; then
299     AC_DEFINE_UNQUOTED(HAVE_MALLOC_H, 1,
300       [Define to 1 if you have the malloc.h header file.])
301     #
302     AC_COMPILE_IFELSE([
303       AC_LANG_PROGRAM([[
304 #include <stdlib.h>
305       ]],[[
306         void *p = malloc(10);
307         void *q = calloc(10,10);
308         free(p);
309         free(q);
310       ]])
311     ],[
312       curl_cv_need_header_malloc_h="no"
313     ],[
314       curl_cv_need_header_malloc_h="yes"
315     ])
316     #
317     case "$curl_cv_need_header_malloc_h" in
318       yes)
319         AC_DEFINE_UNQUOTED(NEED_MALLOC_H, 1,
320           [Define to 1 if you need the malloc.h header file even with stdlib.h])
321         ;;
322     esac
323   fi
324 ])
325
326
327 dnl CURL_CHECK_TYPE_SOCKLEN_T
328 dnl -------------------------------------------------
329 dnl Check for existing socklen_t type, and provide
330 dnl an equivalent type if socklen_t not available
331
332 AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
333   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
334   AC_CHECK_TYPE([socklen_t], ,[
335     dnl socklen_t not available
336     AC_CACHE_CHECK([for socklen_t equivalent],
337       [curl_cv_socklen_t_equiv], [
338       curl_cv_socklen_t_equiv="unknown"
339       for arg1 in 'int' 'SOCKET'; do
340         for arg2 in "struct sockaddr" void; do
341           for t in int size_t unsigned long "unsigned long"; do
342             if test "$curl_cv_socklen_t_equiv" = "unknown"; then
343               AC_COMPILE_IFELSE([
344                 AC_LANG_PROGRAM([[
345 #undef inline
346 #ifdef HAVE_WINDOWS_H
347 #ifndef WIN32_LEAN_AND_MEAN
348 #define WIN32_LEAN_AND_MEAN
349 #endif
350 #include <windows.h>
351 #ifdef HAVE_WINSOCK2_H
352 #include <winsock2.h>
353 #else
354 #ifdef HAVE_WINSOCK_H
355 #include <winsock.h>
356 #endif
357 #endif
358 #define GETPEERNCALLCONV PASCAL
359 #else
360 #ifdef HAVE_SYS_TYPES_H
361 #include <sys/types.h>
362 #endif
363 #ifdef HAVE_SYS_SOCKET_H
364 #include <sys/socket.h>
365 #endif
366 #define GETPEERNCALLCONV
367 #endif
368                   extern int GETPEERNCALLCONV getpeername($arg1, $arg2 *, $t *);
369                 ]],[[
370                   $t len=0;
371                   getpeername(0,0,&len);
372                 ]])
373               ],[
374                 curl_cv_socklen_t_equiv="$t"
375               ])
376             fi
377           done
378         done
379       done
380     ])
381     case "$curl_cv_socklen_t_equiv" in
382       unknown)
383         AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
384         ;;
385       *)
386         AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
387           [Type to use in place of socklen_t when system does not provide it.])
388         ;;
389     esac
390   ],[
391 #undef inline
392 #ifdef HAVE_WINDOWS_H
393 #ifndef WIN32_LEAN_AND_MEAN
394 #define WIN32_LEAN_AND_MEAN
395 #endif
396 #include <windows.h>
397 #ifdef HAVE_WINSOCK2_H
398 #include <winsock2.h>
399 #ifdef HAVE_WS2TCPIP_H
400 #include <ws2tcpip.h>
401 #endif
402 #endif
403 #else
404 #ifdef HAVE_SYS_TYPES_H
405 #include <sys/types.h>
406 #endif
407 #ifdef HAVE_SYS_SOCKET_H
408 #include <sys/socket.h>
409 #endif
410 #endif
411   ])
412 ])
413
414
415 dnl CURL_CHECK_FUNC_GETNAMEINFO
416 dnl -------------------------------------------------
417 dnl Test if the getnameinfo function is available, 
418 dnl and check the types of five of its arguments.
419 dnl If the function succeeds HAVE_GETNAMEINFO will be
420 dnl defined, defining the types of the arguments in
421 dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
422 dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7,
423 dnl and also defining the type qualifier of first 
424 dnl argument in GETNAMEINFO_QUAL_ARG1.
425
426 AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
427   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
428   AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
429   AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
430   #
431   AC_MSG_CHECKING([for getnameinfo])
432   AC_LINK_IFELSE([
433     AC_LANG_FUNC_LINK_TRY([getnameinfo])
434   ],[
435     AC_MSG_RESULT([yes])
436     curl_cv_getnameinfo="yes"
437   ],[
438     AC_MSG_RESULT([no])
439     curl_cv_getnameinfo="no"
440   ])
441   #
442   if test "$curl_cv_getnameinfo" != "yes"; then
443     AC_MSG_CHECKING([deeper for getnameinfo])
444     AC_LINK_IFELSE([
445       AC_LANG_PROGRAM([[
446       ]],[[
447         getnameinfo();
448       ]])
449     ],[
450       AC_MSG_RESULT([yes])
451       curl_cv_getnameinfo="yes"
452     ],[
453       AC_MSG_RESULT([but still no])
454       curl_cv_getnameinfo="no"
455     ])
456   fi
457   #
458   if test "$curl_cv_getnameinfo" != "yes"; then
459     AC_MSG_CHECKING([deeper and deeper for getnameinfo])
460     AC_LINK_IFELSE([
461       AC_LANG_PROGRAM([[
462 #undef inline
463 #ifdef HAVE_WINDOWS_H
464 #ifndef WIN32_LEAN_AND_MEAN
465 #define WIN32_LEAN_AND_MEAN
466 #endif
467 #include <windows.h>
468 #ifdef HAVE_WINSOCK2_H
469 #include <winsock2.h>
470 #ifdef HAVE_WS2TCPIP_H
471 #include <ws2tcpip.h>
472 #endif
473 #endif
474 #else
475 #ifdef HAVE_SYS_TYPES_H
476 #include <sys/types.h>
477 #endif
478 #ifdef HAVE_SYS_SOCKET_H
479 #include <sys/socket.h>
480 #endif
481 #ifdef HAVE_NETDB_H
482 #include <netdb.h>
483 #endif
484 #endif
485       ]],[[
486         getnameinfo(0, 0, 0, 0, 0, 0, 0);
487       ]])
488     ],[
489       AC_MSG_RESULT([yes])
490       curl_cv_getnameinfo="yes"
491     ],[
492       AC_MSG_RESULT([but still no])
493       curl_cv_getnameinfo="no"
494     ])
495   fi
496   #
497   if test "$curl_cv_getnameinfo" = "yes"; then
498     AC_CACHE_CHECK([types of arguments for getnameinfo],
499       [curl_cv_func_getnameinfo_args], [
500       curl_cv_func_getnameinfo_args="unknown"
501       for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
502         for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
503           for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
504             for gni_arg7 in 'int' 'unsigned int'; do
505               if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
506                 AC_COMPILE_IFELSE([
507                   AC_LANG_PROGRAM([[
508 #undef inline 
509 #ifdef HAVE_WINDOWS_H
510 #ifndef WIN32_LEAN_AND_MEAN
511 #define WIN32_LEAN_AND_MEAN
512 #endif
513 #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
514 #undef _WIN32_WINNT
515 #define _WIN32_WINNT 0x0501
516 #endif
517 #include <windows.h>
518 #ifdef HAVE_WINSOCK2_H
519 #include <winsock2.h> 
520 #ifdef HAVE_WS2TCPIP_H
521 #include <ws2tcpip.h>
522 #endif
523 #endif
524 #define GNICALLCONV WSAAPI
525 #else
526 #ifdef HAVE_SYS_TYPES_H
527 #include <sys/types.h>
528 #endif
529 #ifdef HAVE_SYS_SOCKET_H
530 #include <sys/socket.h>
531 #endif
532 #ifdef HAVE_NETDB_H
533 #include <netdb.h>
534 #endif
535 #define GNICALLCONV
536 #endif
537                     extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
538                                            char *, $gni_arg46,
539                                            char *, $gni_arg46,
540                                            $gni_arg7);
541                   ]],[[
542                     $gni_arg2 salen=0;
543                     $gni_arg46 hostlen=0;
544                     $gni_arg46 servlen=0;
545                     $gni_arg7 flags=0;
546                     int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
547                   ]])
548                 ],[
549                   curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
550                 ])
551               fi
552             done
553           done
554         done
555       done
556     ]) # AC_CACHE_CHECK
557     if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
558       AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
559       AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
560     else
561       gni_prev_IFS=$IFS; IFS=','
562       set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
563       IFS=$gni_prev_IFS
564       shift
565       #
566       gni_qual_type_arg1=$[1]
567       #
568       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
569         [Define to the type of arg 2 for getnameinfo.])
570       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
571         [Define to the type of args 4 and 6 for getnameinfo.])
572       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
573         [Define to the type of arg 7 for getnameinfo.])
574       #
575       prev_sh_opts=$-
576       #
577       case $prev_sh_opts in
578         *f*)
579           ;;
580         *)
581           set -f
582           ;;
583       esac
584       #
585       case "$gni_qual_type_arg1" in
586         const*)
587           gni_qual_arg1=const
588           gni_type_arg1=`echo $gni_qual_type_arg1 | sed 's/^const //'`
589         ;;
590         *)
591           gni_qual_arg1=
592           gni_type_arg1=$gni_qual_type_arg1
593         ;;
594       esac
595       #
596       AC_DEFINE_UNQUOTED(GETNAMEINFO_QUAL_ARG1, $gni_qual_arg1,
597         [Define to the type qualifier of arg 1 for getnameinfo.])
598       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $gni_type_arg1,
599         [Define to the type of arg 1 for getnameinfo.])
600       #
601       case $prev_sh_opts in
602         *f*)
603           ;;
604         *)
605           set +f
606           ;;
607       esac
608       #
609       AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
610         [Define to 1 if you have the getnameinfo function.])
611       ac_cv_func_getnameinfo="yes"
612     fi
613   fi
614 ]) # AC_DEFUN
615
616
617 dnl TYPE_SOCKADDR_STORAGE
618 dnl -------------------------------------------------
619 dnl Check for struct sockaddr_storage. Most IPv6-enabled 
620 dnl hosts have it, but AIX 4.3 is one known exception.
621
622 AC_DEFUN([TYPE_SOCKADDR_STORAGE],
623 [
624    AC_CHECK_TYPE([struct sockaddr_storage],
625         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
626                   [if struct sockaddr_storage is defined]), ,
627    [
628 #undef inline
629 #ifdef HAVE_WINDOWS_H
630 #ifndef WIN32_LEAN_AND_MEAN
631 #define WIN32_LEAN_AND_MEAN
632 #endif
633 #include <windows.h>
634 #ifdef HAVE_WINSOCK2_H
635 #include <winsock2.h>
636 #endif
637 #else
638 #ifdef HAVE_SYS_TYPES_H
639 #include <sys/types.h>
640 #endif
641 #ifdef HAVE_SYS_SOCKET_H
642 #include <sys/socket.h>
643 #endif
644 #ifdef HAVE_NETINET_IN_H
645 #include <netinet/in.h>
646 #endif
647 #ifdef HAVE_ARPA_INET_H
648 #include <arpa/inet.h>
649 #endif
650 #endif
651    ])
652 ])
653
654
655 dnl CURL_CHECK_NI_WITHSCOPEID
656 dnl -------------------------------------------------
657 dnl Check for working NI_WITHSCOPEID in getnameinfo()
658
659 AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID], [
660   AC_REQUIRE([CURL_CHECK_FUNC_GETNAMEINFO])dnl
661   AC_REQUIRE([TYPE_SOCKADDR_STORAGE])dnl
662   AC_CHECK_HEADERS(stdio.h sys/types.h sys/socket.h \
663                    netdb.h netinet/in.h arpa/inet.h)
664   #
665   AC_CACHE_CHECK([for working NI_WITHSCOPEID], 
666     [ac_cv_working_ni_withscopeid], [
667     AC_RUN_IFELSE([
668       AC_LANG_PROGRAM([[
669 #ifdef HAVE_STDIO_H
670 #include <stdio.h>
671 #endif
672 #ifdef HAVE_SYS_TYPES_H
673 #include <sys/types.h>
674 #endif
675 #ifdef HAVE_SYS_SOCKET_H
676 #include <sys/socket.h>
677 #endif
678 #ifdef HAVE_NETDB_H
679 #include <netdb.h>
680 #endif
681 #ifdef HAVE_NETINET_IN_H
682 #include <netinet/in.h>
683 #endif
684 #ifdef HAVE_ARPA_INET_H
685 #include <arpa/inet.h>
686 #endif
687       ]],[[
688 #if defined(NI_WITHSCOPEID) && defined(HAVE_GETNAMEINFO)
689 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE
690         struct sockaddr_storage sa;
691 #else
692         unsigned char sa[256];
693 #endif
694         char hostbuf[NI_MAXHOST];
695         int rc;
696         GETNAMEINFO_TYPE_ARG2 salen = (GETNAMEINFO_TYPE_ARG2)sizeof(sa);
697         GETNAMEINFO_TYPE_ARG46 hostlen = (GETNAMEINFO_TYPE_ARG46)sizeof(hostbuf);
698         GETNAMEINFO_TYPE_ARG7 flags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
699         int fd = socket(AF_INET6, SOCK_STREAM, 0);
700         if(fd < 0) {
701           perror("socket()");
702           return 1; /* Error creating socket */
703         }
704         rc = getsockname(fd, (GETNAMEINFO_TYPE_ARG1)&sa, &salen);
705         if(rc) {
706           perror("getsockname()");
707           return 2; /* Error retrieving socket name */
708         }
709         rc = getnameinfo((GETNAMEINFO_TYPE_ARG1)&sa, salen, hostbuf, hostlen, NULL, 0, flags);
710         if(rc) {
711           printf("rc = %s\n", gai_strerror(rc));
712           return 3; /* Error translating socket address */
713         }
714         return 0; /* Ok, NI_WITHSCOPEID works */
715 #else
716         return 4; /* Error, NI_WITHSCOPEID not defined or no getnameinfo() */
717 #endif
718       ]]) # AC_LANG_PROGRAM
719     ],[
720       # Exit code == 0. Program worked.
721       ac_cv_working_ni_withscopeid="yes"
722     ],[
723       # Exit code != 0. Program failed.
724       ac_cv_working_ni_withscopeid="no"
725     ],[
726       # Program is not run when cross-compiling. So we assume
727       # NI_WITHSCOPEID will work if we are able to compile it.
728       AC_COMPILE_IFELSE([
729         AC_LANG_PROGRAM([[
730 #include <sys/types.h>
731 #include <sys/socket.h>
732 #include <netdb.h>
733         ]],[[
734           unsigned int dummy= NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
735         ]])
736       ],[
737         ac_cv_working_ni_withscopeid="yes"
738       ],[
739         ac_cv_working_ni_withscopeid="no"
740       ]) # AC_COMPILE_IFELSE
741     ]) # AC_RUN_IFELSE
742   ]) # AC_CACHE_CHECK
743   case "$ac_cv_working_ni_withscopeid" in
744     yes)
745       AC_DEFINE(HAVE_NI_WITHSCOPEID, 1,
746         [Define to 1 if NI_WITHSCOPEID exists and works.])
747       ;;
748   esac
749 ]) # AC_DEFUN
750
751
752 dnl CURL_CHECK_FUNC_RECV
753 dnl -------------------------------------------------
754 dnl Test if the socket recv() function is available, 
755 dnl and check its return type and the types of its 
756 dnl arguments. If the function succeeds HAVE_RECV 
757 dnl will be defined, defining the types of the arguments 
758 dnl in RECV_TYPE_ARG1, RECV_TYPE_ARG2, RECV_TYPE_ARG3 
759 dnl and RECV_TYPE_ARG4, defining the type of the function
760 dnl return value in RECV_TYPE_RETV.
761
762 AC_DEFUN([CURL_CHECK_FUNC_RECV], [
763   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
764   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
765   AC_CHECK_HEADERS(sys/types.h sys/socket.h)
766   #
767   AC_MSG_CHECKING([for recv])
768   AC_LINK_IFELSE([
769     AC_LANG_PROGRAM([[
770 #undef inline 
771 #ifdef HAVE_WINDOWS_H
772 #ifndef WIN32_LEAN_AND_MEAN
773 #define WIN32_LEAN_AND_MEAN
774 #endif
775 #include <windows.h>
776 #ifdef HAVE_WINSOCK2_H
777 #include <winsock2.h>
778 #else
779 #ifdef HAVE_WINSOCK_H
780 #include <winsock.h>
781 #endif
782 #endif
783 #else
784 #ifdef HAVE_SYS_TYPES_H
785 #include <sys/types.h>
786 #endif
787 #ifdef HAVE_SYS_SOCKET_H
788 #include <sys/socket.h>
789 #endif
790 #endif
791     ]],[[
792       recv(0, 0, 0, 0);
793     ]])
794   ],[
795     AC_MSG_RESULT([yes])
796     curl_cv_recv="yes"
797   ],[
798     AC_MSG_RESULT([no])
799     curl_cv_recv="no"
800   ])
801   #
802   if test "$curl_cv_recv" = "yes"; then
803     AC_CACHE_CHECK([types of args and return type for recv],
804       [curl_cv_func_recv_args], [
805       curl_cv_func_recv_args="unknown"
806       for recv_retv in 'int' 'ssize_t'; do
807         for recv_arg1 in 'int' 'ssize_t' 'SOCKET'; do
808           for recv_arg2 in 'char *' 'void *'; do
809             for recv_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
810               for recv_arg4 in 'int' 'unsigned int'; do
811                 if test "$curl_cv_func_recv_args" = "unknown"; then
812                   AC_COMPILE_IFELSE([
813                     AC_LANG_PROGRAM([[
814 #undef inline 
815 #ifdef HAVE_WINDOWS_H
816 #ifndef WIN32_LEAN_AND_MEAN
817 #define WIN32_LEAN_AND_MEAN
818 #endif
819 #include <windows.h>
820 #ifdef HAVE_WINSOCK2_H
821 #include <winsock2.h>
822 #else
823 #ifdef HAVE_WINSOCK_H
824 #include <winsock.h>
825 #endif
826 #endif
827 #define RECVCALLCONV PASCAL
828 #else
829 #ifdef HAVE_SYS_TYPES_H
830 #include <sys/types.h>
831 #endif
832 #ifdef HAVE_SYS_SOCKET_H
833 #include <sys/socket.h>
834 #endif
835 #define RECVCALLCONV
836 #endif
837                       extern $recv_retv RECVCALLCONV
838                       recv($recv_arg1, $recv_arg2, $recv_arg3, $recv_arg4);
839                     ]],[[
840                       $recv_arg1 s=0;
841                       $recv_arg2 buf=0;
842                       $recv_arg3 len=0;
843                       $recv_arg4 flags=0;
844                       $recv_retv res = recv(s, buf, len, flags);
845                     ]])
846                   ],[
847                     curl_cv_func_recv_args="$recv_arg1,$recv_arg2,$recv_arg3,$recv_arg4,$recv_retv"
848                   ])
849                 fi
850               done
851             done
852           done
853         done
854       done
855     ]) # AC_CACHE_CHECK
856     if test "$curl_cv_func_recv_args" = "unknown"; then
857       AC_MSG_ERROR([Cannot find proper types to use for recv args])
858     else
859       recv_prev_IFS=$IFS; IFS=','
860       set dummy `echo "$curl_cv_func_recv_args" | sed 's/\*/\*/g'`
861       IFS=$recv_prev_IFS
862       shift
863       #
864       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG1, $[1],
865         [Define to the type of arg 1 for recv.])
866       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG2, $[2],
867         [Define to the type of arg 2 for recv.])
868       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG3, $[3],
869         [Define to the type of arg 3 for recv.])
870       AC_DEFINE_UNQUOTED(RECV_TYPE_ARG4, $[4],
871         [Define to the type of arg 4 for recv.])
872       AC_DEFINE_UNQUOTED(RECV_TYPE_RETV, $[5],
873         [Define to the function return type for recv.])
874       #
875       AC_DEFINE_UNQUOTED(HAVE_RECV, 1,
876         [Define to 1 if you have the recv function.])
877       ac_cv_func_recv="yes"
878     fi
879   else
880     AC_MSG_ERROR([Unable to link function recv])
881   fi
882 ]) # AC_DEFUN
883
884
885 dnl CURL_CHECK_FUNC_SEND
886 dnl -------------------------------------------------
887 dnl Test if the socket send() function is available, 
888 dnl and check its return type and the types of its 
889 dnl arguments. If the function succeeds HAVE_SEND 
890 dnl will be defined, defining the types of the arguments 
891 dnl in SEND_TYPE_ARG1, SEND_TYPE_ARG2, SEND_TYPE_ARG3 
892 dnl and SEND_TYPE_ARG4, defining the type of the function
893 dnl return value in SEND_TYPE_RETV, and also defining the 
894 dnl type qualifier of second argument in SEND_QUAL_ARG2.
895
896 AC_DEFUN([CURL_CHECK_FUNC_SEND], [
897   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
898   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
899   AC_CHECK_HEADERS(sys/types.h sys/socket.h)
900   #
901   AC_MSG_CHECKING([for send])
902   AC_LINK_IFELSE([
903     AC_LANG_PROGRAM([[
904 #undef inline 
905 #ifdef HAVE_WINDOWS_H
906 #ifndef WIN32_LEAN_AND_MEAN
907 #define WIN32_LEAN_AND_MEAN
908 #endif
909 #include <windows.h>
910 #ifdef HAVE_WINSOCK2_H
911 #include <winsock2.h>
912 #else
913 #ifdef HAVE_WINSOCK_H
914 #include <winsock.h>
915 #endif
916 #endif
917 #else
918 #ifdef HAVE_SYS_TYPES_H
919 #include <sys/types.h>
920 #endif
921 #ifdef HAVE_SYS_SOCKET_H
922 #include <sys/socket.h>
923 #endif
924 #endif
925     ]],[[
926       send(0, 0, 0, 0);
927     ]])
928   ],[
929     AC_MSG_RESULT([yes])
930     curl_cv_send="yes"
931   ],[
932     AC_MSG_RESULT([no])
933     curl_cv_send="no"
934   ])
935   #
936   if test "$curl_cv_send" = "yes"; then
937     AC_CACHE_CHECK([types of args and return type for send],
938       [curl_cv_func_send_args], [
939       curl_cv_func_send_args="unknown"
940       for send_retv in 'int' 'ssize_t'; do
941         for send_arg1 in 'int' 'ssize_t' 'SOCKET'; do
942           for send_arg2 in 'char *' 'void *' 'const char *' 'const void *'; do
943             for send_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
944               for send_arg4 in 'int' 'unsigned int'; do
945                 if test "$curl_cv_func_send_args" = "unknown"; then
946                   AC_COMPILE_IFELSE([
947                     AC_LANG_PROGRAM([[
948 #undef inline 
949 #ifdef HAVE_WINDOWS_H
950 #ifndef WIN32_LEAN_AND_MEAN
951 #define WIN32_LEAN_AND_MEAN
952 #endif
953 #include <windows.h>
954 #ifdef HAVE_WINSOCK2_H
955 #include <winsock2.h>
956 #else
957 #ifdef HAVE_WINSOCK_H
958 #include <winsock.h>
959 #endif
960 #endif
961 #define SENDCALLCONV PASCAL
962 #else
963 #ifdef HAVE_SYS_TYPES_H
964 #include <sys/types.h>
965 #endif
966 #ifdef HAVE_SYS_SOCKET_H
967 #include <sys/socket.h>
968 #endif
969 #define SENDCALLCONV
970 #endif
971                       extern $send_retv SENDCALLCONV
972                       send($send_arg1, $send_arg2, $send_arg3, $send_arg4);
973                     ]],[[
974                       $send_arg1 s=0;
975                       $send_arg3 len=0;
976                       $send_arg4 flags=0;
977                       $send_retv res = send(s, 0, len, flags);
978                     ]])
979                   ],[
980                     curl_cv_func_send_args="$send_arg1,$send_arg2,$send_arg3,$send_arg4,$send_retv"
981                   ])
982                 fi
983               done
984             done
985           done
986         done
987       done
988     ]) # AC_CACHE_CHECK
989     if test "$curl_cv_func_send_args" = "unknown"; then
990       AC_MSG_ERROR([Cannot find proper types to use for send args])
991     else
992       send_prev_IFS=$IFS; IFS=','
993       set dummy `echo "$curl_cv_func_send_args" | sed 's/\*/\*/g'`
994       IFS=$send_prev_IFS
995       shift
996       #
997       send_qual_type_arg2=$[2]
998       #
999       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG1, $[1],
1000         [Define to the type of arg 1 for send.])
1001       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG3, $[3],
1002         [Define to the type of arg 3 for send.])
1003       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG4, $[4],
1004         [Define to the type of arg 4 for send.])
1005       AC_DEFINE_UNQUOTED(SEND_TYPE_RETV, $[5],
1006         [Define to the function return type for send.])
1007       #
1008       prev_sh_opts=$-
1009       #
1010       case $prev_sh_opts in
1011         *f*)
1012           ;;
1013         *)
1014           set -f
1015           ;;
1016       esac
1017       #
1018       case "$send_qual_type_arg2" in
1019         const*)
1020           send_qual_arg2=const
1021           send_type_arg2=`echo $send_qual_type_arg2 | sed 's/^const //'`
1022         ;;
1023         *)
1024           send_qual_arg2=
1025           send_type_arg2=$send_qual_type_arg2
1026         ;;
1027       esac
1028       #
1029       AC_DEFINE_UNQUOTED(SEND_QUAL_ARG2, $send_qual_arg2,
1030         [Define to the type qualifier of arg 2 for send.])
1031       AC_DEFINE_UNQUOTED(SEND_TYPE_ARG2, $send_type_arg2,
1032         [Define to the type of arg 2 for send.])
1033       #
1034       case $prev_sh_opts in
1035         *f*)
1036           ;;
1037         *)
1038           set +f
1039           ;;
1040       esac
1041       #
1042       AC_DEFINE_UNQUOTED(HAVE_SEND, 1,
1043         [Define to 1 if you have the send function.])
1044       ac_cv_func_send="yes"
1045     fi
1046   else
1047     AC_MSG_ERROR([Unable to link function send])
1048   fi
1049 ]) # AC_DEFUN
1050
1051
1052 dnl CURL_CHECK_MSG_NOSIGNAL
1053 dnl -------------------------------------------------
1054 dnl Check for MSG_NOSIGNAL
1055
1056 AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
1057   AC_CHECK_HEADERS(sys/types.h sys/socket.h)
1058   AC_CACHE_CHECK([for MSG_NOSIGNAL], [ac_cv_msg_nosignal], [
1059     AC_COMPILE_IFELSE([
1060       AC_LANG_PROGRAM([[
1061 #undef inline 
1062 #ifdef HAVE_WINDOWS_H
1063 #ifndef WIN32_LEAN_AND_MEAN
1064 #define WIN32_LEAN_AND_MEAN
1065 #endif
1066 #include <windows.h>
1067 #ifdef HAVE_WINSOCK2_H
1068 #include <winsock2.h>
1069 #else
1070 #ifdef HAVE_WINSOCK_H
1071 #include <winsock.h>
1072 #endif
1073 #endif
1074 #else
1075 #ifdef HAVE_SYS_TYPES_H
1076 #include <sys/types.h>
1077 #endif
1078 #ifdef HAVE_SYS_SOCKET_H
1079 #include <sys/socket.h>
1080 #endif
1081 #endif
1082       ]],[[
1083         int flag=MSG_NOSIGNAL;
1084       ]])
1085     ],[
1086       ac_cv_msg_nosignal="yes"
1087     ],[
1088       ac_cv_msg_nosignal="no"
1089     ])
1090   ])
1091   case "$ac_cv_msg_nosignal" in
1092     yes)
1093       AC_DEFINE_UNQUOTED(HAVE_MSG_NOSIGNAL, 1,
1094         [Define to 1 if you have the MSG_NOSIGNAL flag.])
1095       ;;
1096   esac
1097 ]) # AC_DEFUN
1098
1099
1100 dnl CURL_CHECK_STRUCT_TIMEVAL
1101 dnl -------------------------------------------------
1102 dnl Check for timeval struct
1103
1104 AC_DEFUN([CURL_CHECK_STRUCT_TIMEVAL], [
1105   AC_REQUIRE([AC_HEADER_TIME])dnl
1106   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
1107   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
1108   AC_CHECK_HEADERS(sys/types.h sys/time.h time.h)
1109   AC_CACHE_CHECK([for struct timeval], [ac_cv_struct_timeval], [
1110     AC_COMPILE_IFELSE([
1111       AC_LANG_PROGRAM([[
1112 #undef inline 
1113 #ifdef HAVE_WINDOWS_H
1114 #ifndef WIN32_LEAN_AND_MEAN
1115 #define WIN32_LEAN_AND_MEAN
1116 #endif
1117 #include <windows.h>
1118 #ifdef HAVE_WINSOCK2_H
1119 #include <winsock2.h>
1120 #else
1121 #ifdef HAVE_WINSOCK_H
1122 #include <winsock.h>
1123 #endif
1124 #endif
1125 #endif
1126 #ifdef HAVE_SYS_TYPES_H
1127 #include <sys/types.h>
1128 #endif
1129 #ifdef HAVE_SYS_TIME_H
1130 #include <sys/time.h>
1131 #ifdef TIME_WITH_SYS_TIME
1132 #include <time.h>
1133 #endif
1134 #else
1135 #ifdef HAVE_TIME_H
1136 #include <time.h>
1137 #endif
1138 #endif
1139       ]],[[
1140         struct timeval ts;
1141         ts.tv_sec  = 0;
1142         ts.tv_usec = 0;
1143       ]])
1144     ],[
1145       ac_cv_struct_timeval="yes"
1146     ],[
1147       ac_cv_struct_timeval="no"
1148     ])
1149   ])
1150   case "$ac_cv_struct_timeval" in
1151     yes)
1152       AC_DEFINE_UNQUOTED(HAVE_STRUCT_TIMEVAL, 1,
1153         [Define to 1 if you have the timeval struct.])
1154       ;;
1155   esac
1156 ]) # AC_DEFUN
1157
1158
1159 dnl TYPE_SIG_ATOMIC_T
1160 dnl -------------------------------------------------
1161 dnl Check if the sig_atomic_t type is available, and
1162 dnl verify if it is already defined as volatile.
1163
1164 AC_DEFUN([TYPE_SIG_ATOMIC_T], [
1165   AC_CHECK_HEADERS(signal.h)
1166   AC_CHECK_TYPE([sig_atomic_t],[
1167     AC_DEFINE(HAVE_SIG_ATOMIC_T, 1,
1168       [Define to 1 if sig_atomic_t is an available typedef.])
1169   ], ,[
1170 #ifdef HAVE_SIGNAL_H
1171 #include <signal.h>
1172 #endif
1173   ])
1174   case "$ac_cv_type_sig_atomic_t" in
1175     yes)
1176       #
1177       AC_MSG_CHECKING([if sig_atomic_t is already defined as volatile])
1178       AC_LINK_IFELSE([
1179         AC_LANG_PROGRAM([[
1180 #ifdef HAVE_SIGNAL_H
1181 #include <signal.h>
1182 #endif
1183         ]],[[
1184           static volatile sig_atomic_t dummy = 0;
1185         ]])
1186       ],[
1187         AC_MSG_RESULT([no])
1188         ac_cv_sig_atomic_t_volatile="no"
1189       ],[
1190         AC_MSG_RESULT([yes])
1191         ac_cv_sig_atomic_t_volatile="yes"
1192       ])
1193       #
1194       if test "$ac_cv_sig_atomic_t_volatile" = "yes"; then
1195         AC_DEFINE(HAVE_SIG_ATOMIC_T_VOLATILE, 1,
1196           [Define to 1 if sig_atomic_t is already defined as volatile.])
1197       fi
1198       ;;
1199   esac
1200 ]) # AC_DEFUN
1201
1202
1203 dnl CURL_CHECK_NONBLOCKING_SOCKET
1204 dnl -------------------------------------------------
1205 dnl Check for how to set a socket to non-blocking state. There seems to exist
1206 dnl four known different ways, with the one used almost everywhere being POSIX
1207 dnl and XPG3, while the other different ways for different systems (old BSD,
1208 dnl Windows and Amiga).
1209 dnl
1210 dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
1211 dnl O_NONBLOCK define is found but does not work. This condition is attempted
1212 dnl to get caught in this script by using an excessive number of #ifdefs...
1213
1214 AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], [
1215   AC_MSG_CHECKING([non-blocking sockets style])
1216   nonblock="unknown"
1217   #
1218   AC_COMPILE_IFELSE([
1219     AC_LANG_PROGRAM([[
1220 /* headers for O_NONBLOCK test */
1221 #include <sys/types.h>
1222 #include <unistd.h>
1223 #include <fcntl.h>
1224 /* */
1225 #if defined(sun) || defined(__sun__) || \
1226     defined(__SUNPRO_C) || defined(__SUNPRO_CC)
1227 # if defined(__SVR4) || defined(__srv4__)
1228 #  define PLATFORM_SOLARIS
1229 # else
1230 #  define PLATFORM_SUNOS4
1231 # endif
1232 #endif
1233 #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
1234 # define PLATFORM_AIX_V3
1235 #endif
1236 /* */
1237 #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
1238 #error "O_NONBLOCK does not work on this platform"
1239 #endif
1240     ]],[[
1241       /* O_NONBLOCK source test */
1242       int socket;
1243       int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
1244     ]])
1245   ],[
1246     dnl the O_NONBLOCK test was fine
1247     nonblock="O_NONBLOCK"
1248     AC_DEFINE(HAVE_O_NONBLOCK, 1,
1249       [use O_NONBLOCK for non-blocking sockets])
1250   ])
1251   #
1252   if test "$nonblock" = "unknown"; then
1253     AC_COMPILE_IFELSE([
1254       AC_LANG_PROGRAM([[
1255 /* headers for FIONBIO test */
1256 #include <unistd.h>
1257 #include <stropts.h>
1258       ]],[[
1259         /* FIONBIO source test (old-style unix) */
1260         int socket;
1261         int flags = ioctl(socket, FIONBIO, &flags);
1262       ]])
1263     ],[
1264       dnl FIONBIO test was good
1265       nonblock="FIONBIO"
1266       AC_DEFINE(HAVE_FIONBIO, 1,
1267         [use FIONBIO for non-blocking sockets])
1268     ])
1269   fi
1270   #
1271   if test "$nonblock" = "unknown"; then
1272     AC_COMPILE_IFELSE([
1273       AC_LANG_PROGRAM([[
1274 /* headers for ioctlsocket test (Windows) */
1275 #undef inline
1276 #ifdef HAVE_WINDOWS_H
1277 #ifndef WIN32_LEAN_AND_MEAN
1278 #define WIN32_LEAN_AND_MEAN
1279 #endif
1280 #include <windows.h>
1281 #ifdef HAVE_WINSOCK2_H
1282 #include <winsock2.h>
1283 #else
1284 #ifdef HAVE_WINSOCK_H
1285 #include <winsock.h>
1286 #endif
1287 #endif
1288 #endif
1289       ]],[[
1290         /* ioctlsocket source code (Windows) */
1291         SOCKET sd;
1292         unsigned long flags = 0;
1293         sd = socket(0, 0, 0);
1294         ioctlsocket(sd, FIONBIO, &flags);
1295       ]])
1296     ],[
1297       dnl ioctlsocket test was good
1298       nonblock="ioctlsocket"
1299       AC_DEFINE(HAVE_IOCTLSOCKET, 1,
1300         [use ioctlsocket() for non-blocking sockets])
1301     ])
1302   fi
1303   #
1304   if test "$nonblock" = "unknown"; then
1305     AC_LINK_IFELSE([
1306       AC_LANG_PROGRAM([[
1307 /* headers for IoctlSocket test (Amiga?) */
1308 #include <sys/ioctl.h>
1309       ]],[[
1310         /* IoctlSocket source code (Amiga?) */
1311         int socket;
1312         int flags = IoctlSocket(socket, FIONBIO, (long)1);
1313       ]])
1314     ],[
1315       dnl Ioctlsocket test was good
1316       nonblock="IoctlSocket"
1317       AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1,
1318         [use Ioctlsocket() for non-blocking sockets])
1319     ])
1320   fi
1321   #
1322   if test "$nonblock" = "unknown"; then
1323     AC_COMPILE_IFELSE([
1324       AC_LANG_PROGRAM([[
1325 /* headers for SO_NONBLOCK test (BeOS) */
1326 #include <socket.h>
1327       ]],[[
1328         /* SO_NONBLOCK source code (BeOS) */
1329         long b = 1;
1330         int socket;
1331         int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
1332       ]])
1333     ],[
1334       dnl the SO_NONBLOCK test was good
1335       nonblock="SO_NONBLOCK"
1336       AC_DEFINE(HAVE_SO_NONBLOCK, 1,
1337         [use SO_NONBLOCK for non-blocking sockets])
1338     ])
1339   fi
1340   #
1341   AC_MSG_RESULT($nonblock)
1342   #
1343   if test "$nonblock" = "unknown"; then
1344     AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1,
1345       [disabled non-blocking sockets])
1346     AC_MSG_WARN([non-block sockets disabled])
1347   fi
1348 ])
1349
1350
1351 dnl TYPE_IN_ADDR_T
1352 dnl -------------------------------------------------
1353 dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
1354 dnl and a few other things.
1355
1356 AC_DEFUN([TYPE_IN_ADDR_T], [
1357   AC_CHECK_TYPE([in_addr_t], ,[
1358     dnl in_addr_t not available
1359     AC_CACHE_CHECK([for in_addr_t equivalent],
1360       [curl_cv_in_addr_t_equiv], [
1361       curl_cv_in_addr_t_equiv="unknown"
1362       for t in "unsigned long" int size_t unsigned long; do
1363         if test "$curl_cv_in_addr_t_equiv" = "unknown"; then
1364           AC_LINK_IFELSE([
1365             AC_LANG_PROGRAM([[
1366 #undef inline
1367 #ifdef HAVE_WINDOWS_H
1368 #ifndef WIN32_LEAN_AND_MEAN
1369 #define WIN32_LEAN_AND_MEAN
1370 #endif
1371 #include <windows.h>
1372 #ifdef HAVE_WINSOCK2_H
1373 #include <winsock2.h>
1374 #else
1375 #ifdef HAVE_WINSOCK_H
1376 #include <winsock.h>
1377 #endif
1378 #endif
1379 #else
1380 #ifdef HAVE_SYS_TYPES_H
1381 #include <sys/types.h>
1382 #endif
1383 #ifdef HAVE_SYS_SOCKET_H
1384 #include <sys/socket.h>
1385 #endif
1386 #ifdef HAVE_NETINET_IN_H
1387 #include <netinet/in.h>
1388 #endif
1389 #ifdef HAVE_ARPA_INET_H
1390 #include <arpa/inet.h>
1391 #endif
1392 #endif
1393             ]],[[
1394               $t data = inet_addr ("1.2.3.4");
1395             ]])
1396           ],[
1397             curl_cv_in_addr_t_equiv="$t"
1398           ])
1399         fi
1400       done
1401     ])
1402     case "$curl_cv_in_addr_t_equiv" in
1403       unknown)
1404         AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
1405         ;;
1406       *)
1407         AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
1408           [Type to use in place of in_addr_t when system does not provide it.])
1409         ;;
1410     esac
1411   ],[
1412 #undef inline
1413 #ifdef HAVE_WINDOWS_H
1414 #ifndef WIN32_LEAN_AND_MEAN
1415 #define WIN32_LEAN_AND_MEAN
1416 #endif
1417 #include <windows.h>
1418 #ifdef HAVE_WINSOCK2_H
1419 #include <winsock2.h>
1420 #else
1421 #ifdef HAVE_WINSOCK_H
1422 #include <winsock.h>
1423 #endif
1424 #endif
1425 #else
1426 #ifdef HAVE_SYS_TYPES_H
1427 #include <sys/types.h>
1428 #endif
1429 #ifdef HAVE_SYS_SOCKET_H
1430 #include <sys/socket.h>
1431 #endif
1432 #ifdef HAVE_NETINET_IN_H
1433 #include <netinet/in.h>
1434 #endif
1435 #ifdef HAVE_ARPA_INET_H
1436 #include <arpa/inet.h>
1437 #endif
1438 #endif
1439   ]) dnl AC_CHECK_TYPE
1440 ]) dnl AC_DEFUN
1441
1442
1443 dnl CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC
1444 dnl -------------------------------------------------
1445 dnl Check if monotonic clock_gettime is available.
1446
1447 AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
1448   AC_REQUIRE([AC_HEADER_TIME])dnl
1449   AC_CHECK_HEADERS(sys/types.h unistd.h sys/time.h time.h)
1450   AC_MSG_CHECKING([for monotonic clock_gettime])
1451   AC_COMPILE_IFELSE([
1452     AC_LANG_PROGRAM([[
1453 #ifdef HAVE_SYS_TYPES_H
1454 #include <sys/types.h>
1455 #endif
1456 #ifdef HAVE_UNISTD_H
1457 #include <unistd.h>
1458 #endif
1459 #ifdef HAVE_SYS_TIME_H
1460 #include <sys/time.h>
1461 #ifdef TIME_WITH_SYS_TIME
1462 #include <time.h>
1463 #endif
1464 #else
1465 #ifdef HAVE_TIME_H
1466 #include <time.h>
1467 #endif
1468 #endif
1469     ]],[[
1470 #if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0)
1471       /*
1472       The monotonic clock will not be used unless the feature test macro is
1473       defined with a value greater than zero indicating _always_ supported.
1474       */
1475       struct timespec ts;
1476       (void)clock_gettime(CLOCK_MONOTONIC, &ts);
1477 #else
1478       HAVE_CLOCK_GETTIME_MONOTONIC shall not be defined.
1479 #endif
1480     ]])
1481   ],[
1482     AC_MSG_RESULT([yes])
1483     ac_cv_func_clock_gettime="yes"
1484   ],[
1485     AC_MSG_RESULT([no])
1486     ac_cv_func_clock_gettime="no"
1487   ])
1488   dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally
1489   dnl postponed until library linking checks for clock_gettime pass.
1490 ]) dnl AC_DEFUN
1491
1492
1493 dnl CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC
1494 dnl -------------------------------------------------
1495 dnl If monotonic clock_gettime is available then,
1496 dnl check and prepended to LIBS any needed libraries.
1497
1498 AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
1499   AC_REQUIRE([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC])dnl
1500   #
1501   if test "$ac_cv_func_clock_gettime" = "yes"; then
1502     #
1503     AC_MSG_CHECKING([for clock_gettime in libraries])
1504     #
1505     curl_cv_save_LIBS="$LIBS"
1506     curl_cv_gclk_LIBS="unknown"
1507     #
1508     for x_xlibs in '' '-lrt' '-lposix4' ; do
1509       if test "$curl_cv_gclk_LIBS" = "unknown"; then
1510         if test -z "$x_xlibs"; then
1511           LIBS="$curl_cv_save_LIBS"
1512         else
1513           LIBS="$x_xlibs $curl_cv_save_LIBS"
1514         fi
1515         AC_LINK_IFELSE([
1516           AC_LANG_PROGRAM([[
1517 #ifdef HAVE_SYS_TYPES_H
1518 #include <sys/types.h>
1519 #endif
1520 #ifdef HAVE_UNISTD_H
1521 #include <unistd.h>
1522 #endif
1523 #ifdef HAVE_SYS_TIME_H
1524 #include <sys/time.h>
1525 #ifdef TIME_WITH_SYS_TIME
1526 #include <time.h>
1527 #endif
1528 #else
1529 #ifdef HAVE_TIME_H
1530 #include <time.h>
1531 #endif
1532 #endif
1533           ]],[[
1534             struct timespec ts;
1535             (void)clock_gettime(CLOCK_MONOTONIC, &ts);
1536           ]])
1537         ],[
1538           curl_cv_gclk_LIBS="$x_xlibs"
1539         ])
1540       fi
1541     done
1542     #
1543     LIBS="$curl_cv_save_LIBS"
1544     #
1545     case X-"$curl_cv_gclk_LIBS" in
1546       X-unknown)
1547         AC_MSG_RESULT([cannot find clock_gettime])
1548         AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined])
1549         ac_cv_func_clock_gettime="no"
1550         ;;
1551       X-)
1552         AC_MSG_RESULT([no additional lib required])
1553         ac_cv_func_clock_gettime="yes"
1554         ;;
1555       *)
1556         if test -z "$curl_cv_save_LIBS"; then
1557           LIBS="$curl_cv_gclk_LIBS"
1558         else
1559           LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS"
1560         fi
1561         AC_MSG_RESULT([$curl_cv_gclk_LIBS])
1562         ac_cv_func_clock_gettime="yes"
1563         ;;
1564     esac
1565     #
1566     dnl only do runtime verification when not cross-compiling
1567     if test "x$cross_compiling" != "xyes" &&
1568       test "$ac_cv_func_clock_gettime" = "yes"; then
1569       AC_MSG_CHECKING([if monotonic clock_gettime works])
1570       AC_RUN_IFELSE([
1571         AC_LANG_PROGRAM([[
1572 #ifdef HAVE_SYS_TYPES_H
1573 #include <sys/types.h>
1574 #endif
1575 #ifdef HAVE_UNISTD_H
1576 #include <unistd.h>
1577 #endif
1578 #ifdef HAVE_SYS_TIME_H
1579 #include <sys/time.h>
1580 #ifdef TIME_WITH_SYS_TIME
1581 #include <time.h>
1582 #endif
1583 #else
1584 #ifdef HAVE_TIME_H
1585 #include <time.h>
1586 #endif
1587 #endif
1588         ]],[[
1589 #if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0)
1590           struct timespec ts;
1591           if (0 == clock_gettime(CLOCK_MONOTONIC, &ts))
1592             exit(0);
1593 #endif
1594           exit(1);
1595         ]])
1596       ],[
1597         AC_MSG_RESULT([yes])
1598       ],[
1599         AC_MSG_RESULT([no])
1600         AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined])
1601         ac_cv_func_clock_gettime="no"
1602         LIBS="$curl_cv_save_LIBS"
1603       ])
1604     fi
1605     #
1606     case "$ac_cv_func_clock_gettime" in
1607       yes)
1608         AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME_MONOTONIC, 1,
1609           [Define to 1 if you have the clock_gettime function and monotonic timer.])
1610         ;;
1611     esac
1612     #
1613   fi
1614   #
1615 ]) dnl AC_DEFUN
1616
1617
1618 dnl **********************************************************************
1619 dnl CURL_DETECT_ICC ([ACTION-IF-YES])
1620 dnl
1621 dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
1622 dnl sets the $ICC variable to "yes" or "no"
1623 dnl **********************************************************************
1624 AC_DEFUN([CURL_DETECT_ICC],
1625 [
1626     ICC="no"
1627     AC_MSG_CHECKING([for icc in use])
1628     if test "$GCC" = "yes"; then
1629        dnl check if this is icc acting as gcc in disguise
1630        AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
1631          dnl action if the text is found, this it has not been replaced by the
1632          dnl cpp
1633          ICC="no",
1634          dnl the text was not found, it was replaced by the cpp
1635          ICC="yes"
1636          AC_MSG_RESULT([yes])
1637          [$1]
1638        )
1639     fi
1640     if test "$ICC" = "no"; then
1641         # this is not ICC
1642         AC_MSG_RESULT([no])
1643     fi
1644 ])
1645
1646 dnl We create a function for detecting which compiler we use and then set as
1647 dnl pendantic compiler options as possible for that particular compiler. The
1648 dnl options are only used for debug-builds.
1649
1650 dnl This is a copy of the original found in curl's configure script. Don't
1651 dnl modify this one, edit the one in curl and copy it back here when that one
1652 dnl is changed.
1653
1654 AC_DEFUN([CURL_CC_DEBUG_OPTS],
1655 [
1656     if test "z$ICC" = "z"; then
1657       CURL_DETECT_ICC
1658     fi
1659
1660     if test "$GCC" = "yes"; then
1661
1662        dnl figure out gcc version!
1663        AC_MSG_CHECKING([gcc version])
1664        gccver=`$CC -dumpversion`
1665        num1=`echo $gccver | cut -d . -f1`
1666        num2=`echo $gccver | cut -d . -f2`
1667        gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
1668        AC_MSG_RESULT($gccver)
1669
1670        if test "$ICC" = "yes"; then
1671          dnl this is icc, not gcc.
1672
1673          dnl ICC warnings we ignore:
1674          dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
1675          dnl   "invalid format string conversion"
1676          dnl * 279 warns on static conditions in while expressions
1677          dnl * 981 warns on "operands are evaluated in unspecified order"
1678          dnl * 1418 "external definition with no prior declaration"
1679          dnl * 1419 warns on "external declaration in primary source file"
1680          dnl   which we know and do on purpose.
1681
1682          WARN="-wd279,269,981,1418,1419"
1683
1684          if test "$gccnum" -gt "600"; then
1685             dnl icc 6.0 and older doesn't have the -Wall flag
1686             WARN="-Wall $WARN"
1687          fi
1688        else dnl $ICC = yes
1689          dnl this is a set of options we believe *ALL* gcc versions support:
1690          WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
1691
1692          dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
1693
1694          if test "$gccnum" -ge "207"; then
1695            dnl gcc 2.7 or later
1696            WARN="$WARN -Wmissing-declarations"
1697          fi
1698
1699          if test "$gccnum" -gt "295"; then
1700            dnl only if the compiler is newer than 2.95 since we got lots of
1701            dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
1702            dnl gcc 2.95.4 on FreeBSD 4.9!
1703            WARN="$WARN -Wundef -Wno-long-long -Wsign-compare -Wshadow -Wno-multichar"
1704          fi
1705
1706          if test "$gccnum" -ge "296"; then
1707            dnl gcc 2.96 or later
1708            WARN="$WARN -Wfloat-equal"
1709          fi
1710
1711          if test "$gccnum" -gt "296"; then
1712            dnl this option does not exist in 2.96
1713            WARN="$WARN -Wno-format-nonliteral"
1714          fi
1715
1716          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
1717          dnl on i686-Linux as it gives us heaps with false positives.
1718          dnl Also, on gcc 4.0.X it is totally unbearable and complains all
1719          dnl over making it unusable for generic purposes. Let's not use it.
1720
1721          if test "$gccnum" -ge "303"; then
1722            dnl gcc 3.3 and later
1723            WARN="$WARN -Wendif-labels -Wstrict-prototypes"
1724          fi
1725
1726          if test "$gccnum" -ge "304"; then
1727            # try these on gcc 3.4
1728            WARN="$WARN -Wdeclaration-after-statement"
1729          fi
1730
1731          for flag in $CPPFLAGS; do
1732            case "$flag" in
1733             -I*)
1734               dnl Include path, provide a -isystem option for the same dir
1735               dnl to prevent warnings in those dirs. The -isystem was not very
1736               dnl reliable on earlier gcc versions.
1737               add=`echo $flag | sed 's/^-I/-isystem /g'`
1738               WARN="$WARN $add"
1739               ;;
1740            esac
1741          done
1742
1743        fi dnl $ICC = no
1744
1745        CFLAGS="$CFLAGS $WARN"
1746
1747       AC_MSG_NOTICE([Added this set of compiler options: $WARN])
1748
1749     else dnl $GCC = yes
1750
1751       AC_MSG_NOTICE([Added no extra compiler options])
1752
1753     fi dnl $GCC = yes
1754
1755     dnl strip off optimizer flags
1756     NEWFLAGS=""
1757     for flag in $CFLAGS; do
1758       case "$flag" in
1759       -O*)
1760         dnl echo "cut off $flag"
1761         ;;
1762       *)
1763         NEWFLAGS="$NEWFLAGS $flag"
1764         ;;
1765       esac
1766     done
1767     CFLAGS=$NEWFLAGS
1768
1769 ]) dnl end of AC_DEFUN()
1770
1771
1772 dnl This macro determines if the specified struct exists in the specified file
1773 dnl Syntax:
1774 dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found])
1775
1776 AC_DEFUN([CARES_CHECK_STRUCT], [
1777   AC_MSG_CHECKING([for struct $2])
1778   AC_TRY_COMPILE([$1], 
1779     [
1780       struct $2 struct_instance;
1781     ], ac_struct="yes", ac_found="no")
1782   if test "$ac_struct" = "yes" ; then
1783     AC_MSG_RESULT(yes)
1784     $3
1785   else
1786     AC_MSG_RESULT(no)
1787     $4
1788   fi
1789 ])
1790
1791 dnl This macro determines if the specified constant exists in the specified file
1792 dnl Syntax:
1793 dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
1794
1795 AC_DEFUN([CARES_CHECK_CONSTANT], [
1796   AC_MSG_CHECKING([for $2])
1797   AC_EGREP_CPP(VARIABLEWASDEFINED,
1798    [
1799       $1
1800
1801       #ifdef $2
1802         VARIABLEWASDEFINED
1803       #else
1804         NJET
1805       #endif
1806     ], ac_constant="yes", ac_constant="no"
1807   )
1808   if test "$ac_constant" = "yes" ; then
1809     AC_MSG_RESULT(yes)
1810     $3
1811   else
1812     AC_MSG_RESULT(no)
1813     $4
1814   fi
1815 ])
1816
1817
1818 dnl CARES_CHECK_GETSERVBYPORT_R
1819 dnl -------------------------------------------------
1820 dnl Test if the getservbyport_r function is available,
1821 dnl and find out how many parameters it takes.
1822
1823 AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [
1824   AC_MSG_CHECKING([how many arguments getservbyport_r takes])
1825   ac_func_getservbyport_r="unknown"
1826
1827   AC_LINK_IFELSE([
1828     AC_LANG_PROGRAM([[
1829 #include <netdb.h>
1830     ]],[[
1831       int p1, p5;
1832       char *p2, p4[4096];
1833       struct servent *p3, *p6;
1834       getservbyport_r(p1, p2, p3, p4, p5, &p6);
1835     ]])
1836   ],[
1837     ac_func_getservbyport_r="6"
1838   ])
1839
1840   if test "$ac_func_getservbyport_r" = "unknown"; then
1841     AC_LINK_IFELSE([
1842       AC_LANG_PROGRAM([[
1843 #include <netdb.h>
1844       ]],[[
1845         int p1, p5;
1846         char *p2, p4[4096];
1847         struct servent *p3;
1848         getservbyport_r(p1, p2, p3, p4, p5);
1849       ]])
1850     ],[
1851       ac_func_getservbyport_r="5"
1852     ])
1853   fi
1854
1855   if test "$ac_func_getservbyport_r" = "unknown"; then
1856     AC_LINK_IFELSE([
1857       AC_LANG_PROGRAM([[
1858 #include <netdb.h>
1859       ]],[[
1860         int p1;
1861         char *p2;
1862         struct servent *p3;
1863         struct servent_data p4;
1864         getservbyport_r(p1, p2, p3, &p4);
1865       ]])
1866     ],[
1867       ac_func_getservbyport_r="4"
1868     ])
1869   fi
1870
1871   if test "$ac_func_getservbyport_r" = "unknown"; then
1872     AC_MSG_RESULT([not found])
1873   else
1874     AC_MSG_RESULT($ac_func_getservbyport_r)
1875     AC_DEFINE(HAVE_GETSERVBYPORT_R, 1,
1876       [Specifies whether getservbyport_r is present])
1877     AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $ac_func_getservbyport_r,
1878       [Specifies the number of arguments to getservbyport_r])
1879     if test "$ac_func_getservbyport_r" = "4" ; then
1880       AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data),
1881         [Specifies the size of the buffer to pass to getservbyport_r])
1882     else
1883       AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096,
1884         [Specifies the size of the buffer to pass to getservbyport_r])
1885     fi
1886   fi
1887 ])
1888