summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/libntp/prettydate.c
diff options
context:
space:
mode:
authorroberto <roberto@FreeBSD.org>2008-08-22 15:58:00 +0000
committerroberto <roberto@FreeBSD.org>2008-08-22 15:58:00 +0000
commitb85c7169a740b2edf0106ad59fdaa1b0160f823c (patch)
tree2b9fb7f64eacb322e95695e412c923e97ba33e88 /contrib/ntp/libntp/prettydate.c
parent1d197cfe9feac6bc29537d8e53c30b6435937b95 (diff)
parent7a6072eb585696f8856cd498c3fd194cf49f14c6 (diff)
downloadFreeBSD-src-b85c7169a740b2edf0106ad59fdaa1b0160f823c.zip
FreeBSD-src-b85c7169a740b2edf0106ad59fdaa1b0160f823c.tar.gz
Merge ntpd & friends 4.2.4p5 from vendor/ntp/dist into head. Next commit
will update usr.sbin/ntp to match this. MFC after: 2 weeks
Diffstat (limited to 'contrib/ntp/libntp/prettydate.c')
-rw-r--r--contrib/ntp/libntp/prettydate.c82
1 files changed, 73 insertions, 9 deletions
diff --git a/contrib/ntp/libntp/prettydate.c b/contrib/ntp/libntp/prettydate.c
index 9710c84..55adf64 100644
--- a/contrib/ntp/libntp/prettydate.c
+++ b/contrib/ntp/libntp/prettydate.c
@@ -17,6 +17,60 @@ static const char *days[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
+/* Helper function to handle possible wraparound of the ntp epoch.
+
+ Works by assuming that the localtime/gmtime library functions
+ have been updated so that they work
+*/
+
+#define MAX_EPOCH_NR 1000
+
+struct tm *
+ntp2unix_tm(
+ u_long ntp, int local
+ )
+{
+ time_t t, curr;
+ struct tm *tm;
+ int curr_year, epoch_nr;
+
+ /* First get the current year: */
+ curr = time(NULL);
+ tm = local ? localtime(&curr) : gmtime(&curr);
+ if (!tm) return NULL;
+
+ curr_year = 1900 + tm->tm_year;
+
+ /* Convert the ntp timestamp to a unix utc seconds count: */
+ t = (time_t) ntp - JAN_1970;
+
+ /* Check that the ntp timestamp is not before a 136 year window centered
+ around the current year:
+
+ Failsafe in case of an infinite loop:
+ Allow up to 1000 epochs of 136 years each!
+ */
+ for (epoch_nr = 0; epoch_nr < MAX_EPOCH_NR; epoch_nr++) {
+ tm = local ? localtime(&t) : gmtime(&t);
+
+#if SIZEOF_TIME_T < 4
+# include "Bletch: sizeof(time_t) < 4!"
+#endif
+
+#if SIZEOF_TIME_T == 4
+ /* If 32 bits, then year is 1970-2038, so no sense looking */
+ epoch_nr = MAX_EPOCH_NR;
+#else /* SIZEOF_TIME_T > 4 */
+ /* Check that the resulting year is in the correct epoch: */
+ if (1900 + tm->tm_year > curr_year - 68) break;
+
+ /* Epoch wraparound: Add 2^32 seconds! */
+ t += (time_t) 65536 << 16;
+#endif /* SIZEOF_TIME_T > 4 */
+ }
+ return tm;
+}
+
char *
prettydate(
l_fp *ts
@@ -29,15 +83,20 @@ prettydate(
LIB_GETBUF(bp);
- sec = ts->l_ui - JAN_1970;
+ sec = ts->l_ui;
msec = ts->l_uf / 4294967; /* fract / (2 ** 32 / 1000) */
- tm = localtime(&sec);
-
- (void) sprintf(bp, "%08lx.%08lx %s, %s %2d %4d %2d:%02d:%02d.%03lu",
+ tm = ntp2unix_tm(sec, 1);
+ if (!tm) {
+ (void) sprintf(bp, "%08lx.%08lx --- --- -- ---- --:--:--",
+ (u_long)ts->l_ui, (u_long)ts->l_uf);
+ }
+ else {
+ (void) sprintf(bp, "%08lx.%08lx %s, %s %2d %4d %2d:%02d:%02d.%03lu",
(u_long)ts->l_ui, (u_long)ts->l_uf, days[tm->tm_wday],
months[tm->tm_mon], tm->tm_mday, 1900 + tm->tm_year,
tm->tm_hour,tm->tm_min, tm->tm_sec, msec);
+ }
return bp;
}
@@ -54,15 +113,20 @@ gmprettydate(
LIB_GETBUF(bp);
- sec = ts->l_ui - JAN_1970;
+ sec = ts->l_ui;
msec = ts->l_uf / 4294967; /* fract / (2 ** 32 / 1000) */
- tm = gmtime(&sec);
-
- (void) sprintf(bp, "%08lx.%08lx %s, %s %2d %4d %2d:%02d:%02d.%03lu UTC",
+ tm = ntp2unix_tm(sec, 0);
+ if (!tm) {
+ (void) sprintf(bp, "%08lx.%08lx --- --- -- ---- --:--:--",
+ (u_long)ts->l_ui, (u_long)ts->l_uf);
+ }
+ else {
+ (void) sprintf(bp, "%08lx.%08lx %s, %s %2d %4d %2d:%02d:%02d.%03lu",
(u_long)ts->l_ui, (u_long)ts->l_uf, days[tm->tm_wday],
months[tm->tm_mon], tm->tm_mday, 1900 + tm->tm_year,
tm->tm_hour,tm->tm_min, tm->tm_sec, msec);
-
+ }
+
return bp;
}
OpenPOWER on IntegriCloud