]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - contrib/ntp/sntp/m4/ntp_libntp.m4
Fix multiple vulnerabilities of ntp. [SA-17:03]
[FreeBSD/releng/10.3.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 case "$ac_cv_header_priv_h" in
665  yes)
666     case "$host" in 
667      *-solaris*)
668         AC_CHECK_FUNC(
669             [setppriv],
670             [ntp_have_solarisprivs=yes],
671             [ntp_have_solarisprivs=no]
672         )
673         ;;
674     esac
675 esac
676
677 AC_ARG_ENABLE(
678     [solarisprivs],
679     [AS_HELP_STRING(
680         [--enable-solarisprivs],
681         [+ Use Solaris privileges for non-root clock control]
682     )],
683     [ntp_have_solarisprivs=$enableval]
684 )
685
686 AC_MSG_CHECKING([if we have solaris privileges])
687
688 case "$ntp_have_solarisprivs" in
689  yes)
690     AC_DEFINE([HAVE_SOLARIS_PRIVS], [1],
691         [Are Solaris privileges available?])
692 esac
693
694 AC_MSG_RESULT([$ntp_have_solarisprivs])
695
696 case "$ntp_use_dev_clockctl$ntp_have_linuxcaps$ntp_have_solarisprivs" in
697  *yes*)
698     AC_DEFINE([HAVE_DROPROOT], [1],
699         [Can we drop root privileges?])
700 esac
701
702 case "$host" in
703  *-*-darwin*)
704     AC_SEARCH_LIBS([res_9_init], [resolv])
705     ;;
706  *) AC_SEARCH_LIBS([res_init], [resolv])
707     ;;
708 esac
709 AC_HEADER_RESOLV
710 #HMS: Why do we do this check so "early"?
711 AC_CHECK_FUNCS([res_init], , [AC_CHECK_FUNCS([__res_init])])
712
713 # We also need -lsocket, but we have tested for that already.
714 AC_CHECK_FUNC([inet_ntop], [], 
715     [AC_DEFINE([ISC_PLATFORM_NEEDNTOP], [1], [ISC: provide inet_ntop()])])
716 AC_CHECK_FUNC([inet_pton], [],
717     [AC_DEFINE([ISC_PLATFORM_NEEDPTON], [1], [ISC: provide inet_pton()])])
718
719 AC_CHECK_TYPES([uintptr_t, int32, u_int32])
720  
721 AH_VERBATIM([TYPEDEF_UINTPTR_T],
722 [/* Provide a typedef for uintptr_t? */
723 #ifndef HAVE_UINTPTR_T
724 typedef unsigned int    uintptr_t;
725 #define HAVE_UINTPTR_T  1
726 #endif])
727
728 case "$ac_cv_type_int32::$ac_cv_header_resolv_h" in
729  no::yes)
730     AC_CACHE_CHECK(
731         [for int32 with DNS headers included],
732         [ntp_cv_type_int32_with_dns],
733         [AC_COMPILE_IFELSE(
734             [AC_LANG_PROGRAM(
735                 [[
736                     #ifdef HAVE_ARPA_NAMESER_H
737                     # include <arpa/nameser.h>
738                     #endif
739                     #include <resolv.h>
740                 ]],
741                 [[
742                     size_t cb = sizeof(int32);
743                 ]]
744             )],
745             [ntp_cv_type_int32_with_dns=yes],
746             [ntp_cv_type_int32_with_dns=no]
747         )]
748     )
749     case "$ntp_cv_type_int32_with_dns" in
750      yes)
751         AC_DEFINE([HAVE_INT32_ONLY_WITH_DNS], [1],
752             [int32 type in DNS headers, not others.])
753     esac
754 esac
755
756 case "$ac_cv_type_u_int32::$ac_cv_header_resolv_h" in
757  no::yes)
758     AC_CACHE_CHECK(
759         [for u_int32 with DNS headers included],
760         [ntp_cv_type_u_int32_with_dns],
761         [AC_COMPILE_IFELSE(
762             [AC_LANG_PROGRAM(
763                 [[
764                     #ifdef HAVE_ARPA_NAMESER_H
765                     # include <arpa/nameser.h>
766                     #endif
767                     #include <resolv.h>
768                 ]],
769                 [[
770                     size_t cb = sizeof(u_int32);
771                 ]]
772             )],
773             [ntp_cv_type_u_int32_with_dns=yes],
774             [ntp_cv_type_u_int32_with_dns=no]
775         )]
776     )
777     case "$ntp_cv_type_u_int32_with_dns" in
778      yes)
779         AC_DEFINE([HAVE_U_INT32_ONLY_WITH_DNS], [1],
780             [u_int32 type in DNS headers, not others.])
781     esac
782 esac
783
784 AC_CHECK_HEADERS(
785     [sys/timepps.h],
786     [],
787     [],
788     [
789         #ifdef HAVE_SYS_TIME_H
790         # include <sys/time.h>
791         #endif
792         #ifdef HAVE_ERRNO_H
793         # include <errno.h>
794         #endif
795     ]
796 )
797
798 AC_CACHE_CHECK(
799     [for struct timespec],
800     [ntp_cv_struct_timespec],
801     [AC_COMPILE_IFELSE(
802         [AC_LANG_PROGRAM(
803             [[
804                 #include <sys/time.h>
805                 /* Under SunOS, timespec is in sys/timepps.h,
806                    which needs errno.h and FRAC */
807                 #ifdef HAVE_ERRNO_H
808                 # include <errno.h>
809                 #endif
810                 #ifdef HAVE_SYS_TIMEPPS_H
811                 # define FRAC 4294967296
812                 # include <sys/timepps.h>
813                 #endif
814             ]],
815             [[
816                 struct timespec n;
817             ]]
818         )],
819         [ntp_cv_struct_timespec=yes],
820         [ntp_cv_struct_timespec=no]
821     )]
822 )
823 case "$ntp_cv_struct_timespec" in
824  yes)
825     AC_DEFINE([HAVE_STRUCT_TIMESPEC], [1], [struct timespec declared?])
826 esac
827
828 AC_CACHE_CHECK(
829     [for struct ntptimeval],
830     [ntp_cv_struct_ntptimeval],
831     [AC_COMPILE_IFELSE(
832         [AC_LANG_PROGRAM(
833             [[
834                 #include <sys/time.h>
835                 #include <sys/timex.h>
836             ]],
837             [[
838                 struct ntptimeval n;
839             ]]
840         )],
841         [ntp_cv_struct_ntptimeval=yes],
842         [ntp_cv_struct_ntptimeval=no]
843     )]
844 )
845 case "$ntp_cv_struct_ntptimeval" in
846  yes)
847     AC_DEFINE([HAVE_STRUCT_NTPTIMEVAL], [1],
848         [Do we have struct ntptimeval?])
849 esac
850
851 AC_CHECK_HEADERS(
852     [md5.h],
853     [],
854     [],
855     [
856         #ifdef HAVE_SYS_TYPES_H
857         # include <sys/types.h>
858         #endif
859     ]
860 )
861
862 AC_SEARCH_LIBS([MD5Init], [md5 md])
863 AC_CHECK_FUNCS([MD5Init sysconf getdtablesize sigaction sigset sigvec])
864
865 AC_CACHE_CHECK(
866     [for SIGIO],
867     [ntp_cv_hdr_def_sigio],
868     [AC_PREPROC_IFELSE(
869         [AC_LANG_SOURCE([
870             #include <signal.h>
871
872             #ifndef SIGIO
873             # error
874             #endif
875         ])],
876         [ntp_cv_hdr_def_sigio=yes],
877         [ntp_cv_hdr_def_sigio=no]
878     )]
879  )
880
881 dnl Override those system that have a losing SIGIO
882 AC_MSG_CHECKING([if we want to use SIGIO])
883 ans=no
884 case "$ntp_cv_hdr_def_sigio" in
885  yes)
886     ans=yes
887     case "$host" in
888      alpha*-dec-osf4*|alpha*-dec-osf5*)
889         ans=no
890         ;;
891      *-convex-*)
892         ans=no
893         ;;
894      *-dec-*)
895         ans=no
896         ;;
897      *-pc-cygwin*)
898         ans=no
899         ;;
900      *-sni-sysv*)
901         ans=no
902         ;;
903      *-stratus-vos)
904         ans=no
905         ;;
906      *-univel-sysv*)
907         ans=no
908         ;;
909      *-*-irix6*)
910         ans=no
911         ;;
912      *-*-freebsd*)
913         ans=no
914         ;;
915      *-*-*linux*)
916         ans=no
917         ;;
918      *-*-unicosmp*)
919         ans=no
920         ;;
921      *-*-kfreebsd*)
922         ans=no
923         ;;
924      m68k-*-mint*)
925         ans=no
926         ;;
927     esac
928     ;;
929 esac
930 case "$ans" in
931  yes)
932     AC_DEFINE([HAVE_SIGNALED_IO], [1],
933         [Can we use SIGIO for tcp and udp IO?])
934 esac
935 AC_MSG_RESULT([$ans])
936
937 AC_CACHE_CHECK(
938     [for SIGPOLL],
939     [ntp_cv_hdr_def_sigpoll],
940     [AC_PREPROC_IFELSE(
941         [AC_LANG_SOURCE([
942             #include <signal.h>
943             
944             #ifndef SIGPOLL
945             # error
946             #endif
947         ])],
948         [ntp_cv_hdr_def_sigpoll=yes],
949         [ntp_cv_hdr_def_sigpoll=no]
950     )]
951 )
952
953 AC_MSG_CHECKING([if we can use SIGPOLL for UDP I/O])
954 ans=no
955 case "$ntp_cv_hdr_def_sigpoll" in
956  yes)
957     case "$host" in
958      mips-sgi-irix*)
959         ans=no
960         ;;
961      vax-dec-bsd)
962         ans=no
963         ;;
964      *-pc-cygwin*)
965         ans=no
966         ;;
967      *-sni-sysv*)
968         ans=no
969         ;;
970      *-stratus-vos)
971         ans=no
972         ;;
973      *-*-aix[[4-9]]*)
974         # XXX Only verified thru AIX6
975         ans=no
976         ;;
977      *-*-hpux*)
978         ans=no
979         ;;
980      *-*-*linux*)
981         ans=no
982         ;;
983      *-*-osf*)
984         ans=no
985         ;;
986      *-*-qnx*)
987         ans=no
988         ;;
989      *-*-sunos*)
990         ans=no
991         ;;
992      *-*-solaris*)
993         ans=no
994         ;;
995      *-*-ultrix*)
996         ans=no
997         ;;
998      *-*-unicosmp*)
999         ans=no
1000         ;;
1001      *-*-kfreebsd*)
1002         ans=no
1003         ;;
1004      *) ans=yes
1005         ;;
1006     esac
1007     ;;
1008 esac
1009 case "$ans" in
1010  yes)
1011     AC_DEFINE([USE_UDP_SIGPOLL], [1], [Can we use SIGPOLL for UDP?])
1012 esac
1013 AC_MSG_RESULT([$ans])
1014
1015 AC_MSG_CHECKING([if we can use SIGPOLL for TTY I/O])
1016 ans=no
1017 case "$ntp_cv_hdr_def_sigpoll" in
1018  yes)
1019     case "$host" in
1020      mips-sgi-irix*)
1021         ans=no
1022         ;;
1023      vax-dec-bsd)
1024         ans=no
1025         ;;
1026      *-pc-cygwin*)
1027         ans=no
1028         ;;
1029      *-sni-sysv*)
1030         ans=no
1031         ;;
1032      *-stratus-vos)
1033         ans=no
1034         ;;
1035      *-*-aix[[4-9]]*)
1036         # XXX Only verified thru AIX6
1037         ans=no
1038         ;;
1039      *-*-hpux*)
1040         ans=no
1041         ;;
1042      *-*-*linux*)
1043         ans=no
1044         ;;
1045      *-*-osf*)
1046         ans=no
1047         ;;
1048      *-*-sunos*)
1049         ans=no
1050         ;;
1051      *-*-ultrix*)
1052         ans=no
1053         ;;
1054      *-*-qnx*)
1055         ans=no
1056         ;;
1057      *-*-unicosmp*)
1058         ans=no
1059         ;;
1060      *-*-kfreebsd*)
1061         ans=no
1062         ;;
1063      *) ans=yes
1064         ;;
1065     esac
1066     ;;
1067 esac
1068 case "$ans" in
1069  yes)
1070     AC_DEFINE([USE_TTY_SIGPOLL], [1], [Can we use SIGPOLL for tty IO?])
1071 esac
1072 AC_MSG_RESULT([$ans])
1073
1074 AC_CACHE_CHECK(
1075     [number of arguments to gettimeofday()],
1076     [ntp_cv_func_Xettimeofday_nargs],
1077     [AC_COMPILE_IFELSE(
1078         [AC_LANG_PROGRAM(
1079             [[
1080                 #include <sys/time.h>
1081             ]],
1082             [[
1083                 gettimeofday(0, 0);
1084                 settimeofday(0, 0);
1085             ]]
1086         )],
1087         [ntp_cv_func_Xettimeofday_nargs=2],
1088         [ntp_cv_func_Xettimeofday_nargs=1]
1089     )]
1090 )
1091 case "$ntp_cv_func_Xettimeofday_nargs" in
1092  1)
1093     AC_DEFINE([SYSV_TIMEOFDAY], [1], [Does Xettimeofday take 1 arg?])
1094 esac
1095
1096 AC_CHECK_FUNCS([settimeofday], ,[
1097     case "$host" in
1098      *-*-mpeix*) ac_cv_func_settimeofday=yes
1099     esac
1100 ])
1101
1102 AC_MSG_CHECKING([if we'll use clock_settime or settimeofday or stime])
1103 ntp_warning='GRONK'
1104 ans=none
1105 case "$ac_cv_func_clock_settime$ac_cv_func_settimeofday$ac_cv_func_stime" in
1106  yes*)
1107     ntp_warning=''
1108     ans='clock_settime()'
1109     ;;
1110  noyes*)
1111     ntp_warning='But clock_settime() would be better (if we had it)'
1112     ans='settimeofday()'
1113     ;;
1114  nonoyes)
1115     ntp_warning='Which is the worst of the three'
1116     ans='stime()'
1117     ;;
1118  *) 
1119     case "$build" in
1120      $host) 
1121         ntp_warning='Which leaves us with nothing to use!'
1122     esac
1123 esac
1124 AC_MSG_RESULT([$ans])
1125 case "$ntp_warning" in
1126  '')
1127     ;;
1128  *)
1129     AC_MSG_WARN([*** $ntp_warning ***])
1130     ;;
1131 esac
1132
1133
1134 dnl add to LDADD_LIBNTP set by ntp_compiler.m4
1135 LDADD_LIBNTP="$LDADD_LIBNTP $LIBS"
1136 LIBS=$__LIBS
1137 AS_UNSET([__LIBS])
1138
1139 ])dnl
1140 dnl ======================================================================