| Line | Count | Source | 
| 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 | 3.50M | { | 
| 14 | 3.50M |         int64_t x, y; | 
| 15 |  |  | 
| 16 | 3.50M |         if (ts->tv_sec < 0 || ts->tv_nsec < 0 || | 
| 17 | 3.50M |             ts->tv_nsec >= 1000000000LL) | 
| 18 | 3.83k |                 return -1; | 
| 19 |  |  | 
| 20 | 3.49M |         if ((uint64_t)ts->tv_sec >= INT64_MAX / 1000LL) | 
| 21 | 0 |                 return -1; | 
| 22 |  |  | 
| 23 | 3.49M |         x = ts->tv_sec * 1000LL; | 
| 24 | 3.49M |         y = ts->tv_nsec / 1000000LL; | 
| 25 |  |  | 
| 26 | 3.49M |         if (INT64_MAX - x < y || x + y > INT_MAX) | 
| 27 | 0 |                 return -1; | 
| 28 |  |  | 
| 29 | 3.49M |         return (int)(x + y); | 
| 30 | 3.49M | } | 
| 31 |  |  | 
| 32 |  | int | 
| 33 |  | fido_time_now(struct timespec *ts_now) | 
| 34 | 4.13M | { | 
| 35 | 4.13M |         if (clock_gettime(CLOCK_MONOTONIC, ts_now) != 0) { | 
| 36 | 8.50k |                 fido_log_error(errno, "%s: clock_gettime", __func__); | 
| 37 | 8.50k |                 return -1; | 
| 38 | 8.50k |         } | 
| 39 |  |  | 
| 40 | 4.12M |         return 0; | 
| 41 | 4.13M | } | 
| 42 |  |  | 
| 43 |  | int | 
| 44 |  | fido_time_delta(const struct timespec *ts_start, int *ms_remain) | 
| 45 | 3.57M | { | 
| 46 | 3.57M |         struct timespec ts_end, ts_delta; | 
| 47 | 3.57M |         int ms; | 
| 48 |  |  | 
| 49 | 3.57M |         if (*ms_remain < 0) | 
| 50 | 61.6k |                 return 0; | 
| 51 |  |  | 
| 52 | 3.51M |         if (clock_gettime(CLOCK_MONOTONIC, &ts_end) != 0) { | 
| 53 | 9.38k |                 fido_log_error(errno, "%s: clock_gettime", __func__); | 
| 54 | 9.38k |                 return -1; | 
| 55 | 9.38k |         } | 
| 56 |  |  | 
| 57 | 3.50M |         if (timespeccmp(&ts_end, ts_start, <)) { | 
| 58 | 2.00k |                 fido_log_debug("%s: timespeccmp", __func__); | 
| 59 | 2.00k |                 return -1; | 
| 60 | 2.00k |         } | 
| 61 |  |  | 
| 62 | 3.50M |         timespecsub(&ts_end, ts_start, &ts_delta); | 
| 63 |  |  | 
| 64 | 3.50M |         if ((ms = timespec_to_ms(&ts_delta)) < 0) { | 
| 65 | 3.83k |                 fido_log_debug("%s: timespec_to_ms", __func__); | 
| 66 | 3.83k |                 return -1; | 
| 67 | 3.83k |         } | 
| 68 |  |  | 
| 69 | 3.49M |         if (ms > *ms_remain) | 
| 70 | 123k |                 ms = *ms_remain; | 
| 71 |  |  | 
| 72 | 3.49M |         *ms_remain -= ms; | 
| 73 |  |  | 
| 74 | 3.49M |         return 0; | 
| 75 | 3.50M | } |