Blame


1 a81bb85a 2026-02-19 martijn /*
2 a81bb85a 2026-02-19 martijn * Copyright (c) 2025 Omar Polo <op@omarpolo.com>
3 a81bb85a 2026-02-19 martijn *
4 a81bb85a 2026-02-19 martijn * Permission to use, copy, modify, and distribute this software for any
5 a81bb85a 2026-02-19 martijn * purpose with or without fee is hereby granted, provided that the above
6 a81bb85a 2026-02-19 martijn * copyright notice and this permission notice appear in all copies.
7 a81bb85a 2026-02-19 martijn *
8 a81bb85a 2026-02-19 martijn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 a81bb85a 2026-02-19 martijn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 a81bb85a 2026-02-19 martijn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 a81bb85a 2026-02-19 martijn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 a81bb85a 2026-02-19 martijn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 a81bb85a 2026-02-19 martijn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 a81bb85a 2026-02-19 martijn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 a81bb85a 2026-02-19 martijn */
16 a81bb85a 2026-02-19 martijn
17 a81bb85a 2026-02-19 martijn #include "config.h"
18 a81bb85a 2026-02-19 martijn #include <stdio.h>
19 a81bb85a 2026-02-19 martijn
20 a81bb85a 2026-02-19 martijn #ifndef timespecsub
21 a81bb85a 2026-02-19 martijn #define timespecsub(a, b, result) \
22 a81bb85a 2026-02-19 martijn do { \
23 a81bb85a 2026-02-19 martijn (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
24 a81bb85a 2026-02-19 martijn (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \
25 a81bb85a 2026-02-19 martijn if ((result)->tv_nsec < 0) { \
26 a81bb85a 2026-02-19 martijn --(result)->tv_sec; \
27 a81bb85a 2026-02-19 martijn (result)->tv_nsec += 1000000000L; \
28 a81bb85a 2026-02-19 martijn } \
29 a81bb85a 2026-02-19 martijn } while (0)
30 a81bb85a 2026-02-19 martijn #endif
31 a81bb85a 2026-02-19 martijn
32 a81bb85a 2026-02-19 martijn #if !defined(SA_LEN)
33 a81bb85a 2026-02-19 martijn # if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
34 a81bb85a 2026-02-19 martijn # define SA_LEN(x) ((x)->sa_len)
35 a81bb85a 2026-02-19 martijn # else
36 a81bb85a 2026-02-19 martijn # define SA_LEN(x) ((x)->sa_family == AF_INET6 ? \
37 a81bb85a 2026-02-19 martijn sizeof(struct sockaddr_in6) : \
38 a81bb85a 2026-02-19 martijn sizeof(struct sockaddr_in))
39 a81bb85a 2026-02-19 martijn # endif
40 a81bb85a 2026-02-19 martijn #endif
41 a81bb85a 2026-02-19 martijn
42 a81bb85a 2026-02-19 martijn #ifndef __dead
43 a81bb85a 2026-02-19 martijn #define __dead __attribute__((__noreturn__))
44 a81bb85a 2026-02-19 martijn #endif
45 a81bb85a 2026-02-19 martijn
46 a81bb85a 2026-02-19 martijn #ifndef HAVE_FGETLN
47 a81bb85a 2026-02-19 martijn char *fgetln(FILE *, size_t *);
48 a81bb85a 2026-02-19 martijn #endif
49 a81bb85a 2026-02-19 martijn
50 a81bb85a 2026-02-19 martijn #ifndef HAVE_PLEDGE
51 a81bb85a 2026-02-19 martijn #define pledge(a, b) (0)
52 a81bb85a 2026-02-19 martijn #endif
53 a81bb85a 2026-02-19 martijn
54 a81bb85a 2026-02-19 martijn #ifndef HAVE_REALLOCARRAY
55 a81bb85a 2026-02-19 martijn void *reallocarray(void *, size_t, size_t);
56 a81bb85a 2026-02-19 martijn #endif
57 a81bb85a 2026-02-19 martijn
58 a81bb85a 2026-02-19 martijn #ifndef HAVE_RECALLOCARRAY
59 a81bb85a 2026-02-19 martijn void *recallocarray(void *, size_t, size_t, size_t);
60 a81bb85a 2026-02-19 martijn #endif
61 a81bb85a 2026-02-19 martijn
62 a81bb85a 2026-02-19 martijn #ifndef HAVE_STRCASESTR
63 a81bb85a 2026-02-19 martijn char *strcasestr(const char *, const char *);
64 a81bb85a 2026-02-19 martijn #endif
65 a81bb85a 2026-02-19 martijn
66 a81bb85a 2026-02-19 martijn #ifndef HAVE_STRTONUM
67 a81bb85a 2026-02-19 martijn long long strtonum(const char *, long long, long long, const char **);
68 a81bb85a 2026-02-19 martijn #endif