diff options
| -rw-r--r-- | networking/ntpd.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c index 204e1d7c2..4365166ff 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
| @@ -554,7 +554,7 @@ gettime1900d(void) | |||
| 554 | static void | 554 | static void |
| 555 | d_to_tv(struct timeval *tv, double d) | 555 | d_to_tv(struct timeval *tv, double d) |
| 556 | { | 556 | { |
| 557 | tv->tv_sec = (long)d; | 557 | tv->tv_sec = (time_t)d; |
| 558 | tv->tv_usec = (d - tv->tv_sec) * 1000000; | 558 | tv->tv_usec = (d - tv->tv_sec) * 1000000; |
| 559 | } | 559 | } |
| 560 | 560 | ||
| @@ -565,6 +565,14 @@ lfp_to_d(l_fixedpt_t lfp) | |||
| 565 | lfp.int_partl = ntohl(lfp.int_partl); | 565 | lfp.int_partl = ntohl(lfp.int_partl); |
| 566 | lfp.fractionl = ntohl(lfp.fractionl); | 566 | lfp.fractionl = ntohl(lfp.fractionl); |
| 567 | ret = (double)lfp.int_partl + ((double)lfp.fractionl / UINT_MAX); | 567 | ret = (double)lfp.int_partl + ((double)lfp.fractionl / UINT_MAX); |
| 568 | /* | ||
| 569 | * Shift timestamps before 1970 to the second NTP era (2036-2106): | ||
| 570 | * int_partl value of OFFSET_1900_1970 (2208988800) is interpreted as | ||
| 571 | * the start of year 1970 and it is the minimal representable time, | ||
| 572 | * all values form the sequence 2208988800..0xffffffff,0..2208988799. | ||
| 573 | */ | ||
| 574 | if (lfp.int_partl < OFFSET_1900_1970) | ||
| 575 | ret += (double)(1ULL << 32); /* because int_partl is 32-bit wide */ | ||
| 568 | return ret; | 576 | return ret; |
| 569 | } | 577 | } |
| 570 | static NOINLINE double | 578 | static NOINLINE double |
| @@ -582,8 +590,8 @@ d_to_lfp(l_fixedpt_t *lfp, double d) | |||
| 582 | { | 590 | { |
| 583 | uint32_t intl; | 591 | uint32_t intl; |
| 584 | uint32_t frac; | 592 | uint32_t frac; |
| 585 | intl = (uint32_t)d; | 593 | intl = (uint32_t)(time_t)d; |
| 586 | frac = (uint32_t)((d - intl) * UINT_MAX); | 594 | frac = (uint32_t)((d - (time_t)d) * UINT_MAX); |
| 587 | lfp->int_partl = htonl(intl); | 595 | lfp->int_partl = htonl(intl); |
| 588 | lfp->fractionl = htonl(frac); | 596 | lfp->fractionl = htonl(frac); |
| 589 | } | 597 | } |
