]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/sntp/m4/ntp_libntp.m4
Fix ntp multiple vulnerabilities.
[FreeBSD/releng/10.2.git] / contrib / ntp / sntp / m4 / ntp_libntp.m4
1 dnl ######################################################################
2 dnl Common m4sh code for libntp and clients
3 dnl
4 dnl Any configure tests which libntp or libisc code depends upon should
5 dnl be here or in another m4 macro used by the top-level and sntp
6 dnl configure.ac files, so that libntp can be moved into the sntp
7 dnl subpackage while retaining access to such test results.
8 dnl
9 AC_DEFUN([NTP_LIBNTP], [
10
11 AC_REQUIRE([NTP_CROSSCOMPILE])
12
13 # HMS: Save $LIBS and empty it.
14 # any LIBS we add here should go in to LDADD_LIBNTP
15 AC_SUBST([LDADD_LIBNTP])
16 __LIBS=$LIBS
17 LIBS=
18
19 dnl The contents of NTP_PROG_CC used to be here...
20
21 AC_PROG_INSTALL
22 # [Bug 2332] because we need to know if we are using GNU ld...
23 LT_PATH_LD
24
25 NTP_DIR_SEP
26 NTP_LINEEDITLIBS
27 NTP_LIB_M
28
29 AC_FUNC_FORK
30 AC_FUNC_ALLOCA
31 AC_FUNC_STRERROR_R
32
33 ac_busted_vpath_in_make=no
34 case "$build" in
35  *-*-irix6.1*)  # 64 bit only
36     # busted vpath?
37     ;;
38  *-*-irix6*)    # 6.2 (and later?)
39     ac_busted_vpath_in_make=yes
40     ;;
41  *-*-solaris2.5.1)
42     ac_busted_vpath_in_make=yes
43     ;;
44  *-*-unicosmp*)
45     ac_busted_vpath_in_make=yes
46     ;;
47 esac
48
49 case "$ac_busted_vpath_in_make$srcdir" in
50  yes.|no*)
51     ;;
52  *) case "`${MAKE-make} -v -f /dev/null 2>/dev/null | grep 'GNU Make'`" in
53      '')
54         AC_MSG_ERROR([building outside of the main directory requires GNU make])
55     esac
56     ;;
57 esac
58
59 case "$host" in
60  *-*-aix4*)
61         # Bug 2516:
62         # Was *-*-aix[[4-9]]*
63         # XXX only verified thru AIX6.  But...
64         # Ken Link says this is fine for AIX 5.3 and 7.1, and sees no reason
65         # that this support would be in 5.3, removed in 6, and added back.
66         #
67         # (prr) aix 4.1 doesn't have clock_settime, but in aix 4.3 it's a stub
68         # (returning ENOSYS).  I didn't check 4.2.  If, in the future,
69         # IBM pulls its thumbs out long enough to implement clock_settime,
70         # this conditional will need to change.  Maybe use AC_TRY_RUN
71         # instead to try to set the time to itself and check errno.
72     ;;
73  *)
74     HMS_SEARCH_LIBS([LDADD_LIBNTP], [clock_gettime], [rt])
75     AC_CHECK_FUNCS([clock_getres clock_gettime clock_settime])
76     ;;
77 esac
78
79 AC_CHECK_FUNCS([getclock stime timegm strlcpy strlcat])
80
81 # Bug 2713
82 LDADD_LIBUTIL=
83 AC_SUBST([LDADD_LIBUTIL])
84 HMS_SEARCH_LIBS([LDADD_LIBUTIL], [snprintb], [util],
85                 [AC_DEFINE([USE_SNPRINTB], 1, [OK to use snprintb()?])])
86
87 dnl  HP-UX 11.31 on HPPA has a net/if.h that can't be compiled with gcc4
88 dnl  due to an incomplete type (a union) mpinfou used in an array.  gcc3
89 dnl  compiles it without complaint.  The mpinfou union is defined later
90 dnl  in the resulting preprocessed source than the spu_info array in
91 dnl  /usr/include/machine/sys/getppdp.h:
92 dnl     extern union mpinfou spu_info[];
93 dnl  triggering the error.  Our strategy is on HP-UX only, test compile
94 dnl  net/if.h.  If that fails, try adding a duplicate definition of
95 dnl  mpinfou, and if that helps add it to confdefs.h (used for further
96 dnl  configure tests) and config.h.
97 #
98 AC_CHECK_HEADERS([errno.h sys/socket.h sys/types.h time.h])
99 AC_CHECK_HEADERS([net/if.h], [], [], [
100     #ifdef HAVE_SYS_SOCKET_H
101     # include <sys/socket.h>
102     #endif
103 ])
104 case "$host" in
105  *-hp-hpux*)
106     AC_CACHE_CHECK(
107         [if net/if.h requires mpinfou predeclaration],
108         [ntp_cv_predecl_mpinfou],
109         [
110             np_cv_predecl_mpinfou=no
111             case "$ac_cv_header_net_if_h" in
112              no)
113                 AC_COMPILE_IFELSE(
114                     [AC_LANG_PROGRAM(
115                         [[
116                             typedef union mpinfou {
117                                     struct pdk_mpinfo *pdkptr;
118                                     struct mpinfo *pikptr;
119                             } mpinfou_t;
120                             #ifdef HAVE_SYS_SOCKET_H
121                             # include <sys/socket.h>
122                             #endif
123                             #include <net/if.h>
124                         ]],
125                         [[
126                         ]]
127                     )],
128                     [
129                         ntp_cv_predecl_mpinfou=yes
130                         ac_cv_header_net_if_h=yes
131                     ]
132                 )
133             esac
134         ]
135     )
136     case "$ntp_cv_predecl_mpinfou" in
137      yes)
138         cat >>confdefs.h <<_ACEOF
139 #ifndef MPINFOU_PREDECLARED
140 # define MPINFOU_PREDECLARED
141 typedef union mpinfou {
142         struct pdk_mpinfo *pdkptr;
143         struct mpinfo *pikptr;
144 } mpinfou_t;
145 #endif
146 _ACEOF
147         AH_BOTTOM([
148 #ifndef MPINFOU_PREDECLARED
149 # define MPINFOU_PREDECLARED
150 typedef union mpinfou {
151         struct pdk_mpinfo *pdkptr;
152         struct mpinfo *pikptr;
153 } mpinfou_t;
154 #endif
155 ])
156     esac
157 esac
158
159 case "$host" in
160  *-linux*)
161     AC_CHECK_HEADERS([linux/if_addr.h], [], [], [
162         #ifdef HAVE_SYS_SOCKET_H
163         # include <sys/socket.h>
164         #endif
165     ])
166     AC_DEFINE([NEED_EARLY_FORK], [1], [having to fork the DNS worker early when doing chroot?])
167 esac
168
169 AC_CHECK_HEADERS([arpa/nameser.h sys/param.h sys/time.h sys/timers.h])
170 # sys/sysctl.h depends on sys/param.h on OpenBSD - Bug 1576
171 AC_CHECK_HEADERS([sys/sysctl.h], [], [], [
172     #if defined HAVE_SYS_PARAM_H
173     # include <sys/param.h>
174     #endif
175 ])
176 AC_CHECK_HEADERS([netinet/in_system.h netinet/in_systm.h netinet/in.h])
177
178 AC_CHECK_HEADERS([resolv.h], [], [], [
179     #ifdef HAVE_SYS_TYPES_H
180     # include <sys/types.h>
181     #endif
182     #ifdef HAVE_NETINET_IN_H
183     # include <netinet/in.h>
184     #endif
185     #ifdef HAVE_ARPA_NAMESER_H
186     # include <arpa/nameser.h>
187     #endif
188 ])
189
190 AC_CHECK_HEADERS([net/if_var.h], [], [], [
191     #if HAVE_SYS_TYPES_H
192     # include <sys/types.h>
193     #endif
194     #ifdef HAVE_SYS_SOCKET_H
195     # include <sys/socket.h>
196     #endif
197     #ifdef HAVE_NETINET_IN_H
198     # include <netinet/in.h>
199     #endif
200     #ifdef HAVE_NET_IF_H
201     # include <net/if.h>
202     #endif
203 ])
204
205 AC_CHECK_HEADERS([netinet/ip.h netinet/in_var.h], [], [], [
206     #ifdef HAVE_SYS_TYPES_H
207     # include <sys/types.h>
208     #endif
209     #ifdef HAVE_SYS_SOCKET_H
210     # include <sys/socket.h>
211     #endif
212     #ifdef HAVE_NET_IF_H
213     # include <net/if.h>
214     #endif
215     #ifdef HAVE_NETINET_IN_H
216     # include <netinet/in.h>
217     #endif
218     #ifdef HAVE_NET_IF_VAR_H
219     # include <net/if_var.h>
220     #endif
221     #ifdef HAVE_NETINET_IN_SYSTM_H
222     # include <netinet/in_systm.h>
223     #endif
224 ])
225
226 # HMS: Do we need to check for -lsocket before or after these tests?
227 HMS_SEARCH_LIBS([LDADD_LIBNTP], [inet_pton], [nsl])
228 HMS_SEARCH_LIBS([LDADD_LIBNTP], [inet_ntop], [resolv], , , [-lnsl])
229
230 # [Bug 1628] On Solaris, we need -lxnet -lsocket.  Generalize this to
231 # avoid keying on the OS name:  If we find socket functions in
232 # libsocket, next try for them in libxnet without libsocket, if found,
233 # list both.  If we simply tested libxnet first, we would find the
234 # functions there and never add libsocket.  See also [Bug 660]
235 # http://bugs.ntp.org/show_bug.cgi?id=660#c9
236 saved_LIBS=$LIBS
237 HMS_SEARCH_LIBS([LDADD_LIBNTP], [setsockopt], [socket])
238 case "$ac_cv_search_setsockopt" in
239  -lsocket)
240     LIBS="$saved_LIBS"
241     HMS_SEARCH_LIBS([LDADD_LIBNTP], [getsockopt], [xnet])
242     # XXX Possible trouble here - reading the comments above and looking at the
243     # code below I wonder if we'll add -lxnet when we don't need it.
244     # Also, do we need to add -lxnet to LDADD_LIBNTP, or perhaps see if it's
245     # there when it is not needed?
246     case "$ac_cv_search_getsockopt" in
247      -lxnet)
248         LIBS="-lxnet -lsocket $saved_LIBS"
249         ;;
250      *) LIBS="-lsocket $saved_LIBS"
251         ;;
252     esac
253     ;;
254 esac
255 AS_UNSET([saved_LIBS])
256
257 # Bug 2427 - look for recvmsg here.
258 AC_CHECK_FUNCS([recvmsg])
259
260 AC_C_INLINE
261
262 case "$ac_cv_c_inline" in
263  '')
264     ;;
265  *)
266     AC_DEFINE([HAVE_INLINE], [1], [inline keyword or macro available])
267     AC_SUBST([HAVE_INLINE])
268 esac
269
270 AC_HEADER_TIME
271 AC_CHECK_SIZEOF([time_t])
272 AC_C_CHAR_UNSIGNED              dnl CROSS_COMPILE?
273 AC_CHECK_SIZEOF([signed char])
274 AC_CHECK_TYPES([s_char, long long])
275 AC_CHECK_SIZEOF([short])
276 AC_CHECK_SIZEOF([int])
277 AC_CHECK_SIZEOF([long])
278
279 case "$ac_cv_type_long_long" in
280  no)
281     ;;
282  *)
283     AC_CHECK_SIZEOF([long long])
284     ;;
285 esac
286
287 case "$ac_cv_c_char_unsigned$ac_cv_sizeof_signed_char$ac_cv_type_s_char" in
288  *yes)
289     # We have a typedef for s_char.  Might as well believe it...
290     ;;
291  no0no)
292     # We have signed chars, can't say 'signed char', no s_char typedef.
293     AC_DEFINE([NEED_S_CHAR_TYPEDEF], [1],
294         [Do we need an s_char typedef?])
295     ;;
296  no1no)
297     # We have signed chars, can say 'signed char', no s_char typedef.
298     AC_DEFINE([NEED_S_CHAR_TYPEDEF], [1],
299         [Do we need an s_char typedef?])
300     ;;
301  yes0no)
302     # We have unsigned chars, can't say 'signed char', no s_char typedef.
303     AC_MSG_ERROR([No way to specify a signed character!])
304     ;;
305  yes1no)
306     # We have unsigned chars, can say 'signed char', no s_char typedef.
307     AC_DEFINE([NEED_S_CHAR_TYPEDEF], [1],
308         [Do we need an s_char typedef?])
309     ;;
310 esac
311
312 AC_TYPE_UID_T
313
314 m4_divert_text([HELP_ENABLE],
315 [AS_HELP_STRING([defaults:],
316     [+ yes, - no, s system-specific])])
317
318 NTP_DEBUG
319
320 # check if we can compile with pthreads
321 AC_CHECK_HEADERS([semaphore.h])
322 AC_CHECK_FUNCS([socketpair])
323 AC_ARG_ENABLE(
324     [thread-support],
325     [AS_HELP_STRING([--enable-thread-support],
326                     [s use threads (+ if available)])],
327     [],
328     [enable_thread_support=yes]
329     )
330 have_pthreads=no
331 case "$enable_thread_support" in
332  no) ;;
333  *)
334     ol_found_pthreads=no
335     OL_THREAD_CHECK([ol_found_pthreads=yes])
336     case "$ol_found_pthreads" in
337      yes)
338         saved_LIBS="$LIBS"
339         LIBS="$LTHREAD_LIBS $LIBS"
340         saved_CFLAGS="$CFLAGS"
341         CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
342         AC_CHECK_FUNCS([sem_timedwait])
343         LIBS="$saved_LIBS"
344         AS_UNSET([saved_LIBS])
345         CFLAGS="$saved_CFLAGS"
346         AS_UNSET([saved_CFLAGS])
347         case "$ac_cv_func_sem_timedwait" in
348          yes)
349             PTHREAD_LIBS="$LTHREAD_LIBS"
350             have_pthreads=yes
351         esac
352     esac
353 esac
354 AC_SUBST([PTHREAD_LIBS])
355 case "$have_pthreads" in
356  yes)
357     CFLAGS_NTP="$CFLAGS_NTP $PTHREAD_CFLAGS"
358     saved_LIBS="$LIBS"
359     LIBS="$LTHREAD_LIBS $LIBS"
360     saved_CFLAGS="$CFLAGS"
361     CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
362     AC_CHECK_SIZEOF(
363         [pthread_t],
364         ,
365         [
366             AC_INCLUDES_DEFAULT()
367             #include <pthread.h>
368         ]
369     )
370     LIBISC_PTHREADS_NOTHREADS=pthreads
371     AC_DEFINE([ISC_PLATFORM_USETHREADS], [1],
372               [enable libisc thread support?])
373     #
374     # We'd like to use sigwait() too
375     #
376     AC_CHECK_FUNC(
377         [sigwait],
378         [have_sigwait=yes],
379         [AC_CHECK_LIB(
380             [c],
381             [sigwait],
382             [have_sigwait=yes],
383             [AC_CHECK_LIB(
384                 [pthread],
385                 [sigwait],
386                 [have_sigwait=yes],
387                 [AC_CHECK_LIB(
388                     [pthread],
389                     [_Psigwait],
390                     [have_sigwait=yes],
391                     [have_sigwait=no]
392                 )]
393             )]
394         )]
395     )
396     case "$host:$have_sigwait" in
397      *-freebsd*:no)
398         AC_CHECK_LIB(
399             [c_r],
400             [sigwait],
401             [have_sigwait=yes]
402         )
403     esac
404     case "$have_sigwait" in
405      yes)
406         ac_cv_func_sigwait=yes
407         AC_DEFINE([HAVE_SIGWAIT], [1], [sigwait() available?])
408     esac
409
410     AC_CHECK_FUNCS([pthread_attr_getstacksize])
411     AC_CHECK_FUNCS([pthread_attr_setstacksize sysconf])
412
413     case "$host" in
414      *-freebsd5.[[012]]|*-freebsd5.[[012]].*)
415         ;;
416      *-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*|*-freebsd6.*)
417         AC_DEFINE([NEED_PTHREAD_SCOPE_SYSTEM], [1],
418                   [use PTHREAD_SCOPE_SYSTEM?])
419         ;;
420      *-bsdi3.*|*-bsdi4.0*)
421         AC_DEFINE([NEED_PTHREAD_INIT], [1], [pthread_init() required?])
422         ;;
423      *-linux*)
424         AC_DEFINE([HAVE_LINUXTHREADS], [1], [using Linux pthread?])
425         ;;
426      *-solaris*)
427         AC_DEFINE([_POSIX_PTHREAD_SEMANTICS], [1])
428         AC_CHECK_FUNCS([pthread_setconcurrency])
429         case "$ac_cv_func_pthread_setconcurrency" in
430          yes)
431             AC_DEFINE([CALL_PTHREAD_SETCONCURRENCY], [1],
432                       [why not HAVE_P_S?])
433         esac
434         ;;
435      *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
436         AC_DEFINE([HAVE_UNIXWARE_SIGWAIT], [1], [deviant sigwait?])
437         ;;
438     esac
439     hack_shutup_pthreadonceinit=no
440     case "$host" in
441      *-aix5.[[123]].*)
442         hack_shutup_pthreadonceinit=yes
443         ;;
444      *-solaris2.[[89]])
445         hack_shutup_pthreadonceinit=yes
446         ;;
447      *-solaris2.1[[0-9]])
448         AC_CACHE_CHECK(
449             [if extra braces are needed for PTHREAD_ONCE_INIT],
450             [ntp_cv_braces_around_pthread_once_init],
451             [AC_COMPILE_IFELSE(
452                 [AC_LANG_PROGRAM(
453                     [[
454                         #include <pthread.h>
455                     ]],
456                     [[
457                         static pthread_once_t once_test =
458                                                 PTHREAD_ONCE_INIT;
459                     ]]
460                 )],
461                 [ntp_cv_braces_around_pthread_once_init=no],
462                 [ntp_cv_braces_around_pthread_once_init=yes]
463             )]
464         )
465         case "$ntp_cv_braces_around_pthread_once_init" in
466          yes)
467             hack_shutup_pthreadonceinit=yes
468         esac
469         ;;
470     esac
471     case "$hack_shutup_pthreadonceinit" in
472      yes)
473         AC_DEFINE([ISC_PLATFORM_BRACEPTHREADONCEINIT], [1],
474                   [Enclose PTHREAD_ONCE_INIT in extra braces?])
475     esac
476     LIBS="$saved_LIBS"
477     AS_UNSET([saved_LIBS])
478     CFLAGS="$saved_CFLAGS"
479     AS_UNSET([saved_CFLAGS])
480     ;;
481  *)
482     LIBISC_PTHREADS_NOTHREADS=nothreads
483     ;;
484 esac
485 AC_SUBST([LIBISC_PTHREADS_NOTHREADS])
486 AM_CONDITIONAL([PTHREADS], [test "$have_pthreads" != "no"])
487
488 AC_DEFUN([NTP_BEFORE_HW_FUNC_VSNPRINTF], [
489     AC_BEFORE([$0], [HW_FUNC_VSNPRINTF])dnl
490     AC_BEFORE([$0], [HW_FUNC_SNPRINTF])dnl
491     AC_ARG_ENABLE(
492         [c99-snprintf],
493         [AS_HELP_STRING([--enable-c99-snprintf], [s force replacement])],
494         [force_c99_snprintf=$enableval],
495         [force_c99_snprintf=no]
496         )
497     case "$force_c99_snprintf" in
498      yes)
499         hw_force_rpl_snprintf=yes
500         hw_force_rpl_vsnprintf=yes
501     esac
502     AH_VERBATIM(
503         [snprinte],dnl  sorted in config.h just before #define snprintf
504         [
505             #if !defined(_KERNEL) && !defined(PARSESTREAM)
506             /*
507              * stdio.h must be included after _GNU_SOURCE is defined
508              * but before #define snprintf rpl_snprintf
509              */
510             # include <stdio.h> 
511             #endif
512         ])
513     AH_BOTTOM([
514         #if !defined(_KERNEL) && !defined(PARSESTREAM)
515         # if defined(HW_WANT_RPL_VSNPRINTF)
516         #  if defined(__cplusplus)
517         extern "C" {
518         # endif
519         # include <stdarg.h>
520         int rpl_vsnprintf(char *, size_t, const char *, va_list);
521         # if defined(__cplusplus)
522         }
523         #  endif
524         # endif
525         # if defined(HW_WANT_RPL_SNPRINTF)
526         #  if defined(__cplusplus)
527         extern "C" {
528         #  endif
529         int rpl_snprintf(char *, size_t, const char *, ...);
530         #  if defined(__cplusplus)
531         }
532         #  endif
533         # endif
534         #endif  /* !defined(_KERNEL) && !defined(PARSESTREAM) */
535         ])
536 ]) dnl end of AC_DEFUN of NTP_BEFORE_HW_FUNC_VSNPRINTF
537
538 AC_DEFUN([NTP_C99_SNPRINTF], [
539     AC_REQUIRE([NTP_BEFORE_HW_FUNC_VSNPRINTF])dnl
540     AC_REQUIRE([HW_FUNC_VSNPRINTF])dnl
541     AC_REQUIRE([HW_FUNC_SNPRINTF])dnl
542 ]) dnl end of DEFUN of NTP_C99_SNPRINTF
543
544 NTP_C99_SNPRINTF
545
546 dnl C99-snprintf does not handle %m
547 case "$hw_use_rpl_vsnprintf:$hw_cv_func_vsnprintf" in
548  no:yes)
549     AC_CACHE_CHECK(
550         [if vsnprintf expands "%m" to strerror(errno)],
551         [ntp_cv_vsnprintf_percent_m],
552         [AC_RUN_IFELSE(
553             [AC_LANG_PROGRAM(
554                 [[
555                     #include <stdarg.h>
556                     #include <errno.h>
557                     #include <stdio.h>
558                     #include <string.h>
559
560                     int call_vsnprintf(
561                             char *      dst,
562                             size_t      sz,
563                             const char *fmt,
564                             ...
565                             );
566
567                     int call_vsnprintf(
568                             char *      dst,
569                             size_t      sz,
570                             const char *fmt,
571                             ...
572                             )
573                     {
574                             va_list     ap;
575                             int         rc;
576
577                             va_start(ap, fmt);
578                             rc = vsnprintf(dst, sz, fmt, ap);
579                             va_end(ap);
580
581                             return rc;
582                     }
583                 ]],
584                 [[
585                     char        sbuf[512];
586                     char        pbuf[512];
587                     int         slen;
588
589                     strcpy(sbuf, strerror(ENOENT));
590                     errno = ENOENT;
591                     slen = call_vsnprintf(pbuf, sizeof(pbuf), "%m",
592                                           "wrong");
593                     return strcmp(sbuf, pbuf);
594                 ]]
595             )],
596             [ntp_cv_vsnprintf_percent_m=yes],
597             [ntp_cv_vsnprintf_percent_m=no],
598             [ntp_cv_vsnprintf_percent_m=no]
599         )]
600     )
601     case "$ntp_cv_vsnprintf_percent_m" in
602      yes)
603         AC_DEFINE([VSNPRINTF_PERCENT_M], [1],
604                   [vsnprintf expands "%m" to strerror(errno)])
605     esac
606 esac
607
608 AC_CHECK_HEADERS([sys/clockctl.h])
609
610 AC_ARG_ENABLE(
611     [clockctl],
612     [AS_HELP_STRING(
613         [--enable-clockctl],
614         [s Use /dev/clockctl for non-root clock control]
615     )],
616     [ntp_use_dev_clockctl=$enableval],
617     [ntp_use_dev_clockctl=$ac_cv_header_sys_clockctl_h]
618 )
619
620 AC_MSG_CHECKING([if we should use /dev/clockctl])
621 AC_MSG_RESULT([$ntp_use_dev_clockctl])
622
623
624 AC_CHECK_HEADERS([sys/capability.h sys/prctl.h])
625
626 AC_MSG_CHECKING([if we have linux capabilities (libcap)])
627
628 case "$ac_cv_header_sys_capability_h$ac_cv_header_sys_prctl_h" in
629  yesyes)
630     case "$host" in
631      mips-sgi-irix*)
632         ntp_have_linuxcaps=no
633         ;;
634      *) ntp_have_linuxcaps=yes
635         ;;
636     esac
637     ;;
638  *)
639     ntp_have_linuxcaps=no
640     ;;
641 esac
642
643 AC_ARG_ENABLE(
644     [linuxcaps],
645     [AS_HELP_STRING(
646         [--enable-linuxcaps],
647         [+ Use Linux capabilities for non-root clock control]
648     )],
649     [ntp_have_linuxcaps=$enableval]
650 )
651
652 AC_MSG_RESULT([$ntp_have_linuxcaps])
653
654 case "$ntp_have_linuxcaps" in
655  yes)
656     AC_DEFINE([HAVE_LINUX_CAPABILITIES], [1],
657         [Do we have Linux capabilities?])
658     LIBS="$LIBS -lcap"
659     ;;
660 esac
661
662
663 AC_CHECK_HEADERS([priv.h])
664
665 AC_MSG_CHECKING([if we have solaris privileges])
666
667 case "$ac_cv_header_priv_h" in
668  yes)
669     case "$host" in 
670      *-solaris*)
671         AC_CHECK_FUNC(
672             [setppriv],
673             [ntp_have_solarisprivs=yes],
674             [ntp_have_solarisprivs=no]
675         )
676         ;;
677     esac
678 esac
679
680 AC_ARG_ENABLE(
681     [solarisprivs],
682     [AS_HELP_STRING(
683         [--enable-solarisprivs],
684         [+ Use Solaris privileges for non-root clock control]
685     )],
686     [ntp_have_solarisprivs=$enableval]
687 )
688
689
690 case "$ntp_have_solarisprivs" in
691  yes)
692     AC_DEFINE([HAVE_SOLARIS_PRIVS], [1],
693         [Are Solaris privileges available?])
694 esac
695
696 AC_MSG_RESULT([$ntp_have_solarisprivs])
697
698 case "$ntp_use_dev_clockctl$ntp_have_linuxcaps$ntp_have_solarisprivs" in
699  *yes*)
700     AC_DEFINE([HAVE_DROPROOT], [1],
701         [Can we drop root privileges?])
702 esac
703
704 case "$host" in
705  *-*-darwin*)
706     AC_SEARCH_LIBS([res_9_init], [resolv])
707     ;;
708  *) AC_SEARCH_LIBS([res_init], [resolv])
709     ;;
710 esac
711 AC_HEADER_RESOLV
712 #HMS: Why do we do this check so "early"?
713 AC_CHECK_FUNCS([res_init], , [AC_CHECK_FUNCS([__res_init])])
714
715 # We also need -lsocket, but we have tested for that already.
716 AC_CHECK_FUNC([inet_ntop], [], 
717     [AC_DEFINE([ISC_PLATFORM_NEEDNTOP], [1], [ISC: provide inet_ntop()])])
718 AC_CHECK_FUNC([inet_pton], [],
719     [AC_DEFINE([ISC_PLATFORM_NEEDPTON], [1], [ISC: provide inet_pton()])])
720
721 AC_CHECK_TYPES([uintptr_t, int32, u_int32])
722  
723 AH_VERBATIM([TYPEDEF_UINTPTR_T],
724 [/* Provide a typedef for uintptr_t? */
725 #ifndef HAVE_UINTPTR_T
726 typedef unsigned int    uintptr_t;
727 #define HAVE_UINTPTR_T  1
728 #endif])
729
730 case "$ac_cv_type_int32::$ac_cv_header_resolv_h" in
731  no::yes)
732     AC_CACHE_CHECK(
733         [for int32 with DNS headers included],
734         [ntp_cv_type_int32_with_dns],
735         [AC_COMPILE_IFELSE(
736             [AC_LANG_PROGRAM(
737                 [[
738                     #ifdef HAVE_ARPA_NAMESER_H
739                     # include <arpa/nameser.h>
740                     #endif
741                     #include <resolv.h>
742                 ]],
743                 [[
744                     size_t cb = sizeof(int32);
745                 ]]
746             )],
747             [ntp_cv_type_int32_with_dns=yes],
748             [ntp_cv_type_int32_with_dns=no]
749         )]
750     )
751     case "$ntp_cv_type_int32_with_dns" in
752      yes)
753         AC_DEFINE([HAVE_INT32_ONLY_WITH_DNS], [1],
754             [int32 type in DNS headers, not others.])
755     esac
756 esac
757
758 case "$ac_cv_type_u_int32::$ac_cv_header_resolv_h" in
759  no::yes)
760     AC_CACHE_CHECK(
761         [for u_int32 with DNS headers included],
762         [ntp_cv_type_u_int32_with_dns],
763         [AC_COMPILE_IFELSE(
764             [AC_LANG_PROGRAM(
765                 [[
766                     #ifdef HAVE_ARPA_NAMESER_H
767                     # include <arpa/nameser.h>
768                     #endif
769                     #include <resolv.h>
770                 ]],
771                 [[
772                     size_t cb = sizeof(u_int32);
773                 ]]
774             )],
775             [ntp_cv_type_u_int32_with_dns=yes],
776             [ntp_cv_type_u_int32_with_dns=no]
777         )]
778     )
779     case "$ntp_cv_type_u_int32_with_dns" in
780      yes)
781         AC_DEFINE([HAVE_U_INT32_ONLY_WITH_DNS], [1],
782             [u_int32 type in DNS headers, not others.])
783     esac
784 esac
785
786 AC_CHECK_HEADERS(
787     [sys/timepps.h],
788     [],
789     [],
790     [
791         #ifdef HAVE_SYS_TIME_H
792         # include <sys/time.h>
793         #endif
794         #ifdef HAVE_ERRNO_H
795         # include <errno.h>
796         #endif
797     ]
798 )
799
800 AC_CACHE_CHECK(
801     [for struct timespec],
802     [ntp_cv_struct_timespec],
803     [AC_COMPILE_IFELSE(
804         [AC_LANG_PROGRAM(
805             [[
806                 #include <sys/time.h>
807                 /* Under SunOS, timespec is in sys/timepps.h,
808                    which needs errno.h and FRAC */
809                 #ifdef HAVE_ERRNO_H
810                 # include <errno.h>
811                 #endif
812                 #ifdef HAVE_SYS_TIMEPPS_H
813                 # define FRAC 4294967296
814                 # include <sys/timepps.h>
815                 #endif
816             ]],
817             [[
818                 struct timespec n;
819             ]]
820         )],
821         [ntp_cv_struct_timespec=yes],
822         [ntp_cv_struct_timespec=no]
823     )]
824 )
825 case "$ntp_cv_struct_timespec" in
826  yes)
827     AC_DEFINE([HAVE_STRUCT_TIMESPEC], [1], [struct timespec declared?])
828 esac
829
830 AC_CACHE_CHECK(
831     [for struct ntptimeval],
832     [ntp_cv_struct_ntptimeval],
833     [AC_COMPILE_IFELSE(
834         [AC_LANG_PROGRAM(
835             [[
836                 #include <sys/time.h>
837                 #include <sys/timex.h>
838             ]],
839             [[
840                 struct ntptimeval n;
841             ]]
842         )],
843         [ntp_cv_struct_ntptimeval=yes],
844         [ntp_cv_struct_ntptimeval=no]
845     )]
846 )
847 case "$ntp_cv_struct_ntptimeval" in
848  yes)
849     AC_DEFINE([HAVE_STRUCT_NTPTIMEVAL], [1],
850         [Do we have struct ntptimeval?])
851 esac
852
853 AC_CHECK_HEADERS(
854     [md5.h],
855     [],
856     [],
857     [
858         #ifdef HAVE_SYS_TYPES_H
859         # include <sys/types.h>
860         #endif
861     ]
862 )
863
864 AC_SEARCH_LIBS([MD5Init], [md5 md])
865 AC_CHECK_FUNCS([MD5Init sysconf getdtablesize sigaction sigset sigvec])
866
867 AC_CACHE_CHECK(
868     [for SIGIO],
869     [ntp_cv_hdr_def_sigio],
870     [AC_PREPROC_IFELSE(
871         [AC_LANG_SOURCE([
872             #include <signal.h>
873
874             #ifndef SIGIO
875             # error
876             #endif
877         ])],
878         [ntp_cv_hdr_def_sigio=yes],
879         [ntp_cv_hdr_def_sigio=no]
880     )]
881  )
882
883 dnl Override those system that have a losing SIGIO
884 AC_MSG_CHECKING([if we want to use SIGIO])
885 ans=no
886 case "$ntp_cv_hdr_def_sigio" in
887  yes)
888     ans=yes
889     case "$host" in
890      alpha*-dec-osf4*|alpha*-dec-osf5*)
891         ans=no
892         ;;
893      *-convex-*)
894         ans=no
895         ;;
896      *-dec-*)
897         ans=no
898         ;;
899      *-pc-cygwin*)
900         ans=no
901         ;;
902      *-sni-sysv*)
903         ans=no
904         ;;
905      *-stratus-vos)
906         ans=no
907         ;;
908      *-univel-sysv*)
909         ans=no
910         ;;
911      *-*-irix6*)
912         ans=no
913         ;;
914      *-*-freebsd*)
915         ans=no
916         ;;
917      *-*-*linux*)
918         ans=no
919         ;;
920      *-*-unicosmp*)
921         ans=no
922         ;;
923      *-*-kfreebsd*)
924         ans=no
925         ;;
926      m68k-*-mint*)
927         ans=no
928         ;;
929     esac
930     ;;
931 esac
932 case "$ans" in
933  yes)
934     AC_DEFINE([HAVE_SIGNALED_IO], [1],
935         [Can we use SIGIO for tcp and udp IO?])
936 esac
937 AC_MSG_RESULT([$ans])
938
939 AC_CACHE_CHECK(
940     [for SIGPOLL],
941     [ntp_cv_hdr_def_sigpoll],
942     [AC_PREPROC_IFELSE(
943         [AC_LANG_SOURCE([
944             #include <signal.h>
945             
946             #ifndef SIGPOLL
947             # error
948             #endif
949         ])],
950         [ntp_cv_hdr_def_sigpoll=yes],
951         [ntp_cv_hdr_def_sigpoll=no]
952     )]
953 )
954
955 AC_MSG_CHECKING([if we can use SIGPOLL for UDP I/O])
956 ans=no
957 case "$ntp_cv_hdr_def_sigpoll" in
958  yes)
959     case "$host" in
960      mips-sgi-irix*)
961         ans=no
962         ;;
963      vax-dec-bsd)
964         ans=no
965         ;;
966      *-pc-cygwin*)
967         ans=no
968         ;;
969      *-sni-sysv*)
970         ans=no
971         ;;
972      *-stratus-vos)
973         ans=no
974         ;;
975      *-*-aix[[4-9]]*)
976         # XXX Only verified thru AIX6
977         ans=no
978         ;;
979      *-*-hpux*)
980         ans=no
981         ;;
982      *-*-*linux*)
983         ans=no
984         ;;
985      *-*-osf*)
986         ans=no
987         ;;
988      *-*-qnx*)
989         ans=no
990         ;;
991      *-*-sunos*)
992         ans=no
993         ;;
994      *-*-solaris*)
995         ans=no
996         ;;
997      *-*-ultrix*)
998         ans=no
999         ;;
1000      *-*-unicosmp*)
1001         ans=no
1002         ;;
1003      *-*-kfreebsd*)
1004         ans=no
1005         ;;
1006      *) ans=yes
1007         ;;
1008     esac
1009     ;;
1010 esac
1011 case "$ans" in
1012  yes)
1013     AC_DEFINE([USE_UDP_SIGPOLL], [1], [Can we use SIGPOLL for UDP?])
1014 esac
1015 AC_MSG_RESULT([$ans])
1016
1017 AC_MSG_CHECKING([if we can use SIGPOLL for TTY I/O])
1018 ans=no
1019 case "$ntp_cv_hdr_def_sigpoll" in
1020  yes)
1021     case "$host" in
1022      mips-sgi-irix*)
1023         ans=no
1024         ;;
1025      vax-dec-bsd)
1026         ans=no
1027         ;;
1028      *-pc-cygwin*)
1029         ans=no
1030         ;;
1031      *-sni-sysv*)
1032         ans=no
1033         ;;
1034      *-stratus-vos)
1035         ans=no
1036         ;;
1037      *-*-aix[[4-9]]*)
1038         # XXX Only verified thru AIX6
1039         ans=no
1040         ;;
1041      *-*-hpux*)
1042         ans=no
1043         ;;
1044      *-*-*linux*)
1045         ans=no
1046         ;;
1047      *-*-osf*)
1048         ans=no
1049         ;;
1050      *-*-sunos*)
1051         ans=no
1052         ;;
1053      *-*-ultrix*)
1054         ans=no
1055         ;;
1056      *-*-qnx*)
1057         ans=no
1058         ;;
1059      *-*-unicosmp*)
1060         ans=no
1061         ;;
1062      *-*-kfreebsd*)
1063         ans=no
1064         ;;
1065      *) ans=yes
1066         ;;
1067     esac
1068     ;;
1069 esac
1070 case "$ans" in
1071  yes)
1072     AC_DEFINE([USE_TTY_SIGPOLL], [1], [Can we use SIGPOLL for tty IO?])
1073 esac
1074 AC_MSG_RESULT([$ans])
1075
1076 AC_CACHE_CHECK(
1077     [number of arguments to gettimeofday()],
1078     [ntp_cv_func_Xettimeofday_nargs],
1079     [AC_COMPILE_IFELSE(
1080         [AC_LANG_PROGRAM(
1081             [[
1082                 #include <sys/time.h>
1083             ]],
1084             [[
1085                 gettimeofday(0, 0);
1086                 settimeofday(0, 0);
1087             ]]
1088         )],
1089         [ntp_cv_func_Xettimeofday_nargs=2],
1090         [ntp_cv_func_Xettimeofday_nargs=1]
1091     )]
1092 )
1093 case "$ntp_cv_func_Xettimeofday_nargs" in
1094  1)
1095     AC_DEFINE([SYSV_TIMEOFDAY], [1], [Does Xettimeofday take 1 arg?])
1096 esac
1097
1098 AC_CHECK_FUNCS([settimeofday], ,[
1099     case "$host" in
1100      *-*-mpeix*) ac_cv_func_settimeofday=yes
1101     esac
1102 ])
1103
1104 AC_MSG_CHECKING([if we'll use clock_settime or settimeofday or stime])
1105 ntp_warning='GRONK'
1106 ans=none
1107 case "$ac_cv_func_clock_settime$ac_cv_func_settimeofday$ac_cv_func_stime" in
1108  yes*)
1109     ntp_warning=''
1110     ans='clock_settime()'
1111     ;;
1112  noyes*)
1113     ntp_warning='But clock_settime() would be better (if we had it)'
1114     ans='settimeofday()'
1115     ;;
1116  nonoyes)
1117     ntp_warning='Which is the worst of the three'
1118     ans='stime()'
1119     ;;
1120  *) 
1121     case "$build" in
1122      $host) 
1123         ntp_warning='Which leaves us with nothing to use!'
1124     esac
1125 esac
1126 AC_MSG_RESULT([$ans])
1127 case "$ntp_warning" in
1128  '')
1129     ;;
1130  *)
1131     AC_MSG_WARN([*** $ntp_warning ***])
1132     ;;
1133 esac
1134
1135
1136 dnl add to LDADD_LIBNTP set by ntp_compiler.m4
1137 LDADD_LIBNTP="$LDADD_LIBNTP $LIBS"
1138 LIBS=$__LIBS
1139 AS_UNSET([__LIBS])
1140
1141 ])dnl
1142 dnl ======================================================================