1 /* $NetBSD: calyearstart.c,v 1.5 2020/05/25 20:47:24 christos Exp $ */ 2 3 /* 4 * calyearstart - determine the NTP time at midnight of January 1 in 5 * the year of the given date. 6 */ 7 #include <config.h> 8 #include <sys/types.h> 9 10 #include "ntp_types.h" 11 #include "ntp_calendar.h" 12 #include "ntp_stdlib.h" 13 #include "ntp_assert.h" 14 15 /* 16 * Juergen Perlinger, 2010-05-02 17 * 18 * Redone in terms of the calendar functions. It's rather simple: 19 * - expand the NTP time stamp 20 * - split into days and seconds since midnight, dropping the partial day 21 * - get full number of days before year start in NTP epoch 22 * - convert to seconds, truncated to 32 bits. 23 */ 24 u_int32 25 calyearstart(u_int32 ntptime, const time_t *pivot) 26 { 27 u_int32 ndays; /* elapsed days since NTP starts */ 28 vint64 vlong; 29 ntpcal_split split; 30 31 vlong = ntpcal_ntp_to_ntp(ntptime, pivot); 32 split = ntpcal_daysplit(&vlong); 33 ndays = ntpcal_rd_to_ystart(split.hi + DAY_NTP_STARTS) 34 - DAY_NTP_STARTS; 35 36 return (u_int32)(ndays * SECSPERDAY); 37 } 38 39 /* 40 * calmonthstart - get NTP time at midnight of the first day of the 41 * current month. 42 */ 43 u_int32 44 calmonthstart(u_int32 ntptime, const time_t *pivot) 45 { 46 u_int32 ndays; /* elapsed days since NTP starts */ 47 vint64 vlong; 48 ntpcal_split split; 49 50 vlong = ntpcal_ntp_to_ntp(ntptime, pivot); 51 split = ntpcal_daysplit(&vlong); 52 ndays = ntpcal_rd_to_mstart(split.hi + DAY_NTP_STARTS) 53 - DAY_NTP_STARTS; 54 55 return (u_int32)(ndays * SECSPERDAY); 56 } 57 58 /* 59 * calweekstart - get NTP time at midnight of the last Monday on or 60 * before the current date. 61 */ 62 u_int32 63 calweekstart(u_int32 ntptime, const time_t *pivot) 64 { 65 u_int32 ndays; /* elapsed days since NTP starts */ 66 vint64 vlong; 67 ntpcal_split split; 68 69 vlong = ntpcal_ntp_to_ntp(ntptime, pivot); 70 split = ntpcal_daysplit(&vlong); 71 ndays = ntpcal_weekday_le(split.hi + DAY_NTP_STARTS, CAL_MONDAY) 72 - DAY_NTP_STARTS; 73 74 return (u_int32)(ndays * SECSPERDAY); 75 } 76 77 /* 78 * caldaystart - get NTP time at midnight of the current day. 79 */ 80 u_int32 81 caldaystart(u_int32 ntptime, const time_t *pivot) 82 { 83 vint64 vlong; 84 ntpcal_split split; 85 86 vlong = ntpcal_ntp_to_ntp(ntptime, pivot); 87 split = ntpcal_daysplit(&vlong); 88 89 return ntptime - split.lo; 90 } 91