1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/*
* prettydate - convert a time stamp to something readable
*/
#include <stdio.h>
#include "ntp_fp.h"
#include "ntp_unixtime.h" /* includes <sys/time.h> */
#include "lib_strbuf.h"
#include "ntp_stdlib.h"
static const char *months[] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
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
)
{
char *bp;
struct tm *tm;
time_t sec;
u_long msec;
LIB_GETBUF(bp);
sec = ts->l_ui;
msec = ts->l_uf / 4294967; /* fract / (2 ** 32 / 1000) */
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;
}
char *
gmprettydate(
l_fp *ts
)
{
char *bp;
struct tm *tm;
time_t sec;
u_long msec;
LIB_GETBUF(bp);
sec = ts->l_ui;
msec = ts->l_uf / 4294967; /* fract / (2 ** 32 / 1000) */
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;
}
|