]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Add getentropy emulation for FreeBSD 102/head
authorJames Clarke <jrtc27@jrtc27.com>
Sat, 2 Nov 2019 18:08:23 +0000 (18:08 +0000)
committerJames Clarke <jrtc27@jrtc27.com>
Sat, 2 Nov 2019 18:08:23 +0000 (18:08 +0000)
Makefile.in
compat/getentropy_freebsd.c [new file with mode: 0644]
configure.ac

index d9d4fe7ad6d1c60d35157f63ee9dc48d5bff224b..9660c49aa14e168a46ee97ec96bba5f8d3beeb1e 100644 (file)
@@ -148,7 +148,7 @@ COMMON_OBJ_ALL_SYMBOLS=@COMMON_OBJ_ALL_SYMBOLS@
 COMPAT_SRC=compat/ctime_r.c compat/fake-rfc2553.c compat/gmtime_r.c \
 compat/inet_aton.c compat/inet_ntop.c compat/inet_pton.c compat/malloc.c \
 compat/memcmp.c compat/memmove.c compat/snprintf.c compat/strlcat.c \
-compat/strlcpy.c compat/strptime.c compat/getentropy_linux.c \
+compat/strlcpy.c compat/strptime.c compat/getentropy_freebsd.c compat/getentropy_linux.c \
 compat/getentropy_osx.c compat/getentropy_solaris.c compat/getentropy_win.c \
 compat/explicit_bzero.c compat/arc4random.c compat/arc4random_uniform.c \
 compat/arc4_lock.c compat/sha512.c compat/reallocarray.c compat/isblank.c \
@@ -1482,6 +1482,7 @@ snprintf.lo snprintf.o: $(srcdir)/compat/snprintf.c config.h
 strlcat.lo strlcat.o: $(srcdir)/compat/strlcat.c config.h
 strlcpy.lo strlcpy.o: $(srcdir)/compat/strlcpy.c config.h
 strptime.lo strptime.o: $(srcdir)/compat/strptime.c config.h
+getentropy_freebsd.lo getentropy_freebsd.o: $(srcdir)/compat/getentropy_freebsd.c config.h
 getentropy_linux.lo getentropy_linux.o: $(srcdir)/compat/getentropy_linux.c config.h \
  
 getentropy_osx.lo getentropy_osx.o: $(srcdir)/compat/getentropy_osx.c config.h
diff --git a/compat/getentropy_freebsd.c b/compat/getentropy_freebsd.c
new file mode 100644 (file)
index 0000000..30cd68e
--- /dev/null
@@ -0,0 +1,62 @@
+/*     $OpenBSD: getentropy_freebsd.c,v 1.3 2016/08/07 03:27:21 tb Exp $       */
+
+/*
+ * Copyright (c) 2014 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * Copyright (c) 2014 Brent Cook <bcook@openbsd.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.
+ *
+ * Emulation of getentropy(2) as documented at:
+ * http://man.openbsd.org/getentropy.2
+ */
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+/*
+ * Derived from lib/libc/gen/arc4random.c from FreeBSD.
+ */
+static size_t
+getentropy_sysctl(u_char *buf, size_t size)
+{
+       int mib[2];
+       size_t len, done;
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_ARND;
+       done = 0;
+
+       do {
+               len = size;
+               if (sysctl(mib, 2, buf, &len, NULL, 0) == -1)
+                       return (done);
+               done += len;
+               buf += len;
+               size -= len;
+       } while (size > 0);
+
+       return (done);
+}
+
+int
+getentropy(void *buf, size_t len)
+{
+       if (len <= 256 && getentropy_sysctl(buf, len) == len)
+               return (0);
+
+       errno = EIO;
+       return (-1);
+}
index c23ba244e54b4278d65eeb36660f8024711d3ba8..d8a1ac95bc16e40e3613bcb84f8029fbde936146 100644 (file)
@@ -1528,6 +1528,9 @@ if test "$USE_NSS" = "no"; then
                                fi
                                AC_SEARCH_LIBS([clock_gettime], [rt])
                        ;;
+                       *freebsd*|*FreeBSD)
+                               AC_LIBOBJ(getentropy_freebsd)
+                       ;;
                        *linux*|Linux|*)
                                AC_LIBOBJ(getentropy_linux)
                                AC_CHECK_FUNCS([SHA512_Update],,[