2 * Copyright (c) 2022 Stefan Sperling <stsp@openbsd.org>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 #include "got_lib_ratelimit.h"
26 #include "got_compat.h"
27 #include "got_error.h"
30 got_ratelimit_init(struct got_ratelimit
*rl
, time_t interval_sec
,
31 unsigned int interval_msec
)
33 memset(rl
, 0, sizeof(*rl
));
34 rl
->interval
.tv_sec
= interval_sec
;
35 rl
->interval
.tv_nsec
= interval_msec
* 1000000UL;
38 const struct got_error
*
39 got_ratelimit_check(int *elapsed
, struct got_ratelimit
*rl
)
41 struct timespec now
, delta
;
43 if (clock_gettime(CLOCK_MONOTONIC
, &now
) == -1)
44 return got_error_from_errno("clock_gettime");
46 if (timespecisset(&rl
->last
)) {
47 timespecsub(&now
, &rl
->last
, &delta
);
48 *elapsed
= timespeccmp(&delta
, &rl
->interval
, >=) ? 1 : 0;