This repository has been archived by the owner on May 1, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tai64n.c
74 lines (61 loc) · 1.73 KB
/
tai64n.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
* Copyright (c) 2018 Tim Kuijsten
*
* Permission to use, copy, modify, and distribute this software for any purpose
* with or without fee is hereby granted, provided that the above copyright
* notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "tai64n.h"
/*
* Initialize "out" with the current time in TAI64N format.
*
* Return "out" on success, NULL on error with errno set.
*/
struct tai64n *
nowtai64n(struct tai64n *out)
{
struct timeval now;
if (gettimeofday(&now, NULL) == -1)
return NULL;
out->sec = TAI0 + now.tv_sec;
out->nano = 1000 * now.tv_usec + 500;
return out;
}
/*
* Convert a TAI64N label to external format.
*
* Return 0 on success, -1 on error with "out" unmodified.
*/
int
externaltai64n(uint8_t *out, size_t outsize, const struct tai64n *in)
{
uint64_t s;
uint32_t n;
if (in == NULL)
return -1;
if (outsize != 12)
return -1;
n = in->nano;
out[11] = n & 255; n >>= 8;
out[10] = n & 255; n >>= 8;
out[9] = n & 255; n >>= 8;
out[8] = n;
s = in->sec;
out[7] = s & 255; s >>= 8;
out[6] = s & 255; s >>= 8;
out[5] = s & 255; s >>= 8;
out[4] = s & 255; s >>= 8;
out[3] = s & 255; s >>= 8;
out[2] = s & 255; s >>= 8;
out[1] = s & 255; s >>= 8;
out[0] = s;
return 0;
}