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 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #include <errno.h> |
9 | | #include "fido.h" |
10 | | |
11 | | static int |
12 | | timespec_to_ms(const struct timespec *ts) |
13 | 364k | { |
14 | 364k | int64_t x, y; |
15 | | |
16 | 364k | if (ts->tv_sec < 0 || ts->tv_nsec < 0 || |
17 | 364k | ts->tv_nsec >= 1000000000LL) |
18 | 565 | return -1; |
19 | | |
20 | 364k | if ((uint64_t)ts->tv_sec >= INT64_MAX / 1000LL) |
21 | 0 | return -1; |
22 | | |
23 | 364k | x = ts->tv_sec * 1000LL; |
24 | 364k | y = ts->tv_nsec / 1000000LL; |
25 | | |
26 | 364k | if (INT64_MAX - x < y || x + y > INT_MAX) |
27 | 0 | return -1; |
28 | | |
29 | 364k | return (int)(x + y); |
30 | 364k | } |
31 | | |
32 | | int |
33 | | fido_time_now(struct timespec *ts_now) |
34 | 418k | { |
35 | 418k | if (clock_gettime(CLOCK_MONOTONIC, ts_now) != 0) { |
36 | 851 | fido_log_error(errno, "%s: clock_gettime", __func__); |
37 | 851 | return -1; |
38 | 851 | } |
39 | | |
40 | 417k | return 0; |
41 | 418k | } |
42 | | |
43 | | int |
44 | | fido_time_delta(const struct timespec *ts_start, int *ms_remain) |
45 | 372k | { |
46 | 372k | struct timespec ts_end, ts_delta; |
47 | 372k | int ms; |
48 | | |
49 | 372k | if (*ms_remain < 0) |
50 | 6.43k | return 0; |
51 | | |
52 | 365k | if (clock_gettime(CLOCK_MONOTONIC, &ts_end) != 0) { |
53 | 503 | fido_log_error(errno, "%s: clock_gettime", __func__); |
54 | 503 | return -1; |
55 | 503 | } |
56 | | |
57 | 365k | if (timespeccmp(&ts_end, ts_start, <)) { |
58 | 341 | fido_log_debug("%s: timespeccmp", __func__); |
59 | 341 | return -1; |
60 | 341 | } |
61 | | |
62 | 364k | timespecsub(&ts_end, ts_start, &ts_delta); |
63 | | |
64 | 364k | if ((ms = timespec_to_ms(&ts_delta)) < 0) { |
65 | 565 | fido_log_debug("%s: timespec_to_ms", __func__); |
66 | 565 | return -1; |
67 | 565 | } |
68 | | |
69 | 364k | if (ms > *ms_remain) |
70 | 25.2k | ms = *ms_remain; |
71 | | |
72 | 364k | *ms_remain -= ms; |
73 | | |
74 | 364k | return 0; |
75 | 364k | } |