Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2021 Yubico AB. All rights reserved. |
3 | | * Use of this source code is governed by a BSD-style |
4 | | * license that can be found in the LICENSE file. |
5 | | */ |
6 | | |
7 | | #include <errno.h> |
8 | | #include "fido.h" |
9 | | |
10 | | static int |
11 | | timespec_to_ms(const struct timespec *ts) |
12 | 361k | { |
13 | 361k | int64_t x, y; |
14 | | |
15 | 361k | if (ts->tv_sec < 0 || ts->tv_nsec < 0 || |
16 | 361k | ts->tv_nsec >= 1000000000LL) |
17 | 641 | return -1; |
18 | | |
19 | 360k | if ((uint64_t)ts->tv_sec >= INT64_MAX / 1000LL) |
20 | 0 | return -1; |
21 | | |
22 | 360k | x = ts->tv_sec * 1000LL; |
23 | 360k | y = ts->tv_nsec / 1000000LL; |
24 | | |
25 | 360k | if (INT64_MAX - x < y || x + y > INT_MAX) |
26 | 0 | return -1; |
27 | | |
28 | 360k | return (int)(x + y); |
29 | 360k | } |
30 | | |
31 | | int |
32 | | fido_time_now(struct timespec *ts_now) |
33 | 414k | { |
34 | 414k | if (clock_gettime(CLOCK_MONOTONIC, ts_now) != 0) { |
35 | 949 | fido_log_error(errno, "%s: clock_gettime", __func__); |
36 | 949 | return -1; |
37 | 949 | } |
38 | | |
39 | 413k | return 0; |
40 | 414k | } |
41 | | |
42 | | int |
43 | | fido_time_delta(const struct timespec *ts_start, int *ms_remain) |
44 | 366k | { |
45 | 366k | struct timespec ts_end, ts_delta; |
46 | 366k | int ms; |
47 | | |
48 | 366k | if (*ms_remain < 0) |
49 | 4.07k | return 0; |
50 | | |
51 | 362k | if (clock_gettime(CLOCK_MONOTONIC, &ts_end) != 0) { |
52 | 493 | fido_log_error(errno, "%s: clock_gettime", __func__); |
53 | 493 | return -1; |
54 | 493 | } |
55 | | |
56 | 361k | if (timespeccmp(&ts_end, ts_start, <)) { |
57 | 386 | fido_log_debug("%s: timespeccmp", __func__); |
58 | 386 | return -1; |
59 | 386 | } |
60 | | |
61 | 361k | timespecsub(&ts_end, ts_start, &ts_delta); |
62 | | |
63 | 361k | if ((ms = timespec_to_ms(&ts_delta)) < 0) { |
64 | 641 | fido_log_debug("%s: timespec_to_ms", __func__); |
65 | 641 | return -1; |
66 | 641 | } |
67 | | |
68 | 360k | if (ms > *ms_remain) |
69 | 23.8k | ms = *ms_remain; |
70 | | |
71 | 360k | *ms_remain -= ms; |
72 | | |
73 | 360k | return 0; |
74 | 361k | } |