Portable build framework for OpenNTPD
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

75 lines
2.0 KiB

From f212e683592026fdfe40e24eca9afd21da54eafb Mon Sep 17 00:00:00 2001
From: Brent Cook <busterb@gmail.com>
Date: Sat, 19 Jan 2019 04:25:44 -0600
Subject: [PATCH 14/18] use adjtimex over adjtime, check return value and
adjust offset as needed
---
src/usr.sbin/ntpd/ntpd.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/src/usr.sbin/ntpd/ntpd.c b/src/usr.sbin/ntpd/ntpd.c
index daa077dcda..5817fff78a 100644
--- a/src/usr.sbin/ntpd/ntpd.c
+++ b/src/usr.sbin/ntpd/ntpd.c
@@ -17,6 +17,9 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef HAVE_ADJTIMEX
+#include <sys/timex.h>
+#endif
#include <sys/types.h>
#include <sys/resource.h>
#include <sys/socket.h>
@@ -510,21 +513,44 @@ reset_adjtime(void)
int
ntpd_adjtime(double d)
{
- struct timeval tv, olddelta;
int synced = 0;
static int firstadj = 1;
+ double threshold = (double)LOG_NEGLIGIBLE_ADJTIME / 1000;
d += getoffset();
- if (d >= (double)LOG_NEGLIGIBLE_ADJTIME / 1000 ||
- d <= -1 * (double)LOG_NEGLIGIBLE_ADJTIME / 1000)
+ if (d >= threshold || d <= -1 * threshold)
log_info("adjusting local clock by %fs", d);
else
log_debug("adjusting local clock by %fs", d);
+
+#ifdef HAVE_ADJTIMEX
+ int rc;
+
+ long offset = d * 1000000;
+ struct timex tx = { 0 };
+ tx.offset = offset;
+ tx.modes = ADJ_OFFSET_SINGLESHOT | ADJ_STATUS;
+
+ do {
+ rc = adjtimex(&tx);
+ } while (rc == TIME_ERROR && (tx.offset /= 2) > threshold);
+
+ if (rc == TIME_ERROR) {
+ if ((tx.status & ~STA_UNSYNC))
+ log_warn("adjtimex returned TIME_ERROR");
+ } else if (rc < 0) {
+ log_warn("adjtimex failed");
+ } else if (!firstadj && tx.offset == offset) {
+ synced = 1;
+ }
+#else
+ struct timeval tv, olddelta;
d_to_tv(d, &tv);
if (adjtime(&tv, &olddelta) == -1)
log_warn("adjtime failed");
else if (!firstadj && olddelta.tv_sec == 0 && olddelta.tv_usec == 0)
synced = 1;
+#endif
firstadj = 0;
update_time_sync_status(synced);
return (synced);
--
2.27.0