Commit Diff


commit - 7f0ff4a55b1edcc332a395004bc76356777e30d8
commit + 47dc83f5bed376c49b704738968d3f44c8e01d1e
blob - 936a5aaebb079956bc57cd01d75c87d0de697c5b
blob + 434787543327e26c5fa9618d32100a79d95c371f
--- .gitignore
+++ .gitignore
@@ -16,6 +16,7 @@
 **/install-sh
 **/missing
 **/obj
+**/stamp-h1
 **/tags
 **/ylwrap
 .ccls-cache/*
@@ -31,6 +32,8 @@ gotadmin/gotadmin
 gotwebd/gotwebd
 gotwebd/pages.c
 gotwebd/parse.c
+include/got_compat.h
+include/got_compat.h.in
 libexec/got-fetch-pack/got-fetch-pack
 libexec/got-index-pack/got-index-pack
 libexec/got-read-blob/got-read-blob
blob - 411a05c09cda3abd712cecf458fd4db2de2cb536
blob + 450ceba22057e009652bb44a1956bfa576cb6ca4
--- configure.ac
+++ configure.ac
@@ -8,10 +8,15 @@ AC_CONFIG_AUX_DIR(etc)
 AC_CONFIG_SRCDIR([lib/rcsutil.h])
 AM_INIT_AUTOMAKE([foreign subdir-objects])
 
+AC_CONFIG_HEADERS([include/got_compat.h])
+
 AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
 AC_SUBST(VERSION)
 AC_SUBST(GOT_RELEASE)
 
+AC_DEFINE([GOT_VERSION], [VERSION], [GoT version string])
+AC_DEFINE([GOT_VERSION_NUMBER], [VERSION], [Got version number])
+
 AC_USE_SYSTEM_EXTENSIONS
 AC_CANONICAL_HOST
 
@@ -82,18 +87,19 @@ AC_CHECK_HEADERS([ \
 ])
 
 if test "x$ac_cv_header_sha256_h" = xyes; then
-	AC_DEFINE(HAVE_SHA256)
+	AC_DEFINE([HAVE_SHA256], [1], [SHA256 support])
 fi
 
 AM_CONDITIONAL([HAVE_SHA2], [test "x$ac_cv_header_sha2_h" = xyes])
 
 # Check for SHA1_DIGEST_LENGTH
 AC_CHECK_DECL([SHA1_DIGEST_LENGTH],
-	[AC_DEFINE(HAVE_SHA1_AS_SHA1)],
+	[AC_DEFINE([HAVE_SHA1_AS_SHA1], [1], [SHA support is using SHA1])],
 	[
 		dnl maybe sha.h is available
 		AC_CHECK_DECL([SHA_DIGEST_LENGTH],
-			[AC_DEFINE(HAVE_SHA_AS_SHA1)],
+			[AC_DEFINE([HAVE_SHA_AS_SHA1], [1],
+				   [SHA support is using SHA])],
 			[],
 			[#include <sha.h>])
 	],
@@ -450,11 +456,11 @@ if test x$found_libevent = xno; then
 fi
 AC_CHECK_HEADER(
 	event2/event.h,
-	AC_DEFINE(HAVE_EVENT2_EVENT_H),
+	AC_DEFINE([HAVE_EVENT2_EVENT_H], [1], [libevent2 has event.h]),
 	[
 		AC_CHECK_HEADER(
 			event.h,
-			AC_DEFINE(HAVE_EVENT_H),
+			AC_DEFINE([HAVE_EVENT_H], [0], [libevent]),
 			found_libevent=no
 		)
 	]
@@ -479,18 +485,18 @@ PKG_CHECK_MODULES(
 )
 
 if test "x$found_libcrypto" = "xyes"; then
-	AC_DEFINE(HAVE_LIBCRYPTO)
+	AC_DEFINE([HAVE_LIBCRYPTO], [1], [libcrypto])
 fi
 
-AC_SEARCH_LIBS(uuid_create, , AC_DEFINE(HAVE_BSD_UUID))
+AC_SEARCH_LIBS(uuid_create, , AC_DEFINE([HAVE_BSD_UUID], [1], [BSD UUID]))
 AC_SEARCH_LIBS(uuid_create, found_uuid=no, found_uuid=yes)
-AC_SEARCH_LIBS(mergesort, , AC_DEFINE(HAVE_BSD_MERGESORT))
+AC_SEARCH_LIBS(mergesort, , AC_DEFINE([HAVE_BSD_MERGESORT], [1], [BSD Mergesort]))
 
 # Don't define HAVE_BSD_UUID on darwin (Apple) as this breaks the BSD API.
 # Instead, use the UUID implementation wrapper that's in compat/ plus uuid
 # ossp
 if test "x$found_uuid" = "xyes" -a "x$PLATFORM" != "darwin"; then
-	AC_DEFINE(HAVE_BSD_UUID)
+	AC_DEFINE([HAVE_BSD_UUID], [1], [BSD UUID])
 else
 	PKG_CHECK_MODULES(
 		LIBUUID,
@@ -563,7 +569,7 @@ if test "$PLATFORM" = "linux"; then
 			AM_CFLAGS="$LIBBSD_CFLAGS $AM_CFLAGS"
 			CFLAGS="$AM_CFLAGS $SAVED_CFLAGS"
 			LIBS="$LIBBSD_LIBS $LIBS"
-			AC_DEFINE(HAVE_LIBBSD)
+			AC_DEFINE([HAVE_LIBBSD], [1], [BSD UUID])
 		],
 		[
 			AC_MSG_ERROR("*** couldn't find libbsd-overlay via pkg-config")
@@ -594,7 +600,7 @@ AC_CHECK_DECL(
 )
 
 if test "x$found_queue_h" = xyes; then
-	AC_DEFINE(HAVE_QUEUE_H)
+	AC_DEFINE([HAVE_QUEUE_H], [1], [sys/queue.h])
 else
 	AC_MSG_ERROR("*** sys/queue.h missing key defines ***)
 fi
@@ -607,7 +613,7 @@ AC_CHECK_DECL(
 )
 
 if test "x$found_sys_tree_h" = xyes; then
-	AC_DEFINE(HAVE_TREE_H)
+	AC_DEFINE([HAVE_TREE_H], [1], [sys/tree.h])
 else
 	AC_MSG_NOTICE("Using compat/tree.h")
 fi
@@ -625,8 +631,8 @@ AC_LINK_IFELSE([AC_LANG_SOURCE(
 			exit(0);
 		}
 	])],
-	[AC_DEFINE(HAVE___PROGNAME) AC_MSG_RESULT(yes)],
-	AC_MSG_RESULT(no)
+	[AC_DEFINE([HAVE___PROGNAME], [1], [___progname]) AC_MSG_RESULT(yes)],
+	[AC_MSG_RESULT(no)]
 )
 
 PKG_CHECK_MODULES(
@@ -686,7 +692,7 @@ else
 	fi
 fi
 if test "x$found_ncurses" = xyes; then
-	AC_DEFINE(HAVE_NCURSES_H)
+	AC_DEFINE([HAVE_NCURSES_H], [1], [NCurses])
 else
 	# No ncurses, try curses.
 	AC_CHECK_LIB(
@@ -703,7 +709,7 @@ else
 		AM_CFLAGS="$LIBPANELW_CFLAGS $AM_CFLAGS"
 		CFLAGS="$LIBPANEL_CFLAGS $CFLAGS"
 		LIBS="$LIBS -lcursesw $LIBPANELW_LIBS"
-		AC_DEFINE(HAVE_CURSES_H)
+		AC_DEFINE([HAVE_CURSES_H], [1], [Curses_h])
 	else
 		AC_MSG_ERROR("curses not found")
 	fi
@@ -718,6 +724,8 @@ CFLAGS="$SAVED_CFLAGS"
 AC_SUBST(AM_LDFLAGS)
 LDFLAGS="$SAVED_LDFLAGS"
 
+AH_BOTTOM([#include "got_compat2.h"])
+
 AC_CONFIG_FILES([Makefile
 		 compat/Makefile
 		 libexec/Makefile
blob - 847c76958d00a869e71be503e43f000280b06cba (mode 644)
blob + /dev/null
--- include/got_compat.h
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (c) 2023 Thomas Adam <thomas@xteddy.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _GOT_COMPAT_H
-#define _GOT_COMPAT_H
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/uio.h>
-#if defined(__FreeBSD__)
-#include <sys/endian.h>
-#include <sys/capsicum.h>
-#elif defined(__APPLE__)
-#include <machine/endian.h>
-#include <libkern/OSByteOrder.h>
-#include "compat/bsd-poll.h"
-
-#define FMT_SCALED_STRSIZE	7  /* minus sign, 4 digits, suffix, null byte */
-
-#define htobe16(x) OSSwapHostToBigInt16(x)
-#define htole16(x) OSSwapHostToLittleInt16(x)
-#define be16toh(x) OSSwapBigToHostInt16(x)
-#define le16toh(x) OSSwapLittleToHostInt16(x)
-
-#define htobe32(x) OSSwapHostToBigInt32(x)
-#define htole32(x) OSSwapHostToLittleInt32(x)
-#define be32toh(x) OSSwapBigToHostInt32(x)
-#define le32toh(x) OSSwapLittleToHostInt32(x)
-
-#define htobe64(x) OSSwapHostToBigInt64(x)
-#define htole64(x) OSSwapHostToLittleInt64(x)
-#define be64toh(x) OSSwapBigToHostInt64(x)
-#define le64toh(x) OSSwapLittleToHostInt64(x)
-
-#define st_atim st_atimespec
-#define st_ctim st_ctimespec
-#define st_mtim st_mtimespec
-
-#else /* Linux, etc... */
-#include <endian.h>
-#include <grp.h>
-#endif
-
-#include <fnmatch.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdint.h>
-
-/* For flock. */
-#ifndef O_EXLOCK
-#define O_EXLOCK 0
-#endif
-
-#ifndef HAVE_FLOCK
-#define LOCK_SH 0
-#define LOCK_EX 0
-#define LOCK_NB 0
-#define flock(fd, op) (0)
-#else
-#include <sys/file.h>
-#endif
-
-/* POSIX doesn't define WAIT_ANY, so provide it if it's not found. */
-#ifndef WAIT_ANY
-#define WAIT_ANY (-1)
-#endif
-
-/* SOCK_NONBLOCK isn't available across BSDs... */
-#ifndef SOCK_NONBLOCK
-#define SOCK_NONBLOCK 00004000
-#endif
-
-/* On FreeBSD (and possibly others), EAI_NODATA was removed, in favour of
- * using EAI_NONAME.
- */
-#ifndef EAI_NODATA
-#define EAI_NODATA EAI_NONAME
-#endif
-
-#ifndef __dead
-#define __dead __attribute__ ((__noreturn__))
-#endif
-
-#ifndef __unused
-#define __unused __attribute__ ((__unused__))
-#endif
-
-#ifndef __OpenBSD__
-#define pledge(s, p) (0)
-#define unveil(s, p) (0)
-#endif
-
-#ifndef __FreeBSD__
-#define cap_enter() (0)
-#endif
-
-#ifndef HAVE_SETRESGID
-#define setresgid(a, b, c) (0)
-#endif
-
-#ifndef HAVE_SETRESUID
-#define setresuid(a, b, c) (0)
-#endif
-
-#ifndef HAVE_LINUX_LANDLOCK_H
-#define landlock_no_fs() (0)
-#else
-int	landlock_no_fs(void);
-#endif
-
-#ifndef INFTIM
-#define INFTIM -1
-#endif
-
-#ifndef HAVE_BSD_UUID
-#include <uuid/uuid.h>
-#define uuid_s_ok 0
-#define uuid_s_bad_version  1
-#define uuid_s_invalid_string_uuid 2
-#define uuid_s_no_memory  3
-
-/* Length of a node address (an IEEE 802 address). */
-#define _UUID_NODE_LEN  6
-
-struct uuid {
-	uint32_t time_low;
-	uint16_t time_mid;
-	uint16_t time_hi_and_version;
-	uint8_t  clock_seq_hi_and_reserved;
-	uint8_t  clock_seq_low;
-	uint8_t  node[_UUID_NODE_LEN];
-};
-
-int32_t uuid_equal(struct uuid *, struct uuid *, uint32_t *);
-int32_t uuid_is_nil(struct uuid *, uint32_t *);
-void uuid_create(uuid_t *, uint32_t *);
-void uuid_create_nil(struct uuid *, uint32_t *);
-void uuid_from_string(const char *, uuid_t *, uint32_t *);
-void uuid_to_string(uuid_t *, char **, uint32_t *);
-#else
-#include <uuid.h>
-#endif
-
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#else
-#include <inttypes.h>
-#endif
-
-#ifdef HAVE_QUEUE_H
-#include <sys/queue.h>
-#endif
-
-#ifdef HAVE_TREE_H
-#include <sys/tree.h>
-#else
-#include "compat/tree.h"
-#endif
-
-#ifdef HAVE_UTIL_H
-#include <util.h>
-#endif
-
-#ifdef HAVE_LIBUTIL_H
-#include <libutil.h>
-#endif
-
-#ifdef HAVE_IMSG
-#else
-#include "compat/imsg.h"
-#endif
-
-#ifdef HAVE_SIPHASH
-#include <siphash.h>
-#else
-#include "compat/siphash.h"
-#endif
-
-/* Include Apple-specific headers.  Mostly for crypto.*/
-#if defined(__APPLE__)
-#define COMMON_DIGEST_FOR_OPENSSL
-#include <CommonCrypto/CommonDigest.h>
-
-#define SHA512_BLOCK_LENGTH		128
-typedef struct _SHA2_CTX {
-	union {
-		u_int32_t	st32[8];
-		u_int64_t	st64[8];
-	} state;
-	u_int64_t	bitcount[2];
-	u_int8_t	buffer[SHA512_BLOCK_LENGTH];
-} SHA2_CTX;
-#define SHA256Init SHA256_Init
-#define SHA256Update SHA256_Update
-#define SHA256Final SHA256_Final
-#endif
-
-#ifndef __APPLE__
-#ifdef HAVE_SHA_AS_SHA1
-#  include <sha.h>
-#endif
-#ifdef HAVE_SHA1_AS_SHA1
-#      include <sha1.h>
-#endif
-#ifdef HAVE_SHA2
-#    include <sha2.h>
-#else
-#    include "sha2.h"
-#endif
-#ifdef HAVE_SHA256
-#    include <sha256.h>
-#endif
-#endif
-
-/* Catch-all for systems where the header files don't exist and/or the below
- * still are not defined.
- */
-#ifndef SHA256_DIGEST_LENGTH
-#define SHA256_DIGEST_LENGTH 32
-#endif
-
-#ifndef SHA256_DIGEST_STRING_LENGTH
-#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
-#endif
-
-#if defined(__DragonFly__)
-#include <openssl/sha.h>
-#endif
-
-#ifndef SHA1_DIGEST_LENGTH
-#define SHA1_DIGEST_LENGTH		SHA_DIGEST_LENGTH
-#define SHA1_DIGEST_STRING_LENGTH	(SHA1_DIGEST_LENGTH * 2 + 1)
-
-#define SHA1_CTX	SHA_CTX
-#define SHA1Init	SHA1_Init
-#define SHA1Update	SHA1_Update
-#define SHA1Final	SHA1_Final
-#endif
-
-/*
- * The following SA_LEN/SS_LEN dance comes from various source, notably
- * OpenSMTP by way of OpenNTPD and OpenBGPD (thanks everyone!).  got-portable
- * has tweaked a lot of the following macros to suit the needs of
- * got-portable.
- */
-
-/* From OpenNTPD portable */
-#if !defined(SA_LEN)
-# if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
-#  define SA_LEN(x)	((x)->sa_len)
-# else
-#  define SA_LEN(x)     ((x)->sa_family == AF_INET6 ? \
-			sizeof(struct sockaddr_in6) : \
-			sizeof(struct sockaddr_in))
-# endif
-
-#endif
-
-/* From OpenBGPD portable */
-#if !defined(SS_LEN)
-# if defined(HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN)
-#  define SS_LEN(x)  ((x)->ss_len)
-# else
-#  define SS_LEN(x)  SA_LEN((struct sockaddr *)(x))
-# endif
-#endif
-
-#ifndef HAVE_ASPRINTF
-/* asprintf.c */
-int		 asprintf(char **, const char *, ...);
-int		 vasprintf(char **, const char *, va_list);
-#endif
-
-#ifndef HAVE_EXPLICIT_BZERO
-/* explicit_bzero.c */
-void		 explicit_bzero(void *, size_t);
-#endif
-
-#ifndef HAVE_GETDTABLECOUNT
-/* getdtablecount.c */
-int		 getdtablecount(void);
-#endif
-
-#ifndef HAVE_CLOSEFROM
-/* closefrom.c */
-void		 closefrom(int);
-#endif
-
-#if defined (__FreeBSD__)
-#define closefrom(fd) (closefrom(fd), 0)
-#endif
-
-#ifndef HAVE_STRSEP
-/* strsep.c */
-char		*strsep(char **, const char *);
-#endif
-
-#ifndef HAVE_STRTONUM
-/* strtonum.c */
-long long	 strtonum(const char *, long long, long long, const char **);
-#endif
-
-#ifndef HAVE_STRLCPY
-/* strlcpy.c */
-size_t	 	 strlcpy(char *, const char *, size_t);
-#endif
-
-#ifndef HAVE_STRLCAT
-/* strlcat.c */
-size_t	 	 strlcat(char *, const char *, size_t);
-#endif
-
-#ifndef HAVE_STRNLEN
-/* strnlen.c */
-size_t		 strnlen(const char *, size_t);
-#endif
-
-#ifndef HAVE_STRNDUP
-/* strndup.c */
-char		*strndup(const char *, size_t);
-#endif
-
-#ifndef HAVE_GETPROGNAME
-/* getprogname.c */
-const char	*getprogname(void);
-#endif
-
-#ifndef HAVE_GETLINE
-/* getline.c */
-ssize_t		 getline(char **, size_t *, FILE *);
-#endif
-
-#ifndef HAVE_FREEZERO
-/* freezero.c */
-void		 freezero(void *, size_t);
-#endif
-
-#ifndef HAVE_GETDTABLECOUNT
-/* getdtablecount.c */
-int		 getdtablecount(void);
-#endif
-
-#ifndef HAVE_REALLOCARRAY
-/* reallocarray.c */
-void		*reallocarray(void *, size_t, size_t);
-#endif
-
-#ifndef HAVE_RECALLOCARRAY
-/* recallocarray.c */
-void		*recallocarray(void *, size_t, size_t, size_t);
-#endif
-
-#ifndef HAVE_SETPROCTITLE
-/* setproctitle.c */
-void 		 setproctitle(const char *, ...);
-#endif
-
-#ifndef HAVE_FMT_SCALED
-/* fmt_scaled.c */
-int fmt_scaled(long long, char *);
-int scan_scaled(char *, long long *);
-#define FMT_SCALED_STRSIZE	7  /* minus sign, 4 digits, suffix, null byte */
-#endif
-
-#ifndef HAVE_LIBBSD
-/* getopt.c */
-extern int	BSDopterr;
-extern int	BSDoptind;
-extern int	BSDoptopt;
-extern int	BSDoptreset;
-extern char    *BSDoptarg;
-int	BSDgetopt(int, char *const *, const char *);
-#define getopt(ac, av, o)  BSDgetopt(ac, av, o)
-#define opterr             BSDopterr
-#define optind             BSDoptind
-#define optopt             BSDoptopt
-#define optreset           BSDoptreset
-#define optarg             BSDoptarg
-#endif
-#endif
-
-/* Check for some of the non-portable timespec*() functions.
- * This should largely come from libbsd for systems which
- * aren't BSD, but this will depend on how old the library
- * is.
- */
-#ifndef timespecisset
-#define	timespecisset(tsp) \
-	((tsp)->tv_sec || (tsp)->tv_nsec)
-#endif
-
-#ifndef timespecsub
-#define	timespecsub(tsp, usp, vsp)					\
-	do {								\
-		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		\
-		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	\
-		if ((vsp)->tv_nsec < 0) {				\
-			(vsp)->tv_sec--;				\
-			(vsp)->tv_nsec += 1000000000L;			\
-		}							\
-	} while (0)
-#endif
-
-#ifndef timespeccmp
-#define timespeccmp(tvp, uvp, cmp) 					\
-(((tvp)->tv_sec == (uvp)->tv_sec) ? 					\
-	((tvp)->tv_nsec cmp (uvp)->tv_nsec) : 				\
-	((tvp)->tv_sec cmp (uvp)->tv_sec))
-#endif
-
-#ifndef HAVE_BSD_MERGESORT
-/* mergesort.c */
-int mergesort(void *, size_t, size_t, int (*)(const void *, const void *));
-#endif
blob - /dev/null
blob + cf3344de4dcf1c539c459bbcb4a76d7353d28a1c (mode 644)
--- /dev/null
+++ include/got_compat2.h
@@ -0,0 +1,427 @@
+/*
+ * Copyright (c) 2023 Thomas Adam <thomas@xteddy.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _GOT_COMPAT_H_2
+#define _GOT_COMPAT_H_2
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/uio.h>
+#if defined(__FreeBSD__)
+#include <sys/endian.h>
+#include <sys/capsicum.h>
+#elif defined(__APPLE__)
+#include <machine/endian.h>
+#include <libkern/OSByteOrder.h>
+#include "compat/bsd-poll.h"
+
+#define FMT_SCALED_STRSIZE	7  /* minus sign, 4 digits, suffix, null byte */
+
+#define htobe16(x) OSSwapHostToBigInt16(x)
+#define htole16(x) OSSwapHostToLittleInt16(x)
+#define be16toh(x) OSSwapBigToHostInt16(x)
+#define le16toh(x) OSSwapLittleToHostInt16(x)
+
+#define htobe32(x) OSSwapHostToBigInt32(x)
+#define htole32(x) OSSwapHostToLittleInt32(x)
+#define be32toh(x) OSSwapBigToHostInt32(x)
+#define le32toh(x) OSSwapLittleToHostInt32(x)
+
+#define htobe64(x) OSSwapHostToBigInt64(x)
+#define htole64(x) OSSwapHostToLittleInt64(x)
+#define be64toh(x) OSSwapBigToHostInt64(x)
+#define le64toh(x) OSSwapLittleToHostInt64(x)
+
+#define st_atim st_atimespec
+#define st_ctim st_ctimespec
+#define st_mtim st_mtimespec
+
+#else /* Linux, etc... */
+#include <endian.h>
+#include <grp.h>
+#endif
+
+#include <fnmatch.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdint.h>
+
+/* For flock. */
+#ifndef O_EXLOCK
+#define O_EXLOCK 0
+#endif
+
+#ifndef HAVE_FLOCK
+#define LOCK_SH 0
+#define LOCK_EX 0
+#define LOCK_NB 0
+#define flock(fd, op) (0)
+#else
+#include <sys/file.h>
+#endif
+
+/* POSIX doesn't define WAIT_ANY, so provide it if it's not found. */
+#ifndef WAIT_ANY
+#define WAIT_ANY (-1)
+#endif
+
+/* SOCK_NONBLOCK isn't available across BSDs... */
+#ifndef SOCK_NONBLOCK
+#define SOCK_NONBLOCK 00004000
+#endif
+
+/* On FreeBSD (and possibly others), EAI_NODATA was removed, in favour of
+ * using EAI_NONAME.
+ */
+#ifndef EAI_NODATA
+#define EAI_NODATA EAI_NONAME
+#endif
+
+#ifndef __dead
+#define __dead __attribute__ ((__noreturn__))
+#endif
+
+#ifndef __unused
+#define __unused __attribute__ ((__unused__))
+#endif
+
+#ifndef __OpenBSD__
+#define pledge(s, p) (0)
+#define unveil(s, p) (0)
+#endif
+
+#ifndef __FreeBSD__
+#define cap_enter() (0)
+#endif
+
+#ifndef HAVE_SETRESGID
+#define setresgid(a, b, c) (0)
+#endif
+
+#ifndef HAVE_SETRESUID
+#define setresuid(a, b, c) (0)
+#endif
+
+#ifndef HAVE_LINUX_LANDLOCK_H
+#define landlock_no_fs() (0)
+#else
+int	landlock_no_fs(void);
+#endif
+
+#ifndef INFTIM
+#define INFTIM -1
+#endif
+
+#ifndef HAVE_BSD_UUID
+#include <uuid/uuid.h>
+#define uuid_s_ok 0
+#define uuid_s_bad_version  1
+#define uuid_s_invalid_string_uuid 2
+#define uuid_s_no_memory  3
+
+/* Length of a node address (an IEEE 802 address). */
+#define _UUID_NODE_LEN  6
+
+struct uuid {
+	uint32_t time_low;
+	uint16_t time_mid;
+	uint16_t time_hi_and_version;
+	uint8_t  clock_seq_hi_and_reserved;
+	uint8_t  clock_seq_low;
+	uint8_t  node[_UUID_NODE_LEN];
+};
+
+int32_t uuid_equal(struct uuid *, struct uuid *, uint32_t *);
+int32_t uuid_is_nil(struct uuid *, uint32_t *);
+void uuid_create(uuid_t *, uint32_t *);
+void uuid_create_nil(struct uuid *, uint32_t *);
+void uuid_from_string(const char *, uuid_t *, uint32_t *);
+void uuid_to_string(uuid_t *, char **, uint32_t *);
+#else
+#include <uuid.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#else
+#include <inttypes.h>
+#endif
+
+#ifdef HAVE_QUEUE_H
+#include <sys/queue.h>
+#endif
+
+#ifdef HAVE_TREE_H
+#include <sys/tree.h>
+#else
+#include "compat/tree.h"
+#endif
+
+#ifdef HAVE_UTIL_H
+#include <util.h>
+#endif
+
+#ifdef HAVE_LIBUTIL_H
+#include <libutil.h>
+#endif
+
+#ifdef HAVE_IMSG
+#else
+#include "compat/imsg.h"
+#endif
+
+#ifdef HAVE_SIPHASH
+#include <siphash.h>
+#else
+#include "compat/siphash.h"
+#endif
+
+/* Include Apple-specific headers.  Mostly for crypto.*/
+#if defined(__APPLE__)
+#define COMMON_DIGEST_FOR_OPENSSL
+#include <CommonCrypto/CommonDigest.h>
+
+#define SHA512_BLOCK_LENGTH		128
+typedef struct _SHA2_CTX {
+	union {
+		u_int32_t	st32[8];
+		u_int64_t	st64[8];
+	} state;
+	u_int64_t	bitcount[2];
+	u_int8_t	buffer[SHA512_BLOCK_LENGTH];
+} SHA2_CTX;
+#define SHA256Init SHA256_Init
+#define SHA256Update SHA256_Update
+#define SHA256Final SHA256_Final
+#endif
+
+#ifndef __APPLE__
+#ifdef HAVE_SHA_AS_SHA1
+#  include <sha.h>
+#endif
+#ifdef HAVE_SHA1_AS_SHA1
+#      include <sha1.h>
+#endif
+#ifdef HAVE_SHA2
+#    include <sha2.h>
+#else
+#    include "sha2.h"
+#endif
+#ifdef HAVE_SHA256
+#    include <sha256.h>
+#endif
+#endif
+
+/* Catch-all for systems where the header files don't exist and/or the below
+ * still are not defined.
+ */
+#ifndef SHA256_DIGEST_LENGTH
+#define SHA256_DIGEST_LENGTH 32
+#endif
+
+#ifndef SHA256_DIGEST_STRING_LENGTH
+#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
+#endif
+
+#if defined(__DragonFly__)
+#include <openssl/sha.h>
+#endif
+
+#ifndef SHA1_DIGEST_LENGTH
+#define SHA1_DIGEST_LENGTH		SHA_DIGEST_LENGTH
+#define SHA1_DIGEST_STRING_LENGTH	(SHA1_DIGEST_LENGTH * 2 + 1)
+
+#define SHA1_CTX	SHA_CTX
+#define SHA1Init	SHA1_Init
+#define SHA1Update	SHA1_Update
+#define SHA1Final	SHA1_Final
+#endif
+
+/*
+ * The following SA_LEN/SS_LEN dance comes from various source, notably
+ * OpenSMTP by way of OpenNTPD and OpenBGPD (thanks everyone!).  got-portable
+ * has tweaked a lot of the following macros to suit the needs of
+ * got-portable.
+ */
+
+/* From OpenNTPD portable */
+#if !defined(SA_LEN)
+# if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
+#  define SA_LEN(x)	((x)->sa_len)
+# else
+#  define SA_LEN(x)     ((x)->sa_family == AF_INET6 ? \
+			sizeof(struct sockaddr_in6) : \
+			sizeof(struct sockaddr_in))
+# endif
+
+#endif
+
+/* From OpenBGPD portable */
+#if !defined(SS_LEN)
+# if defined(HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN)
+#  define SS_LEN(x)  ((x)->ss_len)
+# else
+#  define SS_LEN(x)  SA_LEN((struct sockaddr *)(x))
+# endif
+#endif
+
+#ifndef HAVE_ASPRINTF
+/* asprintf.c */
+int		 asprintf(char **, const char *, ...);
+int		 vasprintf(char **, const char *, va_list);
+#endif
+
+#ifndef HAVE_EXPLICIT_BZERO
+/* explicit_bzero.c */
+void		 explicit_bzero(void *, size_t);
+#endif
+
+#ifndef HAVE_GETDTABLECOUNT
+/* getdtablecount.c */
+int		 getdtablecount(void);
+#endif
+
+#ifndef HAVE_CLOSEFROM
+/* closefrom.c */
+void		 closefrom(int);
+#endif
+
+#if defined (__FreeBSD__)
+#define closefrom(fd) (closefrom(fd), 0)
+#endif
+
+#ifndef HAVE_STRSEP
+/* strsep.c */
+char		*strsep(char **, const char *);
+#endif
+
+#ifndef HAVE_STRTONUM
+/* strtonum.c */
+long long	 strtonum(const char *, long long, long long, const char **);
+#endif
+
+#ifndef HAVE_STRLCPY
+/* strlcpy.c */
+size_t	 	 strlcpy(char *, const char *, size_t);
+#endif
+
+#ifndef HAVE_STRLCAT
+/* strlcat.c */
+size_t	 	 strlcat(char *, const char *, size_t);
+#endif
+
+#ifndef HAVE_STRNLEN
+/* strnlen.c */
+size_t		 strnlen(const char *, size_t);
+#endif
+
+#ifndef HAVE_STRNDUP
+/* strndup.c */
+char		*strndup(const char *, size_t);
+#endif
+
+#ifndef HAVE_GETPROGNAME
+/* getprogname.c */
+const char	*getprogname(void);
+#endif
+
+#ifndef HAVE_GETLINE
+/* getline.c */
+ssize_t		 getline(char **, size_t *, FILE *);
+#endif
+
+#ifndef HAVE_FREEZERO
+/* freezero.c */
+void		 freezero(void *, size_t);
+#endif
+
+#ifndef HAVE_GETDTABLECOUNT
+/* getdtablecount.c */
+int		 getdtablecount(void);
+#endif
+
+#ifndef HAVE_REALLOCARRAY
+/* reallocarray.c */
+void		*reallocarray(void *, size_t, size_t);
+#endif
+
+#ifndef HAVE_RECALLOCARRAY
+/* recallocarray.c */
+void		*recallocarray(void *, size_t, size_t, size_t);
+#endif
+
+#ifndef HAVE_SETPROCTITLE
+/* setproctitle.c */
+void 		 setproctitle(const char *, ...);
+#endif
+
+#ifndef HAVE_FMT_SCALED
+/* fmt_scaled.c */
+int fmt_scaled(long long, char *);
+int scan_scaled(char *, long long *);
+#define FMT_SCALED_STRSIZE	7  /* minus sign, 4 digits, suffix, null byte */
+#endif
+
+#ifndef HAVE_LIBBSD
+/* getopt.c */
+extern int	BSDopterr;
+extern int	BSDoptind;
+extern int	BSDoptopt;
+extern int	BSDoptreset;
+extern char    *BSDoptarg;
+int	BSDgetopt(int, char *const *, const char *);
+#define getopt(ac, av, o)  BSDgetopt(ac, av, o)
+#define opterr             BSDopterr
+#define optind             BSDoptind
+#define optopt             BSDoptopt
+#define optreset           BSDoptreset
+#define optarg             BSDoptarg
+#endif
+#endif
+
+/* Check for some of the non-portable timespec*() functions.
+ * This should largely come from libbsd for systems which
+ * aren't BSD, but this will depend on how old the library
+ * is.
+ */
+#ifndef timespecisset
+#define	timespecisset(tsp) \
+	((tsp)->tv_sec || (tsp)->tv_nsec)
+#endif
+
+#ifndef timespecsub
+#define	timespecsub(tsp, usp, vsp)					\
+	do {								\
+		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		\
+		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	\
+		if ((vsp)->tv_nsec < 0) {				\
+			(vsp)->tv_sec--;				\
+			(vsp)->tv_nsec += 1000000000L;			\
+		}							\
+	} while (0)
+#endif
+
+#ifndef timespeccmp
+#define timespeccmp(tvp, uvp, cmp) 					\
+(((tvp)->tv_sec == (uvp)->tv_sec) ? 					\
+	((tvp)->tv_nsec cmp (uvp)->tv_nsec) : 				\
+	((tvp)->tv_sec cmp (uvp)->tv_sec))
+#endif
+
+#ifndef HAVE_BSD_MERGESORT
+/* mergesort.c */
+int mergesort(void *, size_t, size_t, int (*)(const void *, const void *));
+#endif