1: /*
2: * calyearstart - determine the NTP time at midnight of January 1 in
3: * the year of the given date.
4: */
5: #include <sys/types.h>
6:
7: #include "ntp_types.h"
8: #include "ntp_calendar.h"
9: #include "ntp_stdlib.h"
10: #include "ntp_assert.h"
11:
12: /*
13: * Juergen Perlinger, 2008-11-12
14: * Use the result of 'caljulian' to get the delta from the time stamp to the
15: * beginning of the year. Do not make a second trip through 'caltontp' after
16: * fixing the date, apart for invariant tests.
17: */
18: u_long
19: calyearstart(u_long ntp_time)
20: {
21: struct calendar jt;
22: ntp_u_int32_t delta;
23:
24: caljulian(ntp_time,&jt);
25:
26: /*
27: * Now we have days since yearstart (unity-based) and the time in that
28: * day. Simply merge these together to seconds and subtract that from
29: * input time. That's faster than going through the calendar stuff
30: * again...
31: */
32: delta = (ntp_u_int32_t)jt.yearday * SECSPERDAY
33: + (ntp_u_int32_t)jt.hour * MINSPERHR * SECSPERMIN
34: + (ntp_u_int32_t)jt.minute * SECSPERMIN
35: + (ntp_u_int32_t)jt.second
36: - SECSPERDAY; /* yearday is unity-based... */
37:
38: # if ISC_CHECK_INVARIANT
39: /*
40: * check that this computes properly: do a roundtrip! That's the only
41: * sensible test here, but it's a rather expensive invariant...
42: */
43: jt.yearday = 0;
44: jt.month = 1;
45: jt.monthday = 1;
46: jt.hour = 0;
47: jt.minute = 0;
48: jt.second = 0;
49: NTP_INVARIANT((ntp_u_int32_t)(caltontp(&jt) + delta) == (ntp_u_int32_t)ntp_time);
50: # endif
51:
52: /* The NTP time stamps (l_fp) count seconds unsigned mod 2**32, so we
53: * have to calculate this in the proper way!
54: */
55: return (ntp_u_int32_t)(ntp_time - delta);
56: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>