From 2b78f720d4176726c1d27400684acfb0362c2ff6 Mon Sep 17 00:00:00 2001
From: CentOS Sources
Date: Oct 29 2019 16:44:54 +0000
Subject: import ntp-4.2.6p5-29.el7
---
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..86e0978
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+SOURCES/ntp-4.2.6p5.tar.gz
+SOURCES/ntpstat-0.5.tar.gz
diff --git a/.ntp.metadata b/.ntp.metadata
new file mode 100644
index 0000000..ab4a419
--- /dev/null
+++ b/.ntp.metadata
@@ -0,0 +1,2 @@
+4a5353a4791b6f4315a66c28d504ec6c7926b192 SOURCES/ntp-4.2.6p5.tar.gz
+cb8ccc71c5b036bdefe9af8911ea4202dee84a54 SOURCES/ntpstat-0.5.tar.gz
diff --git a/SOURCES/ntp-4.2.4p7-getprecision.patch b/SOURCES/ntp-4.2.4p7-getprecision.patch
new file mode 100644
index 0000000..ecf6def
--- /dev/null
+++ b/SOURCES/ntp-4.2.4p7-getprecision.patch
@@ -0,0 +1,12 @@
+diff -up ntp-4.2.4p7/ntpd/ntp_proto.c.getprecision ntp-4.2.4p7/ntpd/ntp_proto.c
+--- ntp-4.2.4p7/ntpd/ntp_proto.c.getprecision 2009-09-29 14:16:22.000000000 +0200
++++ ntp-4.2.4p7/ntpd/ntp_proto.c 2009-09-29 14:18:13.000000000 +0200
+@@ -3099,7 +3099,7 @@ peer_unfit(
+ /*
+ * Find the precision of this particular machine
+ */
+-#define MINSTEP 100e-9 /* minimum clock increment (s) */
++#define MINSTEP 10e-9 /* minimum clock increment (s) */
+ #define MAXSTEP 20e-3 /* maximum clock increment (s) */
+ #define MINLOOPS 5 /* minimum number of step samples */
+
diff --git a/SOURCES/ntp-4.2.6p1-cmsgalign.patch b/SOURCES/ntp-4.2.6p1-cmsgalign.patch
new file mode 100644
index 0000000..0e4b8cc
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p1-cmsgalign.patch
@@ -0,0 +1,14 @@
+diff -up ntp-4.2.6p1/ntpd/ntp_io.c.cmsgalign ntp-4.2.6p1/ntpd/ntp_io.c
+--- ntp-4.2.6p1/ntpd/ntp_io.c.cmsgalign 2010-03-04 18:28:53.000000000 +0100
++++ ntp-4.2.6p1/ntpd/ntp_io.c 2010-03-04 18:30:34.000000000 +0100
+@@ -3194,8 +3194,8 @@ read_network_packet(
+ msghdr.msg_namelen = fromlen;
+ msghdr.msg_iov = &iovec;
+ msghdr.msg_iovlen = 1;
+- msghdr.msg_control = (void *)&control;
+- msghdr.msg_controllen = sizeof(control);
++ msghdr.msg_control = (void *)((long)(control + 7) & -8); /* align to 8 bytes */
++ msghdr.msg_controllen = sizeof(control) - 8;
+ msghdr.msg_flags = 0;
+ rb->recv_length = recvmsg(fd, &msghdr, 0);
+ #endif
diff --git a/SOURCES/ntp-4.2.6p1-linkfastmath.patch b/SOURCES/ntp-4.2.6p1-linkfastmath.patch
new file mode 100644
index 0000000..5a859d3
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p1-linkfastmath.patch
@@ -0,0 +1,12 @@
+diff -up ntp-4.2.6p1/ntpd/Makefile.in.linkfastmath ntp-4.2.6p1/ntpd/Makefile.in
+--- ntp-4.2.6p1/ntpd/Makefile.in.linkfastmath 2010-02-09 11:19:25.000000000 +0100
++++ ntp-4.2.6p1/ntpd/Makefile.in 2010-03-03 16:57:40.000000000 +0100
+@@ -365,7 +365,7 @@ man_MANS = $(srcdir)/ntpd.1
+ # sqrt ntp_control.o
+ # floor refclock_wwv.o
+ # which are (usually) provided by -lm.
+-ntpd_LDADD = $(LDADD) $(LIBOPTS_LDADD) ../libntp/libntp.a -lm @LCRYPTO@ @LSCF@
++ntpd_LDADD = $(LDADD) $(LIBOPTS_LDADD) ../libntp/libntp.a -lm -ffast-math @LCRYPTO@ @LSCF@
+ ntpdsim_LDADD = $(LDADD) $(LIBOPTS_LDADD) ../libntp/libntpsim.a -lm @LCRYPTO@ @LSCF@
+ ntpdsim_CFLAGS = $(CFLAGS) -DSIM
+ check_y2k_LDADD = $(LDADD) ../libntp/libntp.a
diff --git a/SOURCES/ntp-4.2.6p1-retcode.patch b/SOURCES/ntp-4.2.6p1-retcode.patch
new file mode 100644
index 0000000..6d676d2
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p1-retcode.patch
@@ -0,0 +1,12 @@
+diff -up ntp-4.2.6p1/ntpd/ntp_proto.c.retcode ntp-4.2.6p1/ntpd/ntp_proto.c
+--- ntp-4.2.6p1/ntpd/ntp_proto.c.retcode 2009-12-09 08:36:36.000000000 +0100
++++ ntp-4.2.6p1/ntpd/ntp_proto.c 2010-03-03 16:06:00.000000000 +0100
+@@ -269,7 +269,7 @@ transmit(
+ "ntpd: no servers found");
+ printf(
+ "ntpd: no servers found\n");
+- exit (0);
++ exit (1);
+ }
+ }
+ }
diff --git a/SOURCES/ntp-4.2.6p1-sleep.patch b/SOURCES/ntp-4.2.6p1-sleep.patch
new file mode 100644
index 0000000..577ef26
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p1-sleep.patch
@@ -0,0 +1,495 @@
+diff -up ntp-4.2.6p1/include/ntp_refclock.h.sleep ntp-4.2.6p1/include/ntp_refclock.h
+--- ntp-4.2.6p1/include/ntp_refclock.h.sleep 2009-12-09 08:36:35.000000000 +0100
++++ ntp-4.2.6p1/include/ntp_refclock.h 2010-03-10 19:27:46.000000000 +0100
+@@ -260,6 +260,7 @@ extern void refclock_control (sockaddr_u
+ struct refclockstat *);
+ extern int refclock_open (char *, u_int, u_int);
+ extern int refclock_setup (int, u_int, u_int);
++extern int refclock_timer_needed (struct peer *);
+ extern void refclock_timer (struct peer *);
+ extern void refclock_transmit (struct peer *);
+ extern int refclock_ioctl (int, u_int);
+diff -up ntp-4.2.6p1/include/ntp_stdlib.h.sleep ntp-4.2.6p1/include/ntp_stdlib.h
+--- ntp-4.2.6p1/include/ntp_stdlib.h.sleep 2009-12-09 08:36:35.000000000 +0100
++++ ntp-4.2.6p1/include/ntp_stdlib.h 2010-03-10 19:27:46.000000000 +0100
+@@ -116,6 +116,7 @@ extern const char * FindConfig (const ch
+ extern void signal_no_reset (int, RETSIGTYPE (*func)(int));
+
+ extern void getauthkeys (const char *);
++extern int auth_agekeys_needed (void);
+ extern void auth_agekeys (void);
+ extern void rereadkeys (void);
+
+diff -up ntp-4.2.6p1/include/ntpd.h.sleep ntp-4.2.6p1/include/ntpd.h
+--- ntp-4.2.6p1/include/ntpd.h.sleep 2009-12-09 08:36:35.000000000 +0100
++++ ntp-4.2.6p1/include/ntpd.h 2010-03-10 19:27:46.000000000 +0100
+@@ -112,8 +112,10 @@ extern void block_io_and_alarm (void);
+ /* ntp_loopfilter.c */
+ extern void init_loopfilter(void);
+ extern int local_clock(struct peer *, double);
+-extern void adj_host_clock(void);
++extern int adj_host_clock_needed(void);
++extern void adj_host_clock(int);
+ extern void loop_config(int, double);
++extern int huffpuff_enabled(void);
+ extern void huffpuff(void);
+ extern u_long sys_clocktime;
+ extern u_int sys_tai;
+@@ -219,6 +221,8 @@ extern void hack_restrict (int, sockaddr
+ /* ntp_timer.c */
+ extern void init_timer (void);
+ extern void reinit_timer (void);
++extern double get_timeout (l_fp *);
++extern int timer_elapsed (l_fp, int);
+ extern void timer (void);
+ extern void timer_clr_stats (void);
+ extern void timer_interfacetimeout (u_long);
+diff -up ntp-4.2.6p1/libntp/authkeys.c.sleep ntp-4.2.6p1/libntp/authkeys.c
+--- ntp-4.2.6p1/libntp/authkeys.c.sleep 2009-12-09 08:36:35.000000000 +0100
++++ ntp-4.2.6p1/libntp/authkeys.c 2010-03-10 19:27:46.000000000 +0100
+@@ -445,6 +445,25 @@ auth_delkeys(void)
+ }
+ }
+
++int
++auth_agekeys_needed(void) {
++ struct savekey *sk;
++ int i;
++
++ if (authnumkeys > 20)
++ return 1;
++
++ for (i = 0; i < HASHSIZE; i++) {
++ sk = key_hash[i];
++ while (sk != 0) {
++ if (sk->lifetime > 0)
++ return 1;
++ sk = sk->next;
++ }
++ }
++ return 0;
++}
++
+ /*
+ * auth_agekeys - delete keys whose lifetimes have expired
+ */
+diff -up ntp-4.2.6p1/ntpd/ntp_loopfilter.c.sleep ntp-4.2.6p1/ntpd/ntp_loopfilter.c
+--- ntp-4.2.6p1/ntpd/ntp_loopfilter.c.sleep 2009-12-09 08:36:36.000000000 +0100
++++ ntp-4.2.6p1/ntpd/ntp_loopfilter.c 2010-03-10 19:27:46.000000000 +0100
+@@ -677,6 +677,13 @@ local_clock(
+ #endif /* LOCKCLOCK */
+ }
+
++int
++adj_host_clock_needed(void)
++{
++ return !(!ntp_enable || mode_ntpdate || (pll_control &&
++ kern_enable));
++}
++
+
+ /*
+ * adj_host_clock - Called once every second to update the local clock.
+@@ -686,7 +693,7 @@ local_clock(
+ */
+ void
+ adj_host_clock(
+- void
++ int time_elapsed
+ )
+ {
+ double adjustment;
+@@ -698,7 +705,7 @@ adj_host_clock(
+ * since the poll interval can exceed one day, the old test
+ * would be counterproductive.
+ */
+- sys_rootdisp += clock_phi;
++ sys_rootdisp += clock_phi * time_elapsed;
+
+ #ifndef LOCKCLOCK
+ /*
+@@ -819,6 +826,12 @@ set_freq(
+ #endif /* KERNEL_PLL */
+ }
+
++int
++huffpuff_enabled(void)
++{
++ return sys_huffpuff != NULL;
++}
++
+ /*
+ * huff-n'-puff filter
+ */
+diff -up ntp-4.2.6p1/ntpd/ntp_refclock.c.sleep ntp-4.2.6p1/ntpd/ntp_refclock.c
+--- ntp-4.2.6p1/ntpd/ntp_refclock.c.sleep 2009-12-09 08:36:36.000000000 +0100
++++ ntp-4.2.6p1/ntpd/ntp_refclock.c 2010-03-10 19:27:46.000000000 +0100
+@@ -268,6 +268,21 @@ refclock_unpeer(
+ }
+
+
++int
++refclock_timer_needed(
++ struct peer *peer /* peer structure pointer */
++ )
++{
++ u_char clktype;
++ int unit;
++
++ clktype = peer->refclktype;
++ unit = peer->refclkunit;
++ if (refclock_conf[clktype]->clock_timer != noentry)
++ return 1;
++ return 0;
++}
++
+ /*
+ * refclock_timer - called once per second for housekeeping.
+ */
+diff -up ntp-4.2.6p1/ntpd/ntp_timer.c.sleep ntp-4.2.6p1/ntpd/ntp_timer.c
+--- ntp-4.2.6p1/ntpd/ntp_timer.c.sleep 2009-12-09 08:36:35.000000000 +0100
++++ ntp-4.2.6p1/ntpd/ntp_timer.c 2010-03-11 15:23:59.000000000 +0100
+@@ -56,7 +56,6 @@ static u_long adjust_timer; /* second ti
+ static u_long stats_timer; /* stats timer */
+ static u_long huffpuff_timer; /* huff-n'-puff timer */
+ u_long leapsec; /* leapseconds countdown */
+-l_fp sys_time; /* current system time */
+ #ifdef OPENSSL
+ static u_long revoke_timer; /* keys revoke timer */
+ static u_long keys_timer; /* session key timer */
+@@ -74,6 +73,12 @@ volatile u_long alarm_overflow;
+ #define DAY (24 * HOUR)
+
+ u_long current_time; /* seconds since startup */
++l_fp timer_base;
++int time_elapsed;
++
++#define TIMEOUT_TS_SIZE 2
++l_fp timeout_ts[TIMEOUT_TS_SIZE];
++unsigned int timeout_ts_index;
+
+ /*
+ * Stats. Number of overflows and number of calls to transmit().
+@@ -110,6 +115,8 @@ static RETSIGTYPE alarming (int);
+ void
+ reinit_timer(void)
+ {
++ get_systime(&timer_base);
++#if 0
+ #if !defined(SYS_WINNT) && !defined(VMS)
+ # if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME)
+ timer_gettime(ntpd_timerid, &itimer);
+@@ -143,6 +150,7 @@ reinit_timer(void)
+ setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
+ # endif
+ # endif /* VMS */
++#endif
+ }
+
+ /*
+@@ -165,6 +173,12 @@ init_timer(void)
+ timer_xmtcalls = 0;
+ timer_timereset = 0;
+
++ get_systime(&timer_base);
++
++ for (timeout_ts_index = 0; timeout_ts_index < TIMEOUT_TS_SIZE; timeout_ts_index++)
++ L_CLR(&timeout_ts[timeout_ts_index]);
++ timeout_ts_index = 0;
++#if 0
+ #if !defined(SYS_WINNT)
+ /*
+ * Set up the alarm interrupt. The first comes 2**EVENT_TIMEOUT
+@@ -226,6 +240,7 @@ init_timer(void)
+ }
+
+ #endif /* SYS_WINNT */
++#endif
+ }
+
+ #if defined(SYS_WINNT)
+@@ -236,6 +251,104 @@ get_timer_handle(void)
+ }
+ #endif
+
++double
++get_timeout(l_fp *now)
++{
++ register struct peer *peer, *next_peer;
++ u_int n;
++ double r;
++ int next;
++ l_fp ts;
++
++ ts = *now;
++ L_SUB(&ts, &timeout_ts[timeout_ts_index]);
++ timeout_ts[timeout_ts_index] = *now;
++ timeout_ts_index = (timeout_ts_index + 1) % TIMEOUT_TS_SIZE;
++
++ /* don't waste CPU time if called too frequently */
++ if (ts.l_ui == 0) {
++ next = 1;
++ goto finish;
++ }
++
++ next = current_time + HOUR;
++
++ if (adj_host_clock_needed()) {
++ next = 1;
++ goto finish;
++ }
++ for (n = 0; n < NTP_HASH_SIZE; n++) {
++ for (peer = peer_hash[n]; peer != 0; peer = next_peer) {
++ next_peer = peer->next;
++#ifdef REFCLOCK
++ if (peer->flags & FLAG_REFCLOCK && refclock_timer_needed(peer)) {
++ next = 1;
++ goto finish;
++ }
++#endif /* REFCLOCK */
++ if (peer->action)
++ next = min(next, peer->nextaction);
++ next = min(next, peer->nextdate);
++ }
++ }
++
++ if (leapsec > 0)
++ next = min(next, leapsec);
++
++ if (huffpuff_enabled())
++ next = min(next, huffpuff_timer);
++
++#ifdef OPENSSL
++ if (auth_agekeys_needed())
++ next = min(next, keys_timer);
++ if (sys_leap != LEAP_NOTINSYNC)
++ next = min(next, revoke_timer);
++#endif /* OPENSSL */
++
++ if (interface_interval)
++ next = min(next, interface_timer);
++
++ next = min(next, stats_timer);
++
++ next -= current_time;
++ if (next <= 0)
++ next = 1;
++finish:
++ ts = timer_base;
++ ts.l_ui += next;
++ L_SUB(&ts, now);
++ LFPTOD(&ts, r);
++#ifdef DEBUG
++ DPRINTF(2, ("timer: timeout %f\n", r));
++#endif
++
++ return r;
++}
++
++int
++timer_elapsed(l_fp now, int timeout)
++{
++ int elapsed;
++
++ L_SUB(&now, &timer_base);
++ elapsed = now.l_i;
++ if (elapsed < 0 || elapsed > timeout + 10) {
++#ifdef DEBUG
++ DPRINTF(2, ("timer: unexpected time jump\n"));
++#endif
++ elapsed = 0;
++ reinit_timer();
++
++ }
++ timer_base.l_ui += elapsed;
++ time_elapsed += elapsed;
++ current_time += elapsed;
++#ifdef DEBUG
++ DPRINTF(2, ("timer: time elapsed %d\n", time_elapsed));
++#endif
++ return time_elapsed;
++}
++
+ /*
+ * timer - event timer
+ */
+@@ -251,11 +364,9 @@ timer(void)
+ * kiss-o'-deatch function and implement the association
+ * polling function..
+ */
+- current_time++;
+- get_systime(&sys_time);
+ if (adjust_timer <= current_time) {
+- adjust_timer += 1;
+- adj_host_clock();
++ adjust_timer += time_elapsed;
++ adj_host_clock(time_elapsed);
+ #ifdef REFCLOCK
+ for (n = 0; n < NTP_HASH_SIZE; n++) {
+ for (peer = peer_hash[n]; peer != 0; peer = next_peer) {
+@@ -286,7 +397,7 @@ timer(void)
+ * 128 s or less.
+ */
+ if (peer->throttle > 0)
+- peer->throttle--;
++ peer->throttle -= min(peer->throttle, time_elapsed);
+ if (peer->nextdate <= current_time) {
+ #ifdef REFCLOCK
+ if (peer->flags & FLAG_REFCLOCK)
+@@ -333,7 +444,7 @@ timer(void)
+ * set.
+ */
+ if (leapsec > 0) {
+- leapsec--;
++ leapsec -= min(leapsec, time_elapsed);
+ if (leapsec == 0) {
+ sys_leap = LEAP_NOWARNING;
+ sys_tai = leap_tai;
+@@ -398,11 +509,15 @@ timer(void)
+ * Finally, write hourly stats.
+ */
+ if (stats_timer <= current_time) {
++ l_fp sys_time;
++ get_systime(&sys_time);
+ stats_timer += HOUR;
+ write_stats();
+ if (sys_tai != 0 && sys_time.l_ui > leap_expire)
+ report_event(EVNT_LEAPVAL, NULL, NULL);
+ }
++
++ time_elapsed = 0;
+ }
+
+
+diff -up ntp-4.2.6p1/ntpd/ntpd.c.sleep ntp-4.2.6p1/ntpd/ntpd.c
+--- ntp-4.2.6p1/ntpd/ntpd.c.sleep 2010-03-10 19:27:46.000000000 +0100
++++ ntp-4.2.6p1/ntpd/ntpd.c 2010-03-10 19:27:46.000000000 +0100
+@@ -195,8 +195,6 @@ extern const char *Version;
+
+ char const *progname;
+
+-int was_alarmed;
+-
+ #ifdef DECL_SYSCALL
+ /*
+ * We put this here, since the argument profile is syscall-specific
+@@ -1033,7 +1031,7 @@ getgroup:
+ #else /* normal I/O */
+
+ BLOCK_IO_AND_ALARM();
+- was_alarmed = 0;
++
+ for (;;)
+ {
+ # if !defined(HAVE_SIGNALED_IO)
+@@ -1041,42 +1039,39 @@ getgroup:
+ extern int maxactivefd;
+
+ fd_set rdfdes;
+- int nfound;
+-# endif
++ int nfound, time_elapsed;
+
+- if (alarm_flag) /* alarmed? */
+- {
+- was_alarmed = 1;
+- alarm_flag = 0;
+- }
++ time_elapsed = 0;
++# endif
+
+- if (!was_alarmed && has_full_recv_buffer() == ISC_FALSE)
++ if (has_full_recv_buffer() == ISC_FALSE)
+ {
+ /*
+ * Nothing to do. Wait for something.
+ */
+ # ifndef HAVE_SIGNALED_IO
++ double timeout;
++
+ rdfdes = activefds;
+-# if defined(VMS) || defined(SYS_VXWORKS)
+- /* make select() wake up after one second */
+- {
+- struct timeval t1;
++ get_systime(&now);
++ timeout = get_timeout(&now);
+
+- t1.tv_sec = 1; t1.tv_usec = 0;
++ if (timeout > 0.0) {
++ struct timeval t1;
++
++ t1.tv_sec = timeout;
++ t1.tv_usec = (timeout - t1.tv_sec) * 1000000;
+ nfound = select(maxactivefd+1, &rdfdes, (fd_set *)0,
+ (fd_set *)0, &t1);
+- }
+-# else
+- nfound = select(maxactivefd+1, &rdfdes, (fd_set *)0,
+- (fd_set *)0, (struct timeval *)0);
+-# endif /* VMS */
+- if (nfound > 0)
+- {
+- l_fp ts;
++ get_systime(&now);
++ } else
++ nfound = 0;
+
+- get_systime(&ts);
++ time_elapsed = timer_elapsed(now, timeout);
+
+- (void)input_handler(&ts);
++ if (nfound > 0)
++ {
++ (void)input_handler(&now);
+ }
+ else if (nfound == -1 && errno != EINTR)
+ msyslog(LOG_ERR, "select() error: %m");
+@@ -1085,17 +1080,13 @@ getgroup:
+ msyslog(LOG_DEBUG, "select(): nfound=%d, error: %m", nfound);
+ # endif /* DEBUG */
+ # else /* HAVE_SIGNALED_IO */
++# error not supported by sleep patch
+
+ wait_for_signal();
+ # endif /* HAVE_SIGNALED_IO */
+- if (alarm_flag) /* alarmed? */
+- {
+- was_alarmed = 1;
+- alarm_flag = 0;
+- }
+ }
+
+- if (was_alarmed)
++ if (time_elapsed > 0)
+ {
+ UNBLOCK_IO_AND_ALARM();
+ /*
+@@ -1103,7 +1094,6 @@ getgroup:
+ * to process expiry.
+ */
+ timer();
+- was_alarmed = 0;
+ BLOCK_IO_AND_ALARM();
+ }
+
+@@ -1121,19 +1111,8 @@ getgroup:
+ rbuf = get_full_recv_buffer();
+ while (rbuf != NULL)
+ {
+- if (alarm_flag)
+- {
+- was_alarmed = 1;
+- alarm_flag = 0;
+- }
+ UNBLOCK_IO_AND_ALARM();
+
+- if (was_alarmed)
+- { /* avoid timer starvation during lengthy I/O handling */
+- timer();
+- was_alarmed = 0;
+- }
+-
+ /*
+ * Call the data procedure to handle each received
+ * packet.
diff --git a/SOURCES/ntp-4.2.6p3-bcast.patch b/SOURCES/ntp-4.2.6p3-bcast.patch
new file mode 100644
index 0000000..57581f3
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p3-bcast.patch
@@ -0,0 +1,93 @@
+diff -up ntp-4.2.6p3/ntpd/ntp_io.c.bcast ntp-4.2.6p3/ntpd/ntp_io.c
+--- ntp-4.2.6p3/ntpd/ntp_io.c.bcast 2010-12-25 10:40:36.000000000 +0100
++++ ntp-4.2.6p3/ntpd/ntp_io.c 2011-01-05 17:46:13.820049150 +0100
+@@ -151,6 +151,8 @@ int ninterfaces; /* Total number of in
+
+ int disable_dynamic_updates; /* scan interfaces once only */
+
++static int pktinfo_status = 0; /* is IP_PKTINFO on wildipv4 iface enabled? */
++
+ #ifdef REFCLOCK
+ /*
+ * Refclock stuff. We keep a chain of structures with data concerning
+@@ -2254,6 +2256,17 @@ set_reuseaddr(
+ #endif /* ! SO_EXCLUSIVEADDRUSE */
+ }
+
++static void
++set_pktinfo(int flag)
++{
++ if (wildipv4 == NULL)
++ return;
++ if (setsockopt(wildipv4->fd, SOL_IP, IP_PKTINFO, &flag, sizeof (flag))) {
++ msyslog(LOG_ERR, "set_pktinfo: setsockopt(IP_PKTINFO, %s) failed: %m", flag ? "on" : "off");
++ } else
++ pktinfo_status = flag;
++}
++
+ /*
+ * This is just a wrapper around an internal function so we can
+ * make other changes as necessary later on
+@@ -2659,6 +2672,7 @@ io_setbclient(void)
+ }
+ }
+ set_reuseaddr(0);
++ set_pktinfo(1);
+ if (nif > 0)
+ DPRINTF(1, ("io_setbclient: Opened broadcast clients\n"));
+ else if (!nif)
+@@ -2685,6 +2699,7 @@ io_unsetbclient(void)
+ continue;
+ socket_broadcast_disable(ep, &ep->sin);
+ }
++ set_pktinfo(0);
+ }
+
+ /*
+@@ -3392,7 +3407,8 @@ read_network_packet(
+ #ifdef HAVE_TIMESTAMP
+ struct msghdr msghdr;
+ struct iovec iovec;
+- char control[TIMESTAMP_CTLMSGBUF_SIZE];
++ char control[sizeof (struct cmsghdr) * 2 + sizeof (struct timeval) +
++ sizeof (struct in_pktinfo) + 32];
+ #endif
+
+ /*
+@@ -3403,7 +3419,7 @@ read_network_packet(
+ */
+
+ rb = get_free_recv_buffer();
+- if (NULL == rb || itf->ignore_packets) {
++ if (NULL == rb || (itf->ignore_packets && !(pktinfo_status && itf == wildipv4))) {
+ char buf[RX_BUFF_SIZE];
+ sockaddr_u from;
+
+@@ -3463,6 +3479,27 @@ read_network_packet(
+ return (buflen);
+ }
+
++ if (pktinfo_status && itf->ignore_packets && itf == wildipv4) {
++ /* check for broadcast on 255.255.255.255, exception allowed on wildipv4 */
++ struct cmsghdr *cmsg;
++ struct in_pktinfo *pktinfo = NULL;
++
++ if ((cmsg = CMSG_FIRSTHDR(&msghdr)))
++ do {
++ if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_PKTINFO)
++ pktinfo = (struct in_pktinfo *) CMSG_DATA(cmsg);
++ } while ((cmsg = CMSG_NXTHDR(&msghdr, cmsg)));
++ if (pktinfo && pktinfo->ipi_addr.s_addr == INADDR_BROADCAST) {
++ DPRINTF(4, ("INADDR_BROADCAST\n"));
++ } else {
++ DPRINTF(4, ("%s on (%lu) fd=%d from %s\n", "ignore",
++ free_recvbuffs(), fd, stoa(&rb->recv_srcadr)));
++ packets_ignored++;
++ freerecvbuf(rb);
++ return (buflen);
++ }
++ }
++
+ DPRINTF(3, ("read_network_packet: fd=%d length %d from %s\n",
+ fd, buflen, stoa(&rb->recv_srcadr)));
+
diff --git a/SOURCES/ntp-4.2.6p3-broadcastdelay.patch b/SOURCES/ntp-4.2.6p3-broadcastdelay.patch
new file mode 100644
index 0000000..f9c1929
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p3-broadcastdelay.patch
@@ -0,0 +1,31 @@
+==== ntpd/ntp_proto.c ====
+2010-10-22 01:55:45-04:00, stenn@deacon.udel.edu +2 -5
+ [Bug 1670] Fix peer->bias and broadcastdelay
+
+--- 1.307/ntpd/ntp_proto.c 2010-10-11 21:06:05 -07:00
++++ 1.308/ntpd/ntp_proto.c 2010-10-21 22:55:45 -07:00
+@@ -929,7 +929,6 @@ receive(
+
+ } else {
+ peer->delay = sys_bdelay;
+- peer->bias = -sys_bdelay / 2.;
+ }
+ break;
+ }
+@@ -1570,7 +1569,6 @@ process_packet(
+ p_del = fabs(t21 - t34);
+ p_offset = (t21 + t34) / 2.;
+ }
+- p_offset += peer->bias;
+ p_disp = LOGTOD(sys_precision) + LOGTOD(peer->precision) +
+ clock_phi * p_del;
+
+@@ -1647,7 +1645,7 @@ process_packet(
+ /*
+ * That was awesome. Now hand off to the clock filter.
+ */
+- clock_filter(peer, p_offset, p_del, p_disp);
++ clock_filter(peer, p_offset + peer->bias, p_del, p_disp);
+
+ /*
+ * If we are in broadcast calibrate mode, return to broadcast
diff --git a/SOURCES/ntp-4.2.6p4-droproot.patch b/SOURCES/ntp-4.2.6p4-droproot.patch
new file mode 100644
index 0000000..1d953d1
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p4-droproot.patch
@@ -0,0 +1,207 @@
+diff -up ntp-4.2.6p4/html/ntpdate.html.droproot ntp-4.2.6p4/html/ntpdate.html
+--- ntp-4.2.6p4/html/ntpdate.html.droproot 2011-07-11 04:18:25.000000000 +0200
++++ ntp-4.2.6p4/html/ntpdate.html 2011-10-05 15:47:29.643634928 +0200
+@@ -18,7 +18,7 @@
+
+ Disclaimer: The functionality of this program is now available in the ntpd program. See the -q command line option in the ntpd - Network Time Protocol (NTP) daemon page. After a suitable period of mourning, the ntpdate program is to be retired from this distribution
+ Synopsis
+- ntpdate [ -46bBdqsuv ] [ -a key ] [ -e authdelay ] [ -k keyfile ] [ -o version ] [ -p samples ] [ -t timeout ] server [ ... ]
++ ntpdate [ -46bBdqsuv ] [ -a key ] [ -e authdelay ] [ -k keyfile ] [ -o version ] [ -p samples ] [ -t timeout ] [ -U user_name ] server [ ... ]
+ Description
+ ntpdate sets the local date and time by polling the Network Time Protocol (NTP) server(s) given as the server arguments to determine the correct time. It must be run as root on the local host. A number of samples are obtained from each of the servers specified and a subset of the NTP clock filter and selection algorithms are applied to select the best of these. Note that the accuracy and reliability of ntpdate depends on the number of servers, the number of polls each time it is run and the interval between runs.
+ ntpdate can be run manually as necessary to set the host clock, or it can be run from the host startup script to set the clock at boot time. This is useful in some cases to set the clock initially before starting the NTP daemon ntpd. It is also possible to run ntpdate from a cron script. However, it is important to note that ntpdate with contrived cron scripts is no substitute for the NTP daemon, which uses sophisticated algorithms to maximize accuracy and reliability while minimizing resource use. Finally, since ntpdate does not discipline the host clock frequency as does ntpd, the accuracy using ntpdate is limited.
+@@ -58,6 +58,10 @@
+ Direct ntpdate to use an unprivileged port for outgoing packets. This is most useful when behind a firewall that blocks incoming traffic to privileged ports, and you want to synchronize with hosts beyond the firewall. Note that the -d option always uses unprivileged ports.
+ -v
+ Be verbose. This option will cause ntpdate's version identification string to be logged.
++ -U user_name
++ ntpdate process drops root privileges and changes user ID to
++ user_name and group ID to the primary group of
++ server_user.
+
+ Diagnostics
+ ntpdate's exit status is zero if it finds a server and updates the clock, and nonzero otherwise.
+diff -up ntp-4.2.6p4/ntpdate/ntpdate.c.droproot ntp-4.2.6p4/ntpdate/ntpdate.c
+--- ntp-4.2.6p4/ntpdate/ntpdate.c.droproot 2011-05-25 07:06:09.000000000 +0200
++++ ntp-4.2.6p4/ntpdate/ntpdate.c 2011-10-05 15:45:39.570555972 +0200
+@@ -49,6 +49,12 @@
+
+ #include
+
++/* Linux capabilities */
++#include
++#include
++#include
++#include
++
+ #ifdef SYS_VXWORKS
+ # include "ioLib.h"
+ # include "sockLib.h"
+@@ -153,6 +159,11 @@ int simple_query = 0;
+ int unpriv_port = 0;
+
+ /*
++ * Use capabilities to drop privileges and switch uids
++ */
++char *server_user;
++
++/*
+ * Program name.
+ */
+ char *progname;
+@@ -294,6 +305,88 @@ void clear_globals()
+ static ni_namelist *getnetinfoservers (void);
+ #endif
+
++/* This patch is adapted (copied) from Chris Wings drop root patch
++ * for xntpd.
++ */
++void drop_root(uid_t server_uid, gid_t server_gid)
++{
++ cap_t caps;
++
++ if (prctl(PR_SET_KEEPCAPS, 1)) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "prctl(PR_SET_KEEPCAPS, 1) failed");
++ }
++ else {
++ fprintf(stderr, "prctl(PR_SET_KEEPCAPS, 1) failed.\n");
++ }
++ exit(1);
++ }
++
++ if ( setgroups(0, NULL) == -1 ) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "setgroups failed.");
++ }
++ else {
++ fprintf(stderr, "setgroups failed.\n");
++ }
++ exit(1);
++ }
++
++ if ( setegid(server_gid) == -1 || seteuid(server_uid) == -1 ) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "setegid/seteuid to uid=%d/gid=%d failed.", server_uid,
++ server_gid);
++ }
++ else {
++ fprintf(stderr, "setegid/seteuid to uid=%d/gid=%d failed.\n", server_uid,
++ server_gid);
++ }
++ exit(1);
++ }
++
++ caps = cap_from_text("cap_sys_time=epi");
++ if (caps == NULL) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "cap_from_text failed.");
++ }
++ else {
++ fprintf(stderr, "cap_from_text failed.\n");
++ }
++ exit(1);
++ }
++
++ if (cap_set_proc(caps) == -1) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "cap_set_proc failed.");
++ }
++ else {
++ fprintf(stderr, "cap_set_proc failed.\n");
++ }
++ exit(1);
++ }
++
++ /* Try to free the memory from cap_from_text */
++ cap_free( caps );
++
++ if ( setregid(server_gid, server_gid) == -1 ||
++ setreuid(server_uid, server_uid) == -1 ) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "setregid/setreuid to uid=%d/gid=%d failed.",
++ server_uid, server_gid);
++ }
++ else {
++ fprintf(stderr, "setregid/setreuid to uid=%d/gid=%d failed.\n",
++ server_uid, server_gid);
++ }
++ exit(1);
++ }
++
++ if (syslogit) {
++ msyslog(LOG_DEBUG, "running as uid(%d)/gid(%d) euid(%d)/egid(%d).",
++ getuid(), getgid(), geteuid(), getegid());
++ }
++}
++
+ /*
+ * Main program. Initialize us and loop waiting for I/O and/or
+ * timer expiries.
+@@ -341,6 +434,8 @@ ntpdatemain (
+
+ init_lib(); /* sets up ipv4_works, ipv6_works */
+
++ server_user = NULL;
++
+ /* Check to see if we have IPv6. Otherwise default to IPv4 */
+ if (!ipv6_works)
+ ai_fam_templ = AF_INET;
+@@ -352,7 +447,7 @@ ntpdatemain (
+ /*
+ * Decode argument list
+ */
+- while ((c = ntp_getopt(argc, argv, "46a:bBde:k:o:p:qst:uv")) != EOF)
++ while ((c = ntp_getopt(argc, argv, "46a:bBde:k:o:p:qst:uvU:")) != EOF)
+ switch (c)
+ {
+ case '4':
+@@ -429,6 +524,14 @@ ntpdatemain (
+ case 'u':
+ unpriv_port = 1;
+ break;
++ case 'U':
++ if (ntp_optarg) {
++ server_user = strdup(ntp_optarg);
++ }
++ else {
++ ++errflg;
++ }
++ break;
+ case '?':
+ ++errflg;
+ break;
+@@ -438,7 +541,7 @@ ntpdatemain (
+
+ if (errflg) {
+ (void) fprintf(stderr,
+- "usage: %s [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-t timeo] server ...\n",
++ "usage: %s [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-t timeo] [-U username] server ...\n",
+ progname);
+ exit(2);
+ }
+@@ -544,6 +647,24 @@ ntpdatemain (
+ initializing = 0;
+ was_alarmed = 0;
+
++ if (server_user) {
++ struct passwd *pwd = NULL;
++
++ /* Lookup server_user uid/gid before chroot/chdir */
++ pwd = getpwnam( server_user );
++ if ( pwd == NULL ) {
++ if (syslogit) {
++ msyslog(LOG_ERR, "Failed to lookup user '%s'.", server_user);
++ }
++ else {
++ fprintf(stderr, "Failed to lookup user '%s'.\n", server_user);
++ }
++ exit(1);
++ }
++ drop_root(pwd->pw_uid, pwd->pw_gid);
++ }
++
++
+ while (complete_servers < sys_numservers) {
+ #ifdef HAVE_POLL_H
+ struct pollfd* rdfdes;
diff --git a/SOURCES/ntp-4.2.6p4-htmldoc.patch b/SOURCES/ntp-4.2.6p4-htmldoc.patch
new file mode 100644
index 0000000..8558224
--- /dev/null
+++ b/SOURCES/ntp-4.2.6p4-htmldoc.patch
@@ -0,0 +1,172 @@
+diff -up ntp-4.2.6p5/html/accopt.html.htmldoc ntp-4.2.6p5/html/accopt.html
+--- ntp-4.2.6p5/html/accopt.html.htmldoc 2009-12-09 08:36:36.000000000 +0100
++++ ntp-4.2.6p5/html/accopt.html 2015-02-10 14:55:24.467289637 +0100
+@@ -94,8 +94,10 @@ time) in log2 s with default
+
+ restrict address [mask mask] [flag][...]
+ The address argument expressed in dotted-quad form is the
+- address of a host or network. Alternatively, the address argument
+- can be a valid host DNS name. The mask argument expressed in
++ address of a host or network. Alternatively, the address argument can be a
++ valid host DNS name, but it must be resolvable at the time when ntpd is started and
++ if it's resolved to multiple addresses, only the first address will be added to the list.
++ The mask argument expressed in
+ dotted-quad form defaults to 255.255.255.255, meaning that the address is
+ treated as the address of an individual host. A default entry (address 0.0.0.0,
+ mask 0.0.0.0) is always included and is always the first entry in the list.
+diff -up ntp-4.2.6p5/html/authopt.html.htmldoc ntp-4.2.6p5/html/authopt.html
+--- ntp-4.2.6p5/html/authopt.html.htmldoc 2011-07-11 04:18:25.000000000 +0200
++++ ntp-4.2.6p5/html/authopt.html 2013-03-28 18:04:38.581260191 +0100
+@@ -364,7 +364,7 @@ UTC
+ are left unspecified, the default names are used as described below. Unless
+ the complete path and name of the file are specified, the location of a file
+ is relative to the keys directory specified in the keysdir configuration
+- command or default /usr/local/etc. Following are the options.
++ command or default /etc/ntp/crypto. Following are the options.
+
+
+
+@@ -396,7 +396,7 @@ UTC
+ - Specifies the complete path to the MD5 key file containing the keys and key IDs used by ntpd, ntpq and ntpdc when operating with symmetric key cryptography. This is the same operation as the -k command line option. Note that the directory path for Autokey media is specified by the keysdir command.
+
+ - keysdir pathK
+-- This command specifies the default directory path for Autokey cryptographic keys, parameters and certificates. The default is /usr/local/etc/. Note that the path for the symmetric keys file is specified by the keys command.
++- This command specifies the default directory path for Autokey cryptographic keys, parameters and certificates. The default is /etc/ntp/crypto. Note that the path for the symmetric keys file is specified by the keys command.
+
+ - requestkey keyid
+ - Specifies the key ID to use with the
+diff -up ntp-4.2.6p5/html/keygen.html.htmldoc ntp-4.2.6p5/html/keygen.html
+--- ntp-4.2.6p5/html/keygen.html.htmldoc 2011-07-11 04:18:26.000000000 +0200
++++ ntp-4.2.6p5/html/keygen.html 2013-03-28 18:04:38.581260191 +0100
+@@ -206,7 +206,6 @@
+
All cryptographically sound key generation schemes must have means to randomize the entropy seed used to initialize the internal pseudo-random number generator used by the OpenSSL library routines. If a site supports ssh, it is very likely that means to do this are already available. The entropy seed used by the OpenSSL library is contained in a file, usually called .rnd, which must be available when starting the ntp-keygen program or ntpd daemon.
+
+ The OpenSSL library looks for the file using the path specified by the RANDFILE environment variable in the user home directory, whether root or some other user. If the RANDFILE environment variable is not present, the library looks for the .rnd file in the user home directory. Since both the ntp-keygen program and ntpd daemon must run as root, the logical place to put this file is in /.rnd or /root/.rnd. If the file is not available or cannot be written, the program exits with a message to the system log.
+-On systems that provide /dev/urandom, the randomness device is used instead and the file specified by the randfile subcommand or the RANDFILE environment variable is ignored.
+
+ Cryptographic Data Files
+
+diff -up ntp-4.2.6p5/html/ntpd.html.htmldoc ntp-4.2.6p5/html/ntpd.html
+--- ntp-4.2.6p5/html/ntpd.html.htmldoc 2011-07-11 04:18:26.000000000 +0200
++++ ntp-4.2.6p5/html/ntpd.html 2017-03-22 11:08:46.864272061 +0100
+@@ -35,12 +35,12 @@
+ ntpd [ -46aAbdDgLnNqx ] [ -c conffile ] [ -f driftfile ] [ -i jaildir ] [ -I iface ] [ -k keyfile ] [ -l logfile ] [ -p pidfile ] [ -P priority ] [ -r broadcastdelay ] [ -s statsdir ] [ -t key ] [ -u user[:group] ] [ -U interface_update_interval ] [ -v variable ] [ -V variable ]
+ Description
+ The ntpd program is an operating system daemon that synchronises the system clock with remote NTP time servers or local reference clocks. It is a complete implementation of the Network Time Protocol (NTP) version 4, but also retains compatibility with version 3, as defined by RFC-1305, and version 1 and 2, as defined by RFC-1059 and RFC-1119, respectively. The program can operate in any of several modes, as described on the Association Management page, and with both symmetric key and public key cryptography, as described on the Authentication Options page.
+- The ntpd program ordinarily requires a configuration file as desccribe on the Configuration Commands and Options collection above. However a client can discover remote servers and configure them automatically. This makes it possible to deploy a fleet of workstations without specifying configuration details specific to the local environment. Further details are on the Automatic Server Discovery page.
++ The ntpd program ordinarily requires a configuration file as described on the Configuration Commands and Options collection above. However a client can discover remote servers and configure them automatically. This makes it possible to deploy a fleet of workstations without specifying configuration details specific to the local environment. Further details are on the Automatic Server Discovery page.
+ Once the NTP software distribution has been compiled and installed and the configuration file constructed, the next step is to verify correct operation and fix any bugs that may result. Usually, the command line that starts the daemon is included in the system startup file, so it is executed only at system boot time; however, the daemon can be stopped and restarted from root at any time. Once started, the daemon will begin sending and receiving messages, as specified in the configuration file.
+ Setting the Time and Frequency
+ The ntpd program operates by exchanging messages with one or more servers at designated intervals ranging from about one minute to about 17 minutes. When started, the program requires several exchanges while the algorithms accumulate and groom the data before setting the clock. The initial delay to set the clock can be reduced using options on the Server Options page.
+- Most compters today incorporate a time-of-year (TOY) chip to maintain the time during periods when the power is off. When the machine is booted, the chip is used to initialize the operating system time. In case there is no TOY chip or the TOY time is more than 1000 s from the server time, ntpd assumes something must be terribly wrong and exits with a panic message to the system operator. With the -g option the clock will be initially set to the server time regardless of the chip time. However, once the clock has been set, an error greater than 1000 s will cause ntpd to exit anyway.
+- Under ordinary conditions, ntpd slews the clock so that the time is effectively continuous and never runs backwards. If due to extreme network congestion an error spike exceeds the step threshold, by default 128 ms, the spike is discarded. However, if the error persists for more than the stepout threshold, by default 900 s, the system clock is stepped to the correct value. In practice the need for a step has is extremely rare and almost always the result of a hardware failure. With the -x option the step threshold is increased to 600 s. Other options are available using the tinker command on the Miscellaneous Options page.
++ Most computers today incorporate a time-of-year (TOY) chip to maintain the time during periods when the power is off. When the machine is booted, the chip is used to initialize the operating system time. In case there is no TOY chip or the TOY time is more than 1000 s from the server time, ntpd assumes something must be terribly wrong and exits with a panic message to the system operator. With the -g option the clock will be initially set to the server time regardless of the chip time. However, once the clock has been set, an error greater than 1000 s will cause ntpd to exit anyway.
++ Under ordinary conditions, ntpd slews the clock so that the time is effectively continuous and never runs backwards. If due to extreme network congestion an error spike exceeds the step threshold, by default 128 ms, the spike is discarded. However, if the error persists for more than the stepout threshold, by default 900 s, the system clock is stepped to the correct value. In practice the need for a step is extremely rare and is almost always the result of a hardware failure. With the -x option the step threshold is increased to 600 s. Other options are available using the tinker command on the Miscellaneous Options page.
+ The issues should be carefully considered before using these options. The maximum slew rate possible is limited to 500 parts-per-million (PPM) by the Unix kernel. As a result, the clock can take 2000 s for each second the clock is outside the acceptable range. During this interval the clock will not be consistent with any other network clock and the system cannot be used for distributed applications that require correctly synchronized network time.
+ The frequency file, usually called ntp.drift, contains the latest estimate of clock frequency. If this file does not exist when ntpd is started, it enters a special mode designed to measure the particular frequency directly. The measurement takes 15 minutes, after which the frequency is set and ntpd resumes normal mode where the time and frequency are continuously adjusted. The frequency file is updated at intervals of an hour or more depending on the measured clock stability.
+ Operating Modes
+@@ -70,7 +70,7 @@
+ tally the leap warning bits of surviving servers and reference clocks.
+ When a majority of the survivors show warning, a leap is programmed
+ at the end of the current month. During the month and day of insertion,
+- they operate as above. In this way the leap is is propagated at all
++ they operate as above. In this way the leap is propagated at all
+ dependent servers and clients.
+ Additional Features
+ A new experimental feature called interleaved modes can be used in NTP
+@@ -143,26 +143,8 @@
+
- Specify a user, and optionally a group, to switch to. This option is only available if the OS supports running the server without full root privileges. Currently, this option is supported under NetBSD (configure with --enable-clockctl) and Linux (configure with --enable-linuxcaps).
+ - -U interface update interval
+ - Number of seconds to wait between interface list scans to pick up new and delete network interface. Set to 0 to disable dynamic interface list updating. The default is to scan every 5 minutes.
+- - -v variable
+- - -V variable
+- - Add a system variable listed by default.
+ - -x
+ - Normally, the time is slewed if the offset is less than the step threshold, which is 128 ms by default, and stepped if above the threshold. This option sets the threshold to 600 s, which is well within the accuracy window to set the clock manually. Note: Since the slew rate of typical Unix kernels is limited to 0.5 ms/s, each second of adjustment requires an amortization interval of 2000 s. Thus, an adjustment as much as 600 s will take almost 14 days to complete. This option can be used with the -g and -q options. See the tinker command for other options. Note: The kernel time discipline is disabled with this option.
+- - --pccfreq frequency
+- - Substitute processor cycle counter for QueryPerformanceCounter unconditionally
+- using the given frequency (in Hz). --pccfreq can be used on systems
+- which do not use the PCC to implement QueryPerformanceCounter
+- and have a fixed PCC frequency. The frequency specified must
+- be accurate within 0.5 percent. --usepcc is equivalent on many systems and should
+- be tried first, as it does not require determining the frequency
+- of the processor cycle counter. For x86-compatible processors, the PCC is
+- also referred to as RDTSC, which is the assembly-language instruction to retrieve
+- the current value. (Windows only)
+- - --usepcc
+- - Substitute processor cycle counter for QueryPerformanceCounter if they
+- appear equivalent. This option should be used only if the PCC
+- frequency is fixed. Power-saving functionality on many laptops varies the
+- PCC frequency. (Windows only)
+
+ The Configuration File
+ Ordinarily, ntpd reads the ntp.conf configuration file at startup in order to determine the synchronization sources and operating modes. It is also possible to specify a working, although limited, configuration entirely on the command line, obviating the need for a configuration file. This may be particularly useful when the local host is to be configured as a broadcast client, with servers determined by listening to broadcasts at run time.
+@@ -214,14 +196,14 @@
+
+
+ statistics path |
+- /var/NTP |
++ /var/log/ntpstats/ |
+ -s |
+ statsdir |
+
+
+ keys path |
+- /usr/local/etc |
+- -k |
++ /etc/ntp/crypto |
++ none |
+ keysdir |
+
+
+diff -up ntp-4.2.6p5/html/ntpdate.html.htmldoc ntp-4.2.6p5/html/ntpdate.html
+--- ntp-4.2.6p5/html/ntpdate.html.htmldoc 2013-03-28 18:04:38.556260210 +0100
++++ ntp-4.2.6p5/html/ntpdate.html 2013-03-28 18:04:38.582260190 +0100
+@@ -43,7 +43,7 @@
+ -e authdelay
+ Specify the processing delay to perform an authentication function as the value authdelay, in seconds and fraction (see ntpd for details). This number is usually small enough to be negligible for most purposes, though specifying a value may improve timekeeping on very slow CPU's.
+ -k keyfile
+- Specify the path for the authentication key file as the string keyfile. The default is /etc/ntp.keys. This file should be in the format described in ntpd.
++ Specify the path for the authentication key file as the string keyfile. The default is /etc/ntp/keys. This file should be in the format described in ntpd.
+ -o version
+ Specify the NTP version for outgoing packets as the integer version, which can be 1 or 2. The default is 4. This allows ntpdate to be used with older NTP versions.
+ -p samples
+@@ -66,7 +66,7 @@
+ Diagnostics
+ ntpdate's exit status is zero if it finds a server and updates the clock, and nonzero otherwise.
+ Files
+- /etc/ntp.keys - encryption keys used by ntpdate.
++ /etc/ntp/keys - encryption keys used by ntpdate.
+ Bugs
+ The slew adjustment is actually 50% larger than the measured offset, since this (it is argued) will tend to keep a badly drifting clock more accurate. This is probably not a good idea and may cause a troubling hunt for some values of the kernel variables tick and tickadj.
+
+diff -up ntp-4.2.6p5/html/ntptime.html.htmldoc ntp-4.2.6p5/html/ntptime.html
+--- ntp-4.2.6p5/html/ntptime.html.htmldoc 2009-12-09 08:36:36.000000000 +0100
++++ ntp-4.2.6p5/html/ntptime.html 2013-03-28 18:13:56.921842773 +0100
+@@ -17,7 +17,7 @@
+
+
+ Synopsis
+- ntptime [ -chr ] [ -e est_error ] [ -f frequency ] [ -m max_error ] [ -o offset ] [ -s status ] [ -t time_constant]
++ ntptime [ -MNchr ] [ -e est_error ] [ -f frequency ] [ -m max_error ] [ -o offset ] [ -s status ] [ -t time_constant] [ -T tai_offset ]
+ Description
+ This program is useful only with special kernels described in the A Kernel Model for Precision Timekeeping page. It reads and displays time-related kernel variables using the ntp_gettime() system call. A similar display can be obtained using the ntpdc program and kerninfo command.
+ Options
+@@ -40,9 +40,15 @@
+ Specify clock status. Better know what you are doing.
+ -t time_constant
+ Specify time constant, an integer in the range 0-10.
++ -M
++ Switch to microsecond mode.
++ -N
++ Switch to nanosecond mode.
++ -T tai_offset
++ Set TAI offset.
+
+
+
+