summaryrefslogtreecommitdiff
path: root/src/libstddjb/ntp_from_tain.c
blob: 276a7757d07e2c11c0e2535dc57b384fd5c12b6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* ISC license. */

#include <errno.h>
#include <skalibs/uint64.h>
#include <skalibs/tai.h>
#include <skalibs/djbtime.h>

int ntp_from_tain (uint64_t *u, tain_t const *a)
{
  uint64_t secs, frac ;
  if (!utc_from_tai(&secs, tain_secp(a))) return 0 ;
  secs += NTP_OFFSET ;
  if (secs < TAI_MAGIC + 2147483648UL) goto ifail ;
  secs -= TAI_MAGIC ;
  if (secs >= ((uint64)3 << 31)) goto ifail ;
  secs &= (secs < ((uint64)1 << 32)) ? 0xFFFFFFFFUL : 0x7FFFFFFFUL ;
  frac = ((uint64)a->nano << 32) / 1000000000UL ;
  *u = (secs << 32) + frac ;
  return 1 ;
 ifail:
  errno = EINVAL ;
  return 0 ;
}