commit - 9d70a0bf7236fdcfbe7186f0d90a5a15f5a10b18
commit + d24ddaa6a9de118f70658f7fd917c37cc787b425
blob - 0b90a45a21dee8de83282118e67277aef5bd3370
blob + ce2d4cc88d90c3611d0543805a07ce183e3989d7
--- compat/Makefile.am
+++ compat/Makefile.am
include $(top_builddir)/Makefile.common
-
libopenbsd_compat_a_SOURCES = \
asprintf.c \
base64.c \
merge.c \
reallocarray.c \
recallocarray.c \
- strlcat.c \
- strlcpy.c \
strndup.c \
strnlen.c \
strsep.c \
imsg.h \
queue.h \
tree.h
-if HOST_FREEBSD
-else
+
+# For MacOS, don't build the compat versions of strl{cat,cpy}, but do for all
+# other systems.
+if !HOST_DARWIN
+libopenbsd_compat_a_SOURCES += strlcat.c strlcpy.c
+endif
+
+if HOST_DARWIN
+libopenbsd_compat_a_SOURCES += uuid.c bsd-poll.c bsd-poll.h
+endif
+
+if HOST_LINUX
libopenbsd_compat_a_SOURCES += uuid.c
endif
$(top_srcdir)/include/got_compat.h \
imsg.h \
queue.h \
- tree.h
+ tree.h \
+ bsd-poll.h
blob - /dev/null
blob + 6276286954e17d1e3e2f6c42868c4f3c734eac38 (mode 644)
--- /dev/null
+++ compat/bsd-poll.c
+/*
+ * Copyright (c) 2004, 2005, 2007 Darren Tucker (dtucker at zip com au).
+ *
+ * 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.
+ */
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "bsd-poll.h"
+
+#ifndef MAX
+#define MAX(_a,_b) ((_a) > (_b) ? (_a) : (_b))
+#endif
+
+/*
+ * A minimal implementation of ppoll(2), built on top of pselect(2).
+ *
+ * Only supports POLLIN, POLLOUT and POLLPRI flags in pfd.events and
+ * revents. Notably POLLERR, POLLHUP and POLLNVAL are not supported.
+ *
+ * Supports pfd.fd = -1 meaning "unused" although it's not standard.
+ */
+
+int
+ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *tmoutp,
+ const sigset_t *sigmask)
+{
+ nfds_t i;
+ int saved_errno, ret, fd, maxfd = 0;
+ fd_set *readfds = NULL, *writefds = NULL, *exceptfds = NULL;
+ size_t nmemb;
+
+ for (i = 0; i < nfds; i++) {
+ fd = fds[i].fd;
+ if (fd != -1 && fd >= FD_SETSIZE) {
+ errno = EINVAL;
+ return -1;
+ }
+ maxfd = MAX(maxfd, fd);
+ }
+
+ nmemb = howmany(maxfd + 1 , NFDBITS);
+ if ((readfds = calloc(nmemb, sizeof(fd_mask))) == NULL ||
+ (writefds = calloc(nmemb, sizeof(fd_mask))) == NULL ||
+ (exceptfds = calloc(nmemb, sizeof(fd_mask))) == NULL) {
+ saved_errno = ENOMEM;
+ ret = -1;
+ goto out;
+ }
+
+ /* populate event bit vectors for the events we're interested in */
+ for (i = 0; i < nfds; i++) {
+ fd = fds[i].fd;
+ if (fd == -1)
+ continue;
+ if (fds[i].events & POLLIN)
+ FD_SET(fd, readfds);
+ if (fds[i].events & POLLOUT)
+ FD_SET(fd, writefds);
+ if (fds[i].events & POLLPRI)
+ FD_SET(fd, exceptfds);
+ }
+
+ ret = pselect(maxfd + 1, readfds, writefds, exceptfds, tmoutp, sigmask);
+ saved_errno = errno;
+
+ /* scan through select results and set poll() flags */
+ for (i = 0; i < nfds; i++) {
+ fd = fds[i].fd;
+ fds[i].revents = 0;
+ if (fd == -1)
+ continue;
+ if (FD_ISSET(fd, readfds))
+ fds[i].revents |= POLLIN;
+ if (FD_ISSET(fd, writefds))
+ fds[i].revents |= POLLOUT;
+ if (FD_ISSET(fd, exceptfds))
+ fds[i].revents |= POLLPRI;
+ }
+
+out:
+ free(readfds);
+ free(writefds);
+ free(exceptfds);
+ if (ret == -1)
+ errno = saved_errno;
+ return ret;
+}
+
+#if 0
+int
+poll(struct pollfd *fds, nfds_t nfds, int timeout)
+{
+ struct timespec ts, *tsp = NULL;
+
+ /* poll timeout is msec, ppoll is timespec (sec + nsec) */
+ if (timeout >= 0) {
+ ts.tv_sec = timeout / 1000;
+ ts.tv_nsec = (timeout % 1000) * 1000000;
+ tsp = &ts;
+ }
+
+ return ppoll(fds, nfds, tsp, NULL);
+}
+#endif
blob - /dev/null
blob + 7d00d7ae1a3330abe640f705fb93441f19a1415b (mode 644)
--- /dev/null
+++ compat/bsd-poll.h
+/* $OpenBSD: poll.h,v 1.11 2003/12/10 23:10:08 millert Exp $ */
+
+/*
+ * Copyright (c) 1996 Theo de Raadt
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* OPENBSD ORIGINAL: sys/sys/poll.h */
+
+#ifndef _COMPAT_POLL_H_
+#define _COMPAT_POLL_H_
+
+#include <sys/time.h>
+#include <time.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <poll.h>
+
+#ifndef HAVE_STRUCT_POLLFD_FD
+#define POLLIN 0x0001
+#define POLLPRI 0x0002
+#define POLLOUT 0x0004
+#define POLLERR 0x0008
+#define POLLHUP 0x0010
+#define POLLNVAL 0x0020
+#if 0
+/* the following are currently not implemented */
+#define POLLRDNORM 0x0040
+#define POLLNORM POLLRDNORM
+#define POLLWRNORM POLLOUT
+#define POLLRDBAND 0x0080
+#define POLLWRBAND 0x0100
+#endif
+#endif /* !HAVE_STRUCT_POLLFD_FD */
+
+typedef unsigned int nfds_t;
+
+int ppoll(struct pollfd *, nfds_t, const struct timespec *, const sigset_t *);
+#endif /* !_COMPAT_POLL_H_ */
blob - 84d736bf96aa79d1cf9cc867ebaec29949c808cc
blob + 02490499adb28ffd6366dab21a4eeefd8f2af8ff
--- compat/recallocarray.c
+++ compat/recallocarray.c
} else
memcpy(newptr, ptr, newsize);
+#ifdef __APPLE__
+ memset_s(ptr, oldsize, 0, oldsize);
+#else
explicit_bzero(ptr, oldsize);
+#endif
free(ptr);
return newptr;
blob - a6a9e4ac68ebe429ef54422735a95b074e10badc
blob + c1dadc78e3d333acc31fde5ea029c5ecc6f5f3dc
--- configure.ac
+++ configure.ac
netdb.h \
netinet/in.h \
paths.h \
+ poll.h \
stddef.h \
stdint.h \
stdlib.h \
string.h \
sys/ioctl.h \
sys/param.h \
+ sys/poll.h \
sys/socket.h \
sys/time.h \
sys/tree.h \
*freebsd*)
AC_MSG_RESULT(freebsd)
PLATFORM=freebsd
+ ;;
+ *darwin*)
+ AC_MSG_RESULT(darwin)
+ PLATFORM=darwin
;;
*)
AC_MSG_RESULT(unknown)
AC_SUBST(PLATFORM)
AM_CONDITIONAL([HOST_FREEBSD], [test "$PLATFORM" = "freebsd"])
AM_CONDITIONAL([HOST_LINUX], [test "$PLATFORM" = "linux"])
+AM_CONDITIONAL([HOST_DARWIN], [test "$PLATFORM" = "darwin"])
# Landlock detection.
AC_MSG_CHECKING([for landlock])
AC_SEARCH_LIBS(uuid_create, found_uuid=no, found_uuid=yes)
AC_SEARCH_LIBS(mergesort, , AC_DEFINE(HAVE_BSD_MERGESORT))
-if test "x$found_uuid" = "xyes"; then
+# 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)
else
PKG_CHECK_MODULES(
blob - 9fc89b9dcace2ed2e34babe66f47c77677e29969
blob + 7d9db3e5a84ef970dfadb93d80e42e1ed2d4cefe
--- include/got_compat.h
+++ include/got_compat.h
#include <sys/uio.h>
#if defined(__FreeBSD__)
#include <sys/endian.h>
-#else
+#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>
#endif
#include "compat/imsg.h"
#endif
-#ifdef HAVE_LIBCRYPTO
+/* Include Apple-specific headers when libcrypto is in use. */
+#if defined(HAVE_LIBCRYPTO) && defined(__APPLE__)
+#define COMMON_DIGEST_FOR_OPENSSL
+#include <CommonCrypto/CommonDigest.h>
+#endif
+
+#if defined(HAVE_LIBCRYPTO) && !defined(__APPLE__)
#include <sha1.h>
-#else
+#elif !defined(__APPLE__)
#include <sha.h>
+#endif
+#if !defined(HAVE_LIBCRYPTO) || defined(__APPLE__)
#define SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH
#define SHA1_DIGEST_STRING_LENGTH (SHA1_DIGEST_LENGTH * 2 + 1)
#ifndef HAVE_CLOSEFROM
/* closefrom.c */
-//void closefrom(int);
-#define closefrom(fd) (closefrom(fd), 0)
+void closefrom(int);
#endif
#if defined (__FreeBSD__)
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
blob - a52c4af1a9366a4832e5efcd79cba83fcce4b8dd
blob + 27730ae459b928b0915680bfbb23bad789387ecd
--- tog/tog.c
+++ tog/tog.c
#include <ctype.h>
#include <errno.h>
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__APPLE__)
#define _XOPEN_SOURCE_EXTENDED /* for ncurses wide-character functions */
#endif
#include <curses.h>