From 13170a9694fc7b77501425b20c50e8d3b7221f45 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Wed, 6 Jun 2018 03:39:14 +0000 Subject: [PATCH 1/3] Revert "libbsd-freedesktop: re-init at 0.9.1, use for samba" This reverts commit 8b5ed12952300846928555b20fc10893f9df3965. --- pkgs/development/libraries/libbsd/default.nix | 21 ------------------- pkgs/top-level/all-packages.nix | 3 --- 2 files changed, 24 deletions(-) delete mode 100644 pkgs/development/libraries/libbsd/default.nix diff --git a/pkgs/development/libraries/libbsd/default.nix b/pkgs/development/libraries/libbsd/default.nix deleted file mode 100644 index 114d3209b58a..000000000000 --- a/pkgs/development/libraries/libbsd/default.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ stdenv, fetchurl }: - -stdenv.mkDerivation rec { - name = "libbsd-${version}"; - version = "0.9.1"; - - src = fetchurl { - url = "http://libbsd.freedesktop.org/releases/${name}.tar.xz"; - sha256 = "1957w2wi7iqar978qlfsm220dwywnrh5m58nrnn9zmi74ds3bn2n"; - }; - - patches = []; - - meta = with stdenv.lib; { - description = "Common functions found on BSD systems, Freedesktop fork"; - homepage = https://libbsd.freedesktop.org/; - license = licenses.bsd3; - platforms = platforms.linux; - maintainers = with maintainers; [ raskin ]; - }; -} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index dc29d48760b8..c700f37fed9c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -12963,7 +12963,6 @@ with pkgs; samba4 = callPackage ../servers/samba/4.x.nix { python = python2; - libbsd = libbsd-freedesktop; }; sambaMaster = callPackage ../servers/samba/master.nix { }; @@ -21532,8 +21531,6 @@ with pkgs; libbsd = netbsd.compat; - libbsd-freedesktop = callPackage ../development/libraries/libbsd {}; - inherit (recurseIntoAttrs (callPackages ../os-specific/bsd { })) netbsd; From f2682af9c9777068933c863065bf02b8d72706a6 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Wed, 6 Jun 2018 04:07:54 +0000 Subject: [PATCH 2/3] Revert "opendkim: fix libbsd dependency" This reverts commit b529dda3a19856cb2c1a26db0f0d2e0f6d268861. --- pkgs/top-level/all-packages.nix | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index c700f37fed9c..c537cdf8bc77 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4162,9 +4162,7 @@ with pkgs; opendht = callPackage ../development/libraries/opendht {}; - opendkim = callPackage ../development/libraries/opendkim { - libbsd = libbsd-freedesktop; - }; + opendkim = callPackage ../development/libraries/opendkim { }; opendylan = callPackage ../development/compilers/opendylan { opendylan-bootstrap = opendylan_bin; From 05fedecad9db7f06385d26b60e6353c7edc7d56a Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Wed, 6 Jun 2018 03:43:49 +0000 Subject: [PATCH 3/3] Revert "libbsd: replace with nbcompat" This reverts commit 480434f7eeefed7026dbbd11a4a0b1e4bfc1f137. netbsd.compat does not provide include files that are provided by libbsd [1], and it encumbers its transitive dependents with an obligatory include file that setups BSD-compatible C environment [2]. [1] https://github.com/NixOS/nixpkgs/pull/41320#issuecomment-394922277 [2] https://github.com/NixOS/nixpkgs/pull/41320#issuecomment-394928845 --- pkgs/development/libraries/libbsd/cdefs.patch | 222 ++++++ .../development/libraries/libbsd/darwin.patch | 703 ++++++++++++++++++ pkgs/development/libraries/libbsd/default.nix | 34 + .../libraries/libbsd/features.patch | 26 + .../libraries/libbsd/non-glibc.patch | 74 ++ pkgs/top-level/all-packages.nix | 4 +- 6 files changed, 1061 insertions(+), 2 deletions(-) create mode 100644 pkgs/development/libraries/libbsd/cdefs.patch create mode 100644 pkgs/development/libraries/libbsd/darwin.patch create mode 100644 pkgs/development/libraries/libbsd/default.nix create mode 100644 pkgs/development/libraries/libbsd/features.patch create mode 100644 pkgs/development/libraries/libbsd/non-glibc.patch diff --git a/pkgs/development/libraries/libbsd/cdefs.patch b/pkgs/development/libraries/libbsd/cdefs.patch new file mode 100644 index 000000000000..81822654aeb4 --- /dev/null +++ b/pkgs/development/libraries/libbsd/cdefs.patch @@ -0,0 +1,222 @@ +From 11ec8f1e5dfa1c10e0c9fb94879b6f5b96ba52dd Mon Sep 17 00:00:00 2001 +From: Guillem Jover +Date: Tue, 6 Mar 2018 01:41:35 +0100 +Subject: Handle systems missing + +This is a non-portable header, and we cannot expect it to be provided by +the system libc (e.g. musl). We just need and rely on declaration that +we have defined ourselves in our own . So we switch to +only ever assume that. + +Fixes: https://bugs.freedesktop.org/105281 +--- + include/bsd/libutil.h | 4 ++++ + include/bsd/md5.h | 4 ++++ + include/bsd/nlist.h | 4 ++++ + include/bsd/readpassphrase.h | 4 ++++ + include/bsd/stdlib.h | 4 ++++ + include/bsd/string.h | 4 ++++ + include/bsd/stringlist.h | 5 +++++ + include/bsd/sys/queue.h | 4 ++++ + include/bsd/sys/tree.h | 4 ++++ + include/bsd/timeconv.h | 4 ++++ + include/bsd/vis.h | 4 ++++ + include/bsd/wchar.h | 4 ++++ + 12 files changed, 49 insertions(+) + +diff --git a/include/bsd/libutil.h b/include/bsd/libutil.h +index 45b3b15..ccca29a 100644 +--- a/include/bsd/libutil.h ++++ b/include/bsd/libutil.h +@@ -40,7 +40,11 @@ + #define LIBBSD_LIBUTIL_H + + #include ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/include/bsd/md5.h b/include/bsd/md5.h +index 5f3ae46..bf36a30 100644 +--- a/include/bsd/md5.h ++++ b/include/bsd/md5.h +@@ -27,7 +27,11 @@ typedef struct MD5Context { + uint8_t buffer[MD5_BLOCK_LENGTH]; /* input buffer */ + } MD5_CTX; + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + + __BEGIN_DECLS +diff --git a/include/bsd/nlist.h b/include/bsd/nlist.h +index cb297e8..8767117 100644 +--- a/include/bsd/nlist.h ++++ b/include/bsd/nlist.h +@@ -27,7 +27,11 @@ + #ifndef LIBBSD_NLIST_H + #define LIBBSD_NLIST_H + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + + struct nlist { + union { +diff --git a/include/bsd/readpassphrase.h b/include/bsd/readpassphrase.h +index 14744b8..5eb8021 100644 +--- a/include/bsd/readpassphrase.h ++++ b/include/bsd/readpassphrase.h +@@ -31,7 +31,11 @@ + #define RPP_SEVENBIT 0x10 /* Strip the high bit from input. */ + #define RPP_STDIN 0x20 /* Read from stdin, not /dev/tty */ + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + + __BEGIN_DECLS +diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h +index ebc9638..8d33d1f 100644 +--- a/include/bsd/stdlib.h ++++ b/include/bsd/stdlib.h +@@ -42,7 +42,11 @@ + #ifndef LIBBSD_STDLIB_H + #define LIBBSD_STDLIB_H + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + #include + +diff --git a/include/bsd/string.h b/include/bsd/string.h +index 6798bf6..29097f6 100644 +--- a/include/bsd/string.h ++++ b/include/bsd/string.h +@@ -33,7 +33,11 @@ + #ifndef LIBBSD_STRING_H + #define LIBBSD_STRING_H + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + + __BEGIN_DECLS +diff --git a/include/bsd/stringlist.h b/include/bsd/stringlist.h +index ff30cac..dd71496 100644 +--- a/include/bsd/stringlist.h ++++ b/include/bsd/stringlist.h +@@ -31,7 +31,12 @@ + + #ifndef LIBBSD_STRINGLIST_H + #define LIBBSD_STRINGLIST_H ++ ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + + /* +diff --git a/include/bsd/sys/queue.h b/include/bsd/sys/queue.h +index 4a94ea7..ac00026 100644 +--- a/include/bsd/sys/queue.h ++++ b/include/bsd/sys/queue.h +@@ -33,7 +33,11 @@ + #ifndef LIBBSD_SYS_QUEUE_H + #define LIBBSD_SYS_QUEUE_H + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + + /* + * This file defines four types of data structures: singly-linked lists, +diff --git a/include/bsd/sys/tree.h b/include/bsd/sys/tree.h +index 628bec0..325b382 100644 +--- a/include/bsd/sys/tree.h ++++ b/include/bsd/sys/tree.h +@@ -30,7 +30,11 @@ + #ifndef LIBBSD_SYS_TREE_H + #define LIBBSD_SYS_TREE_H + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + + /* + * This file defines data structures for different types of trees: +diff --git a/include/bsd/timeconv.h b/include/bsd/timeconv.h +index e2a2c55..a426bd3 100644 +--- a/include/bsd/timeconv.h ++++ b/include/bsd/timeconv.h +@@ -41,7 +41,11 @@ + #ifndef LIBBSD_TIMECONV_H + #define LIBBSD_TIMECONV_H + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + #include + +diff --git a/include/bsd/vis.h b/include/bsd/vis.h +index 970dfdd..ab5430c 100644 +--- a/include/bsd/vis.h ++++ b/include/bsd/vis.h +@@ -72,7 +72,11 @@ + */ + #define UNVIS_END 1 /* no more characters */ + ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + + __BEGIN_DECLS + char *vis(char *, int, int, int); +diff --git a/include/bsd/wchar.h b/include/bsd/wchar.h +index 33a500e..7216503 100644 +--- a/include/bsd/wchar.h ++++ b/include/bsd/wchar.h +@@ -40,7 +40,11 @@ + #define LIBBSD_WCHAR_H + + #include ++#ifdef LIBBSD_OVERLAY + #include ++#else ++#include ++#endif + #include + + __BEGIN_DECLS +-- +cgit v1.1 + diff --git a/pkgs/development/libraries/libbsd/darwin.patch b/pkgs/development/libraries/libbsd/darwin.patch new file mode 100644 index 000000000000..4bddec6b0ffd --- /dev/null +++ b/pkgs/development/libraries/libbsd/darwin.patch @@ -0,0 +1,703 @@ +diff --git a/configure.ac b/configure.ac +index 88ccd91..0857782 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -59,7 +59,7 @@ AS_CASE([$host_os], + ) + + # Checks for header files. +-AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h]) ++AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h stdio_ext.h]) + + # Checks for typedefs, structures, and compiler characteristics. + AC_C_INLINE +@@ -146,6 +146,31 @@ AC_CHECK_FUNCS([clearenv dirfd fopencookie __fpurge \ + pstat_getproc sysconf]) + AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = "xtrue"]) + ++HostOS=`echo "$host" | sed 's/.*-//'` ++os_is_macosx=false ++nonLinuxOS=false ++AC_SUBST(HostOS) ++case ${HostOS} in ++ darwin* | powerpc*-*-darwin* | freebsd* | netbsd* | openbsd*) ++ os_is_macosx=true ++ nonLinuxOS=true ++ echo HostOS="$HostOS" ++ ;; ++ *) ++ echo host="$host" ++ echo HostOS="$HostOS" ++ os_is_macosx=false ++ nonLinuxOS=false ++ ;; ++esac ++AM_CONDITIONAL([IS_DARWIN], [test x$os_is_macosx = xtrue]) ++AM_COND_IF([IS_DARWIN], ++ [AC_DEFINE([IS_DARWIN], [1], [Get HostOS Type is Darwin])]) ++ ++AM_CONDITIONAL([NON_LINUX], [test x$userdefine_gethostbyname_r = xtrue]) ++AM_COND_IF([NON_LINUX], ++ [AC_DEFINE([NON_LINUX], [1], [Get HostOS Type])]) ++ + AC_CONFIG_FILES([ + Makefile + include/Makefile +diff --git a/include/bsd/libutil.h b/include/bsd/libutil.h +index 45b3b15..d0d4043 100644 +--- a/include/bsd/libutil.h ++++ b/include/bsd/libutil.h +@@ -39,7 +39,9 @@ + #ifndef LIBBSD_LIBUTIL_H + #define LIBBSD_LIBUTIL_H + ++#ifdef HAVE_FEATURES_H + #include ++#endif + #include + #include + #include +diff --git a/include/bsd/stdio.h b/include/bsd/stdio.h +index 4b69983..c75151b 100644 +--- a/include/bsd/stdio.h ++++ b/include/bsd/stdio.h +@@ -48,12 +48,16 @@ + __BEGIN_DECLS + const char *fmtcheck(const char *, const char *); + ++#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX) + /* XXX: The function requires cooperation from the system libc to store the + * line buffer in the FILE struct itself. */ + char *fgetln(FILE *fp, size_t *lenp) +- LIBBSD_DEPRECATED("This functions cannot be safely ported, " +- "use getline(3) instead, as it is supported " +- "by GNU and POSIX.1-2008."); ++ __attribute__((deprecated("This functions cannot be safely ported, " ++ "use getline(3) instead, as it is supported " ++ "by GNU and POSIX.1-2008."))); ++#else ++char *fgetln(FILE *fp, size_t *lenp); ++#endif + + /* + * Note: We diverge from the FreeBSD, OpenBSD and DragonFlyBSD declarations, +diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h +index ebc9638..6cd7943 100644 +--- a/include/bsd/stdlib.h ++++ b/include/bsd/stdlib.h +@@ -67,9 +67,11 @@ int sradixsort(const unsigned char **base, int nmemb, + const unsigned char *table, unsigned endbyte); + + void *reallocf(void *ptr, size_t size); +-#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 26) ++#if defined(_GNU_SOURCE) && defined(__GLIBC__) && defined(__GLIBC_PREREQ) ++#if !__GLIBC_PREREQ(2, 26) + void *reallocarray(void *ptr, size_t nmemb, size_t size); + #endif ++#endif + + long long strtonum(const char *nptr, long long minval, long long maxval, + const char **errstr); +diff --git a/include/bsd/string.h b/include/bsd/string.h +index 6798bf6..6baaa14 100644 +--- a/include/bsd/string.h ++++ b/include/bsd/string.h +@@ -37,6 +37,12 @@ + #include + + __BEGIN_DECLS ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++size_t bsd_strlcpy(char *dst, const char *src, size_t siz); ++size_t bsd_strlcat(char *dst, const char *src, size_t siz); ++char *bsd_strnstr(const char *str, const char *find, size_t str_len); ++void bsd_strmode(mode_t mode, char *str); ++#else + size_t strlcpy(char *dst, const char *src, size_t siz); + size_t strlcat(char *dst, const char *src, size_t siz); + char *strnstr(const char *str, const char *find, size_t str_len); +@@ -45,6 +51,7 @@ void strmode(mode_t mode, char *str); + #if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 25) + void explicit_bzero(void *buf, size_t len); + #endif ++#endif + __END_DECLS + + #endif +diff --git a/src/Makefile.am b/src/Makefile.am +index ad83dbf..0f2a7ee 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -54,17 +54,21 @@ libbsd_la_DEPENDENCIES = \ + libbsd.map + libbsd_la_LIBADD = \ + $(CLOCK_GETTIME_LIBS) ++ ++if IS_DARWIN ++libbsd_la_LDFLAGS = \ ++ -Wl \ ++ -version-number $(LIBBSD_ABI) ++else + libbsd_la_LDFLAGS = \ + -Wl,--version-script=$(srcdir)/libbsd.map \ + -version-number $(LIBBSD_ABI) ++endif ++ + libbsd_la_SOURCES = \ + arc4random.c \ +- arc4random.h \ +- arc4random_unix.h \ +- arc4random_openbsd.h \ + arc4random_uniform.c \ + bsd_getopt.c \ +- chacha_private.h \ + closefrom.c \ + dehumanize_number.c \ + err.c \ +@@ -117,6 +121,15 @@ libbsd_la_SOURCES += \ + $(nil) + endif + ++noinst_HEADERS = \ ++ arc4random.h \ ++ arc4random_bsd.h \ ++ arc4random_linux.h \ ++ arc4random_unix.h \ ++ arc4random_osx.h \ ++ arc4random_openbsd.h \ ++ chacha_private.h ++ + libbsd_ctor_a_SOURCES = \ + setproctitle_ctor.c \ + $(nil) +diff --git a/src/arc4random_bsd.h b/src/arc4random_bsd.h +new file mode 100644 +index 0000000..ece2f85 +--- /dev/null ++++ b/src/arc4random_bsd.h +@@ -0,0 +1,86 @@ ++/* $OpenBSD: arc4random_freebsd.h,v 1.2 2015/01/15 06:57:18 deraadt Exp $ */ ++ ++/* ++ * Copyright (c) 1996, David Mazieres ++ * Copyright (c) 2008, Damien Miller ++ * Copyright (c) 2013, Markus Friedl ++ * Copyright (c) 2014, Theo de Raadt ++ * ++ * 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. ++ */ ++ ++/* ++ * Stub functions for portability. ++ */ ++ ++#include ++ ++#include ++#include ++ ++static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER; ++#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx) ++#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx) ++ ++/* ++ * Unfortunately, pthread_atfork() is broken on FreeBSD (at least 9 and 10) if ++ * a program does not link to -lthr. Callbacks registered with pthread_atfork() ++ * appear to fail silently. So, it is not always possible to detect a PID ++ * wraparound. ++ */ ++#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f)) ++ ++static inline void ++_getentropy_fail(void) ++{ ++ raise(SIGKILL); ++} ++ ++static volatile sig_atomic_t _rs_forked; ++ ++static inline void ++_rs_forkhandler(void) ++{ ++ _rs_forked = 1; ++} ++ ++static inline void ++_rs_forkdetect(void) ++{ ++ static pid_t _rs_pid = 0; ++ pid_t pid = getpid(); ++ ++ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) { ++ _rs_pid = pid; ++ _rs_forked = 0; ++ if (rs) ++ memset(rs, 0, sizeof(*rs)); ++ } ++} ++ ++static inline int ++_rs_allocate(struct _rs **rsp, struct _rsx **rsxp) ++{ ++ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE, ++ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) ++ return (-1); ++ ++ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE, ++ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) { ++ munmap(*rsp, sizeof(**rsp)); ++ return (-1); ++ } ++ ++ _ARC4_ATFORK(_rs_forkhandler); ++ return (0); ++} +diff --git a/src/arc4random_linux.h b/src/arc4random_linux.h +new file mode 100644 +index 0000000..d61a8db +--- /dev/null ++++ b/src/arc4random_linux.h +@@ -0,0 +1,86 @@ ++/* $OpenBSD: arc4random_linux.h,v 1.8 2014/08/13 06:04:10 deraadt Exp $ */ ++ ++/* ++ * Copyright (c) 1996, David Mazieres ++ * Copyright (c) 2008, Damien Miller ++ * Copyright (c) 2013, Markus Friedl ++ * Copyright (c) 2014, Theo de Raadt ++ * ++ * 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. ++ */ ++ ++/* ++ * Stub functions for portability. ++ */ ++ ++#include ++ ++#include ++#include ++ ++static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER; ++#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx) ++#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx) ++ ++#ifdef __GLIBC__ ++extern void *__dso_handle; ++extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *); ++#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle) ++#else ++#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f)) ++#endif ++ ++static inline void ++_getentropy_fail(void) ++{ ++ raise(SIGKILL); ++} ++ ++static volatile sig_atomic_t _rs_forked; ++ ++static inline void ++_rs_forkhandler(void) ++{ ++ _rs_forked = 1; ++} ++ ++static inline void ++_rs_forkdetect(void) ++{ ++ static pid_t _rs_pid = 0; ++ pid_t pid = getpid(); ++ ++ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) { ++ _rs_pid = pid; ++ _rs_forked = 0; ++ if (rs) ++ memset(rs, 0, sizeof(*rs)); ++ } ++} ++ ++static inline int ++_rs_allocate(struct _rs **rsp, struct _rsx **rsxp) ++{ ++ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE, ++ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) ++ return (-1); ++ ++ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE, ++ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) { ++ munmap(*rsp, sizeof(**rsp)); ++ return (-1); ++ } ++ ++ _ARC4_ATFORK(_rs_forkhandler); ++ return (0); ++} +diff --git a/src/arc4random_osx.h b/src/arc4random_osx.h +new file mode 100644 +index 0000000..14771a6 +--- /dev/null ++++ b/src/arc4random_osx.h +@@ -0,0 +1,82 @@ ++/* $OpenBSD: arc4random_osx.h,v 1.10 2015/09/11 11:52:55 deraadt Exp $ */ ++ ++/* ++ * Copyright (c) 1996, David Mazieres ++ * Copyright (c) 2008, Damien Miller ++ * Copyright (c) 2013, Markus Friedl ++ * Copyright (c) 2014, Theo de Raadt ++ * ++ * 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. ++ */ ++ ++/* ++ * Stub functions for portability. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++ ++static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER; ++#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx) ++#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx) ++ ++#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f)) ++ ++static inline void ++_getentropy_fail(void) ++{ ++ raise(SIGKILL); ++} ++ ++static volatile sig_atomic_t _rs_forked; ++ ++static inline void ++_rs_forkhandler(void) ++{ ++ _rs_forked = 1; ++} ++ ++static inline void ++_rs_forkdetect(void) ++{ ++ static pid_t _rs_pid = 0; ++ pid_t pid = getpid(); ++ ++ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) { ++ _rs_pid = pid; ++ _rs_forked = 0; ++ if (rs) ++ memset(rs, 0, sizeof(*rs)); ++ } ++} ++ ++static inline int ++_rs_allocate(struct _rs **rsp, struct _rsx **rsxp) ++{ ++ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE, ++ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) ++ return (-1); ++ ++ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE, ++ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) { ++ munmap(*rsp, sizeof(**rsp)); ++ *rsp = NULL; ++ return (-1); ++ } ++ ++ _ARC4_ATFORK(_rs_forkhandler); ++ return (0); ++} +diff --git a/src/fgetln.c b/src/fgetln.c +index 4d1726e..9c73788 100644 +--- a/src/fgetln.c ++++ b/src/fgetln.c +@@ -30,7 +30,9 @@ + #include + #include + ++#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX) + #include "local-link.h" ++#endif + + #ifdef HAVE_GETLINE + struct filebuf { +@@ -75,9 +77,11 @@ fgetln(FILE *stream, size_t *len) + return fb->buf; + } + } ++#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX) + libbsd_link_warning(fgetln, + "This functions cannot be safely ported, use getline(3) " + "instead, as it is supported by GNU and POSIX.1-2008.") ++#endif + #else + #error "Function fgetln() needs to be ported." + #endif +diff --git a/src/fpurge.c b/src/fpurge.c +index 462535a..e7eb46f 100644 +--- a/src/fpurge.c ++++ b/src/fpurge.c +@@ -26,9 +26,11 @@ + + #include + #include ++#if HAVE___FPURGE + #include ++#endif + +-#ifdef HAVE___FPURGE ++#ifdef HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */ + int + fpurge(FILE *fp) + { +@@ -42,5 +44,55 @@ fpurge(FILE *fp) + return 0; + } + #else +-#error "Function fpurge() needs to be ported." ++#define fp_ fp ++//#error "Function fpurge() needs to be ported." ++//#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin 1.7 */ ++int ++fpurge(FILE *fp) ++{ ++ if (fp == NULL || fileno(fp) < 0) { ++ errno = EBADF; ++ return EOF; ++ } ++ ++ /* Call the system's fpurge function. */ ++# undef fpurge ++# if !HAVE_DECL_FPURGE ++ extern int fpurge (FILE *); ++# endif ++ int result = fpurge (fp); ++# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */ ++ if (result == 0) ++ /* Correct the invariants that fpurge broke. ++ on BSD systems says: ++ "The following always hold: if _flags & __SRD, _w is 0." ++ If this invariant is not fulfilled and the stream is read-write but ++ currently reading, subsequent putc or fputc calls will write directly ++ into the buffer, although they shouldn't be allowed to. */ ++ if ((fp_->_flags & __SRD) != 0) ++ fp_->_w = 0; ++#endif ++ return result; ++} ++//#endif ++#endif ++ ++#ifdef TEST ++int ++main() ++{ ++ static FILE fp_bad; ++ FILE *fp; ++ ++ if (fpurge(&fp_bad) == 0) ++ return 1; ++ ++ fp = fopen("/dev/zero", "r"); ++ if (fpurge(fp) < 0) ++ return 1; ++ ++ fclose(fp); ++ ++ return 0; ++} + #endif +diff --git a/src/funopen.c b/src/funopen.c +index 1e05c7e..75e61ea 100644 +--- a/src/funopen.c ++++ b/src/funopen.c +@@ -143,6 +143,7 @@ funopen(const void *cookie, + * they will not add the needed support to implement it. Just ignore this + * interface there, as it has never been provided anyway. + */ ++#elif defined(darwin) || defined(__APPLE__) || defined(MACOSX) + #else + #error "Function funopen() needs to be ported or disabled." + #endif +diff --git a/src/getentropy.c b/src/getentropy.c +index 3f11a1e..8a23a07 100644 +--- a/src/getentropy.c ++++ b/src/getentropy.c +@@ -28,9 +28,7 @@ + #include "getentropy_linux.c" + #elif defined(__GNU__) + #include "getentropy_hurd.c" +-#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +-#include "getentropy_bsd.c" +-#elif defined(__NetBSD__) ++#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) + #include "getentropy_bsd.c" + #elif defined(__sun) + #include "getentropy_solaris.c" +diff --git a/src/hash/sha512.h b/src/hash/sha512.h +index 4f368a1..ab22fc1 100644 +--- a/src/hash/sha512.h ++++ b/src/hash/sha512.h +@@ -29,7 +29,11 @@ + #ifndef _SHA512_H_ + #define _SHA512_H_ + ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++#include ++#else + #include ++#endif + + #define SHA512_DIGEST_LENGTH 64 + +diff --git a/src/hash/sha512c.c b/src/hash/sha512c.c +index b3c8d5e..f69013d 100644 +--- a/src/hash/sha512c.c ++++ b/src/hash/sha512c.c +@@ -25,7 +25,13 @@ + */ + + #include ++__FBSDID("$FreeBSD$"); ++ ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++#include ++#else + #include ++#endif + #include + + #include +diff --git a/src/nlist.c b/src/nlist.c +index 0932f59..598a329 100644 +--- a/src/nlist.c ++++ b/src/nlist.c +@@ -27,6 +27,10 @@ + * SUCH DAMAGE. + */ + ++#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX) ++#if defined(LIBC_SCCS) && !defined(lint) ++static char sccsid[] = "@(#)nlist.c 8.1 (Berkeley) 6/4/93"; ++#endif /* LIBC_SCCS and not lint */ + #include + + #include +@@ -265,3 +269,4 @@ nlist(const char *name, struct nlist *list) + (void)close(fd); + return (n); + } ++#endif /* _NLIST_DO_ELF */ +diff --git a/src/setproctitle.c b/src/setproctitle.c +index 038ac7d..d0ef01b 100644 +--- a/src/setproctitle.c ++++ b/src/setproctitle.c +@@ -32,6 +32,11 @@ + #include + #include + ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++#define __asm__(x) ++extern char **environ; ++#endif ++ + static struct { + /* Original value. */ + const char *arg0; +@@ -287,7 +292,14 @@ __asm__(".symver setproctitle_impl,setproctitle@@LIBBSD_0.5"); + * for code linking against that version, and change the default to use the + * new version, so that new code depends on the implemented version. */ + #ifdef HAVE_TYPEOF ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++// ++// HACK: even weak aliasing breaks in clang so just comment this out for now ++// ++// extern typeof(setproctitle_impl) setproctitle_stub __attribute__((weak, alias("setproctitle_impl"))); ++#else + extern typeof(setproctitle_impl) setproctitle_stub __attribute__((alias("setproctitle_impl"))); ++#endif + #else + void setproctitle_stub(const char *fmt, ...) + __attribute__((alias("setproctitle_impl"))); +diff --git a/src/strlcat.c b/src/strlcat.c +index 14c53a1..e01cb60 100644 +--- a/src/strlcat.c ++++ b/src/strlcat.c +@@ -27,7 +27,11 @@ + * If retval >= dsize, truncation occurred. + */ + size_t ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++bsd_strlcat(char *dst, const char *src, size_t dsize) ++#else + strlcat(char *dst, const char *src, size_t dsize) ++#endif + { + const char *odst = dst; + const char *osrc = src; +diff --git a/src/strlcpy.c b/src/strlcpy.c +index e9a7fe4..10a855f 100644 +--- a/src/strlcpy.c ++++ b/src/strlcpy.c +@@ -25,7 +25,11 @@ + * Returns strlen(src); if retval >= dsize, truncation occurred. + */ + size_t ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++bsd_strlcpy(char *dst, const char *src, size_t dsize) ++#else + strlcpy(char *dst, const char *src, size_t dsize) ++#endif + { + const char *osrc = src; + size_t nleft = dsize; +diff --git a/src/strmode.c b/src/strmode.c +index e6afde5..c463243 100644 +--- a/src/strmode.c ++++ b/src/strmode.c +@@ -33,7 +33,11 @@ + #include + + void ++#if defined(darwin) || defined(__APPLE__) || defined(MACOSX) ++bsd_strmode(mode_t mode, char *p) ++#else + strmode(mode_t mode, char *p) ++#endif + { + /* print type */ + switch (mode & S_IFMT) { diff --git a/pkgs/development/libraries/libbsd/default.nix b/pkgs/development/libraries/libbsd/default.nix new file mode 100644 index 000000000000..ff9412ceb580 --- /dev/null +++ b/pkgs/development/libraries/libbsd/default.nix @@ -0,0 +1,34 @@ +{ stdenv, fetchurl, autoreconfHook }: + +stdenv.mkDerivation rec { + name = "libbsd-${version}"; + version = "0.8.7"; + + src = fetchurl { + url = "http://libbsd.freedesktop.org/releases/${name}.tar.xz"; + sha256 = "0c9bl49zs0xdddcwj5dh0lay9sxi2m1yi74848g8p87mb87g2j7m"; + }; + + # darwin changes configure.ac which means we need to regenerate + # the configure scripts + nativeBuildInputs = [ autoreconfHook ]; + + patches = stdenv.lib.optional stdenv.isDarwin ./darwin.patch + # Suitable for all, but limited to musl to avoid rebuilds + ++ stdenv.lib.optionals stdenv.hostPlatform.isMusl [ + # https://cgit.freedesktop.org/libbsd/commit/?id=1f8a3f7bccfc84b195218ad0086ebd57049c3490 + ./non-glibc.patch + # https://cgit.freedesktop.org/libbsd/commit/?id=11ec8f1e5dfa1c10e0c9fb94879b6f5b96ba52dd + ./cdefs.patch + # https://cgit.freedesktop.org/libbsd/commit/?id=b20272f5a966333b49fdf2bda797e2a9f0227404 + ./features.patch + ]; + + meta = with stdenv.lib; { + description = "Common functions found on BSD systems"; + homepage = https://libbsd.freedesktop.org/; + license = licenses.bsd3; + platforms = platforms.linux ++ platforms.darwin; + maintainers = with maintainers; [ matthewbauer ]; + }; +} diff --git a/pkgs/development/libraries/libbsd/features.patch b/pkgs/development/libraries/libbsd/features.patch new file mode 100644 index 000000000000..66bd1e9232ba --- /dev/null +++ b/pkgs/development/libraries/libbsd/features.patch @@ -0,0 +1,26 @@ +From b20272f5a966333b49fdf2bda797e2a9f0227404 Mon Sep 17 00:00:00 2001 +From: Guillem Jover +Date: Tue, 6 Mar 2018 01:42:52 +0100 +Subject: Remove inclusion from + +This is a non-portable header, and we should not assume it is present. +Let the first system header pull it in if needed. +--- + include/bsd/libutil.h | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/include/bsd/libutil.h b/include/bsd/libutil.h +index ccca29a..e5f148a 100644 +--- a/include/bsd/libutil.h ++++ b/include/bsd/libutil.h +@@ -39,7 +39,6 @@ + #ifndef LIBBSD_LIBUTIL_H + #define LIBBSD_LIBUTIL_H + +-#include + #ifdef LIBBSD_OVERLAY + #include + #else +-- +cgit v1.1 + diff --git a/pkgs/development/libraries/libbsd/non-glibc.patch b/pkgs/development/libraries/libbsd/non-glibc.patch new file mode 100644 index 000000000000..f61e0d242943 --- /dev/null +++ b/pkgs/development/libraries/libbsd/non-glibc.patch @@ -0,0 +1,74 @@ +From 1f8a3f7bccfc84b195218ad0086ebd57049c3490 Mon Sep 17 00:00:00 2001 +From: Guillem Jover +Date: Tue, 6 Mar 2018 01:39:45 +0100 +Subject: Fix function declaration protection for glibc already providing them +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +On non-glibc based systems we cannot unconditionally use the +__GLIBC_PREREQ macro as it gets expanded before evaluation. Instead, +if it is undefined, define it to 0. + +We should also always declare these functions on non-glibc based +systems. And on systems with a new enough glibc, which provides these +functions, we should still provide the declarations if _GNU_SOURCE +is *not* defined. + +Reported-by: Jörg Krause +--- + include/bsd/stdlib.h | 3 ++- + include/bsd/string.h | 3 ++- + include/bsd/sys/cdefs.h | 8 ++++++++ + 3 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h +index 8d33d1f..a5b063c 100644 +--- a/include/bsd/stdlib.h ++++ b/include/bsd/stdlib.h +@@ -71,7 +71,8 @@ int sradixsort(const unsigned char **base, int nmemb, + const unsigned char *table, unsigned endbyte); + + void *reallocf(void *ptr, size_t size); +-#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 26) ++#if !defined(__GLIBC__) || \ ++ (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 26) || !defined(_GNU_SOURCE))) + void *reallocarray(void *ptr, size_t nmemb, size_t size); + #endif + +diff --git a/include/bsd/string.h b/include/bsd/string.h +index 29097f6..f987fee 100644 +--- a/include/bsd/string.h ++++ b/include/bsd/string.h +@@ -46,7 +46,8 @@ size_t strlcat(char *dst, const char *src, size_t siz); + char *strnstr(const char *str, const char *find, size_t str_len); + void strmode(mode_t mode, char *str); + +-#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 25) ++#if !defined(__GLIBC__) || \ ++ (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 25) || !defined(_GNU_SOURCE))) + void explicit_bzero(void *buf, size_t len); + #endif + __END_DECLS +diff --git a/include/bsd/sys/cdefs.h b/include/bsd/sys/cdefs.h +index b4c8f30..d1cc419 100644 +--- a/include/bsd/sys/cdefs.h ++++ b/include/bsd/sys/cdefs.h +@@ -59,6 +59,14 @@ + #endif + + /* ++ * On non-glibc based systems, we cannot unconditionally use the ++ * __GLIBC_PREREQ macro as it gets expanded before evaluation. ++ */ ++#ifndef __GLIBC_PREREQ ++#define __GLIBC_PREREQ(maj, min) 0 ++#endif ++ ++/* + * Some kFreeBSD headers expect those macros to be set for sanity checks. + */ + #ifndef _SYS_CDEFS_H_ +-- +cgit v1.1 + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index c537cdf8bc77..99c3324e0673 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2384,6 +2384,8 @@ with pkgs; flvstreamer = callPackage ../tools/networking/flvstreamer { }; + libbsd = callPackage ../development/libraries/libbsd { }; + libbladeRF = callPackage ../development/libraries/libbladeRF { }; lp_solve = callPackage ../applications/science/math/lp_solve { }; @@ -21527,8 +21529,6 @@ with pkgs; fts = if hostPlatform.isMusl then netbsd.fts else null; - libbsd = netbsd.compat; - inherit (recurseIntoAttrs (callPackages ../os-specific/bsd { })) netbsd;