Home | History | Annotate | Line # | Download | only in libntp
      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