aboutsummaryrefslogtreecommitdiff
path: root/external/unbound/compat
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-03-18 18:50:21 +0200
committerRiccardo Spagni <ric@spagni.net>2018-03-18 18:50:21 +0200
commit1f6e6001ed37b48788ef071f3297b7e9d67586a5 (patch)
tree7ff391303a4b5643294bc4f91d1c493791f98879 /external/unbound/compat
parentMerge pull request #3426 (diff)
parentUnbound: add git submodule for unbound (diff)
downloadmonero-1f6e6001ed37b48788ef071f3297b7e9d67586a5.tar.xz
Merge pull request #2133
efe70a15 Unbound: add git submodule for unbound (anonimal) 84c5a9ba Unbound: remove unbound from in-tree source (anonimal)
Diffstat (limited to 'external/unbound/compat')
m---------external/unbound0
-rw-r--r--external/unbound/compat/arc4_lock.c67
-rw-r--r--external/unbound/compat/arc4random.c236
-rw-r--r--external/unbound/compat/arc4random_uniform.c57
-rw-r--r--external/unbound/compat/chacha_private.h222
-rw-r--r--external/unbound/compat/ctime_r.c42
-rw-r--r--external/unbound/compat/explicit_bzero.c26
-rw-r--r--external/unbound/compat/fake-rfc2553.c225
-rw-r--r--external/unbound/compat/fake-rfc2553.h174
-rw-r--r--external/unbound/compat/getentropy_linux.c566
-rw-r--r--external/unbound/compat/getentropy_osx.c432
-rw-r--r--external/unbound/compat/getentropy_solaris.c441
-rw-r--r--external/unbound/compat/getentropy_win.c56
-rw-r--r--external/unbound/compat/gmtime_r.c107
-rw-r--r--external/unbound/compat/inet_aton.c182
-rw-r--r--external/unbound/compat/inet_ntop.c218
-rw-r--r--external/unbound/compat/inet_pton.c230
-rw-r--r--external/unbound/compat/isblank.c45
-rw-r--r--external/unbound/compat/malloc.c19
-rw-r--r--external/unbound/compat/memcmp.c25
-rw-r--r--external/unbound/compat/memcmp.h16
-rw-r--r--external/unbound/compat/memmove.c43
-rw-r--r--external/unbound/compat/reallocarray.c42
-rw-r--r--external/unbound/compat/sha512.c477
-rw-r--r--external/unbound/compat/snprintf.c1037
-rw-r--r--external/unbound/compat/strlcat.c73
-rw-r--r--external/unbound/compat/strlcpy.c57
-rw-r--r--external/unbound/compat/strptime.c345
-rw-r--r--external/unbound/compat/strsep.c65
29 files changed, 0 insertions, 5525 deletions
diff --git a/external/unbound b/external/unbound
new file mode 160000
+Subproject 193bdc4ee3fe2b0d17e547e86512528c2614483
diff --git a/external/unbound/compat/arc4_lock.c b/external/unbound/compat/arc4_lock.c
deleted file mode 100644
index 0c45ad01b..000000000
--- a/external/unbound/compat/arc4_lock.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* arc4_lock.c - global lock for arc4random
-*
- * Copyright (c) 2014, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 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.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 COPYRIGHT
- * HOLDER OR CONTRIBUTORS 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.
- */
-#include "config.h"
-#define LOCKRET(func) func
-#include "util/locks.h"
-
-void _ARC4_LOCK(void);
-void _ARC4_UNLOCK(void);
-
-#ifdef THREADS_DISABLED
-void _ARC4_LOCK(void)
-{
-}
-
-void _ARC4_UNLOCK(void)
-{
-}
-#else /* !THREADS_DISABLED */
-
-static lock_quick_type arc4lock;
-static int arc4lockinit = 0;
-
-void _ARC4_LOCK(void)
-{
- if(!arc4lockinit) {
- arc4lockinit = 1;
- lock_quick_init(&arc4lock);
- }
- lock_quick_lock(&arc4lock);
-}
-
-void _ARC4_UNLOCK(void)
-{
- lock_quick_unlock(&arc4lock);
-}
-#endif /* THREADS_DISABLED */
diff --git a/external/unbound/compat/arc4random.c b/external/unbound/compat/arc4random.c
deleted file mode 100644
index a09665c5d..000000000
--- a/external/unbound/compat/arc4random.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* $OpenBSD: arc4random.c,v 1.41 2014/07/12 13:24:54 deraadt Exp $ */
-
-/*
- * Copyright (c) 1996, David Mazieres <dm@uun.org>
- * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
- * Copyright (c) 2013, Markus Friedl <markus@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.
- */
-#include "config.h"
-
-/*
- * ChaCha based random number generator for OpenBSD.
- */
-
-#include <fcntl.h>
-#include <limits.h>
-#include <signal.h>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#ifndef UB_ON_WINDOWS
-#include <sys/mman.h>
-#endif
-
-#define KEYSTREAM_ONLY
-#include "chacha_private.h"
-
-#define arc4_min(a, b) ((a) < (b) ? (a) : (b))
-#ifdef __GNUC__
-#define inline __inline
-#else /* !__GNUC__ */
-#define inline
-#endif /* !__GNUC__ */
-#ifndef MAP_ANON
-#define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#define KEYSZ 32
-#define IVSZ 8
-#define BLOCKSZ 64
-#define RSBUFSZ (16*BLOCKSZ)
-
-/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */
-static struct {
- size_t rs_have; /* valid bytes at end of rs_buf */
- size_t rs_count; /* bytes till reseed */
-} *rs;
-
-/* Preserved in fork children. */
-static struct {
- chacha_ctx rs_chacha; /* chacha context for random keystream */
- u_char rs_buf[RSBUFSZ]; /* keystream blocks */
-} *rsx;
-
-static inline void _rs_rekey(u_char *dat, size_t datlen);
-
-static inline void
-_rs_init(u_char *buf, size_t n)
-{
- if (n < KEYSZ + IVSZ)
- return;
-
- if (rs == NULL) {
-#ifndef UB_ON_WINDOWS
- if ((rs = mmap(NULL, sizeof(*rs), PROT_READ|PROT_WRITE,
- MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
- abort();
-#ifdef MAP_INHERIT_ZERO
- if (minherit(rs, sizeof(*rs), MAP_INHERIT_ZERO) == -1)
- abort();
-#endif
-#else /* WINDOWS */
- rs = malloc(sizeof(*rs));
- if(!rs)
- abort();
-#endif
- }
- if (rsx == NULL) {
-#ifndef UB_ON_WINDOWS
- if ((rsx = mmap(NULL, sizeof(*rsx), PROT_READ|PROT_WRITE,
- MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
- abort();
-#else /* WINDOWS */
- rsx = malloc(sizeof(*rsx));
- if(!rsx)
- abort();
-#endif
- }
-
- chacha_keysetup(&rsx->rs_chacha, buf, KEYSZ * 8, 0);
- chacha_ivsetup(&rsx->rs_chacha, buf + KEYSZ);
-}
-
-static void
-_rs_stir(void)
-{
- u_char rnd[KEYSZ + IVSZ];
-
- if (getentropy(rnd, sizeof rnd) == -1) {
-#ifdef SIGKILL
- raise(SIGKILL);
-#else
- exit(9); /* windows */
-#endif
- }
-
- if (!rs)
- _rs_init(rnd, sizeof(rnd));
- else
- _rs_rekey(rnd, sizeof(rnd));
- explicit_bzero(rnd, sizeof(rnd)); /* discard source seed */
-
- /* invalidate rs_buf */
- rs->rs_have = 0;
- memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
-
- rs->rs_count = 1600000;
-}
-
-static inline void
-_rs_stir_if_needed(size_t len)
-{
-#ifndef MAP_INHERIT_ZERO
- static pid_t _rs_pid = 0;
- pid_t pid = getpid();
-
- /* If a system lacks MAP_INHERIT_ZERO, resort to getpid() */
- if (_rs_pid == 0 || _rs_pid != pid) {
- _rs_pid = pid;
- if (rs)
- rs->rs_count = 0;
- }
-#endif
- if (!rs || rs->rs_count <= len)
- _rs_stir();
- if (rs->rs_count <= len)
- rs->rs_count = 0;
- else
- rs->rs_count -= len;
-}
-
-static inline void
-_rs_rekey(u_char *dat, size_t datlen)
-{
-#ifndef KEYSTREAM_ONLY
- memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
-#endif
- /* fill rs_buf with the keystream */
- chacha_encrypt_bytes(&rsx->rs_chacha, rsx->rs_buf,
- rsx->rs_buf, sizeof(rsx->rs_buf));
- /* mix in optional user provided data */
- if (dat) {
- size_t i, m;
-
- m = arc4_min(datlen, KEYSZ + IVSZ);
- for (i = 0; i < m; i++)
- rsx->rs_buf[i] ^= dat[i];
- }
- /* immediately reinit for backtracking resistance */
- _rs_init(rsx->rs_buf, KEYSZ + IVSZ);
- memset(rsx->rs_buf, 0, KEYSZ + IVSZ);
- rs->rs_have = sizeof(rsx->rs_buf) - KEYSZ - IVSZ;
-}
-
-static inline void
-_rs_random_buf(void *_buf, size_t n)
-{
- u_char *buf = (u_char *)_buf;
- u_char *keystream;
- size_t m;
-
- _rs_stir_if_needed(n);
- while (n > 0) {
- if (rs->rs_have > 0) {
- m = arc4_min(n, rs->rs_have);
- keystream = rsx->rs_buf + sizeof(rsx->rs_buf)
- - rs->rs_have;
- memcpy(buf, keystream, m);
- memset(keystream, 0, m);
- buf += m;
- n -= m;
- rs->rs_have -= m;
- }
- if (rs->rs_have == 0)
- _rs_rekey(NULL, 0);
- }
-}
-
-static inline void
-_rs_random_u32(uint32_t *val)
-{
- u_char *keystream;
- _rs_stir_if_needed(sizeof(*val));
- if (rs->rs_have < sizeof(*val))
- _rs_rekey(NULL, 0);
- keystream = rsx->rs_buf + sizeof(rsx->rs_buf) - rs->rs_have;
- memcpy(val, keystream, sizeof(*val));
- memset(keystream, 0, sizeof(*val));
- rs->rs_have -= sizeof(*val);
-}
-
-uint32_t
-arc4random(void)
-{
- uint32_t val;
-
- _ARC4_LOCK();
- _rs_random_u32(&val);
- _ARC4_UNLOCK();
- return val;
-}
-
-void
-arc4random_buf(void *buf, size_t n)
-{
- _ARC4_LOCK();
- _rs_random_buf(buf, n);
- _ARC4_UNLOCK();
-}
diff --git a/external/unbound/compat/arc4random_uniform.c b/external/unbound/compat/arc4random_uniform.c
deleted file mode 100644
index 154260ebd..000000000
--- a/external/unbound/compat/arc4random_uniform.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* $OpenBSD: arc4random_uniform.c,v 1.1 2014/07/12 13:24:54 deraadt Exp $ */
-
-/*
- * Copyright (c) 2008, Damien Miller <djm@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.
- */
-
-#include "config.h"
-#include <sys/types.h>
-#include <stdlib.h>
-
-/*
- * Calculate a uniformly distributed random number less than upper_bound
- * avoiding "modulo bias".
- *
- * Uniformity is achieved by generating new random numbers until the one
- * returned is outside the range [0, 2**32 % upper_bound). This
- * guarantees the selected random number will be inside
- * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
- * after reduction modulo upper_bound.
- */
-uint32_t
-arc4random_uniform(uint32_t upper_bound)
-{
- uint32_t r, min;
-
- if (upper_bound < 2)
- return 0;
-
- /* 2**32 % x == (2**32 - x) % x */
- min = -upper_bound % upper_bound;
-
- /*
- * This could theoretically loop forever but each retry has
- * p > 0.5 (worst case, usually far better) of selecting a
- * number inside the range we need, so it should rarely need
- * to re-roll.
- */
- for (;;) {
- r = arc4random();
- if (r >= min)
- break;
- }
-
- return r % upper_bound;
-}
diff --git a/external/unbound/compat/chacha_private.h b/external/unbound/compat/chacha_private.h
deleted file mode 100644
index 192258c7f..000000000
--- a/external/unbound/compat/chacha_private.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
-chacha-merged.c version 20080118
-D. J. Bernstein
-Public domain.
-*/
-
-/* $OpenBSD: chacha_private.h,v 1.2 2013/10/04 07:02:27 djm Exp $ */
-
-typedef unsigned char u8;
-typedef unsigned int u32;
-
-typedef struct
-{
- u32 input[16]; /* could be compressed */
-} chacha_ctx;
-
-#define U8C(v) (v##U)
-#define U32C(v) (v##U)
-
-#define U8V(v) ((u8)(v) & U8C(0xFF))
-#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
-
-#define ROTL32(v, n) \
- (U32V((v) << (n)) | ((v) >> (32 - (n))))
-
-#define U8TO32_LITTLE(p) \
- (((u32)((p)[0]) ) | \
- ((u32)((p)[1]) << 8) | \
- ((u32)((p)[2]) << 16) | \
- ((u32)((p)[3]) << 24))
-
-#define U32TO8_LITTLE(p, v) \
- do { \
- (p)[0] = U8V((v) ); \
- (p)[1] = U8V((v) >> 8); \
- (p)[2] = U8V((v) >> 16); \
- (p)[3] = U8V((v) >> 24); \
- } while (0)
-
-#define ROTATE(v,c) (ROTL32(v,c))
-#define XOR(v,w) ((v) ^ (w))
-#define PLUS(v,w) (U32V((v) + (w)))
-#define PLUSONE(v) (PLUS((v),1))
-
-#define QUARTERROUND(a,b,c,d) \
- a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \
- c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \
- a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
- c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
-
-static const char sigma[16] = "expand 32-byte k";
-static const char tau[16] = "expand 16-byte k";
-
-static void
-chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits,u32 ATTR_UNUSED(ivbits))
-{
- const char *constants;
-
- x->input[4] = U8TO32_LITTLE(k + 0);
- x->input[5] = U8TO32_LITTLE(k + 4);
- x->input[6] = U8TO32_LITTLE(k + 8);
- x->input[7] = U8TO32_LITTLE(k + 12);
- if (kbits == 256) { /* recommended */
- k += 16;
- constants = sigma;
- } else { /* kbits == 128 */
- constants = tau;
- }
- x->input[8] = U8TO32_LITTLE(k + 0);
- x->input[9] = U8TO32_LITTLE(k + 4);
- x->input[10] = U8TO32_LITTLE(k + 8);
- x->input[11] = U8TO32_LITTLE(k + 12);
- x->input[0] = U8TO32_LITTLE(constants + 0);
- x->input[1] = U8TO32_LITTLE(constants + 4);
- x->input[2] = U8TO32_LITTLE(constants + 8);
- x->input[3] = U8TO32_LITTLE(constants + 12);
-}
-
-static void
-chacha_ivsetup(chacha_ctx *x,const u8 *iv)
-{
- x->input[12] = 0;
- x->input[13] = 0;
- x->input[14] = U8TO32_LITTLE(iv + 0);
- x->input[15] = U8TO32_LITTLE(iv + 4);
-}
-
-static void
-chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes)
-{
- u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
- u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
- u8 *ctarget = NULL;
- u8 tmp[64];
- u_int i;
-
- if (!bytes) return;
-
- j0 = x->input[0];
- j1 = x->input[1];
- j2 = x->input[2];
- j3 = x->input[3];
- j4 = x->input[4];
- j5 = x->input[5];
- j6 = x->input[6];
- j7 = x->input[7];
- j8 = x->input[8];
- j9 = x->input[9];
- j10 = x->input[10];
- j11 = x->input[11];
- j12 = x->input[12];
- j13 = x->input[13];
- j14 = x->input[14];
- j15 = x->input[15];
-
- for (;;) {
- if (bytes < 64) {
- for (i = 0;i < bytes;++i) tmp[i] = m[i];
- m = tmp;
- ctarget = c;
- c = tmp;
- }
- x0 = j0;
- x1 = j1;
- x2 = j2;
- x3 = j3;
- x4 = j4;
- x5 = j5;
- x6 = j6;
- x7 = j7;
- x8 = j8;
- x9 = j9;
- x10 = j10;
- x11 = j11;
- x12 = j12;
- x13 = j13;
- x14 = j14;
- x15 = j15;
- for (i = 20;i > 0;i -= 2) {
- QUARTERROUND( x0, x4, x8,x12)
- QUARTERROUND( x1, x5, x9,x13)
- QUARTERROUND( x2, x6,x10,x14)
- QUARTERROUND( x3, x7,x11,x15)
- QUARTERROUND( x0, x5,x10,x15)
- QUARTERROUND( x1, x6,x11,x12)
- QUARTERROUND( x2, x7, x8,x13)
- QUARTERROUND( x3, x4, x9,x14)
- }
- x0 = PLUS(x0,j0);
- x1 = PLUS(x1,j1);
- x2 = PLUS(x2,j2);
- x3 = PLUS(x3,j3);
- x4 = PLUS(x4,j4);
- x5 = PLUS(x5,j5);
- x6 = PLUS(x6,j6);
- x7 = PLUS(x7,j7);
- x8 = PLUS(x8,j8);
- x9 = PLUS(x9,j9);
- x10 = PLUS(x10,j10);
- x11 = PLUS(x11,j11);
- x12 = PLUS(x12,j12);
- x13 = PLUS(x13,j13);
- x14 = PLUS(x14,j14);
- x15 = PLUS(x15,j15);
-
-#ifndef KEYSTREAM_ONLY
- x0 = XOR(x0,U8TO32_LITTLE(m + 0));
- x1 = XOR(x1,U8TO32_LITTLE(m + 4));
- x2 = XOR(x2,U8TO32_LITTLE(m + 8));
- x3 = XOR(x3,U8TO32_LITTLE(m + 12));
- x4 = XOR(x4,U8TO32_LITTLE(m + 16));
- x5 = XOR(x5,U8TO32_LITTLE(m + 20));
- x6 = XOR(x6,U8TO32_LITTLE(m + 24));
- x7 = XOR(x7,U8TO32_LITTLE(m + 28));
- x8 = XOR(x8,U8TO32_LITTLE(m + 32));
- x9 = XOR(x9,U8TO32_LITTLE(m + 36));
- x10 = XOR(x10,U8TO32_LITTLE(m + 40));
- x11 = XOR(x11,U8TO32_LITTLE(m + 44));
- x12 = XOR(x12,U8TO32_LITTLE(m + 48));
- x13 = XOR(x13,U8TO32_LITTLE(m + 52));
- x14 = XOR(x14,U8TO32_LITTLE(m + 56));
- x15 = XOR(x15,U8TO32_LITTLE(m + 60));
-#endif
-
- j12 = PLUSONE(j12);
- if (!j12) {
- j13 = PLUSONE(j13);
- /* stopping at 2^70 bytes per nonce is user's responsibility */
- }
-
- U32TO8_LITTLE(c + 0,x0);
- U32TO8_LITTLE(c + 4,x1);
- U32TO8_LITTLE(c + 8,x2);
- U32TO8_LITTLE(c + 12,x3);
- U32TO8_LITTLE(c + 16,x4);
- U32TO8_LITTLE(c + 20,x5);
- U32TO8_LITTLE(c + 24,x6);
- U32TO8_LITTLE(c + 28,x7);
- U32TO8_LITTLE(c + 32,x8);
- U32TO8_LITTLE(c + 36,x9);
- U32TO8_LITTLE(c + 40,x10);
- U32TO8_LITTLE(c + 44,x11);
- U32TO8_LITTLE(c + 48,x12);
- U32TO8_LITTLE(c + 52,x13);
- U32TO8_LITTLE(c + 56,x14);
- U32TO8_LITTLE(c + 60,x15);
-
- if (bytes <= 64) {
- if (bytes < 64) {
- for (i = 0;i < bytes;++i) ctarget[i] = c[i];
- }
- x->input[12] = j12;
- x->input[13] = j13;
- return;
- }
- bytes -= 64;
- c += 64;
-#ifndef KEYSTREAM_ONLY
- m += 64;
-#endif
- }
-}
diff --git a/external/unbound/compat/ctime_r.c b/external/unbound/compat/ctime_r.c
deleted file mode 100644
index 87c2609a8..000000000
--- a/external/unbound/compat/ctime_r.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* taken from ldns 1.6.1 */
-#include "config.h"
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#include "util/locks.h"
-
-/** the lock for ctime buffer */
-static lock_basic_type ctime_lock;
-/** has it been inited */
-static int ctime_r_init = 0;
-
-/** cleanup ctime_r on exit */
-static void
-ctime_r_cleanup(void)
-{
- if(ctime_r_init) {
- ctime_r_init = 0;
- lock_basic_destroy(&ctime_lock);
- }
-}
-
-char *ctime_r(const time_t *timep, char *buf)
-{
- char* result;
- if(!ctime_r_init) {
- /* still small race where this init can be done twice,
- * which is mostly harmless */
- ctime_r_init = 1;
- lock_basic_init(&ctime_lock);
- atexit(&ctime_r_cleanup);
- }
- lock_basic_lock(&ctime_lock);
- result = ctime(timep);
- if(buf && result) {
- if(strlen(result) > 10 && result[7]==' ' && result[8]=='0')
- result[8]=' '; /* fix error in windows ctime */
- strcpy(buf, result);
- }
- lock_basic_unlock(&ctime_lock);
- return result;
-}
diff --git a/external/unbound/compat/explicit_bzero.c b/external/unbound/compat/explicit_bzero.c
deleted file mode 100644
index 5f1c427c2..000000000
--- a/external/unbound/compat/explicit_bzero.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $OpenBSD: explicit_bzero.c,v 1.3 2014/06/21 02:34:26 matthew Exp $ */
-/*
- * Public domain.
- * Written by Matthew Dempsky.
- */
-#include "config.h"
-#include <string.h>
-
-#ifdef HAVE_ATTR_WEAK
-__attribute__((weak)) void
-#else
-void
-#endif
-__explicit_bzero_hook(void *ATTR_UNUSED(buf), size_t ATTR_UNUSED(len))
-{
-}
-
-void
-explicit_bzero(void *buf, size_t len)
-{
-#ifdef UB_ON_WINDOWS
- SecureZeroMemory(buf, len);
-#endif
- memset(buf, 0, len);
- __explicit_bzero_hook(buf, len);
-}
diff --git a/external/unbound/compat/fake-rfc2553.c b/external/unbound/compat/fake-rfc2553.c
deleted file mode 100644
index 0f0f34f1f..000000000
--- a/external/unbound/compat/fake-rfc2553.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* From openssh 4.3p2 filename openbsd-compat/fake-rfc2553.h */
-/*
- * Copyright (C) 2000-2003 Damien Miller. All rights reserved.
- * Copyright (C) 1999 WIDE Project. 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``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 PROJECT OR CONTRIBUTORS 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.
- */
-
-/*
- * Pseudo-implementation of RFC2553 name / address resolution functions
- *
- * But these functions are not implemented correctly. The minimum subset
- * is implemented for ssh use only. For example, this routine assumes
- * that ai_family is AF_INET. Don't use it for another purpose.
- */
-
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "compat/fake-rfc2553.h"
-
-#ifndef HAVE_GETNAMEINFO
-int getnameinfo(const struct sockaddr *sa, size_t ATTR_UNUSED(salen), char *host,
- size_t hostlen, char *serv, size_t servlen, int flags)
-{
- struct sockaddr_in *sin = (struct sockaddr_in *)sa;
- struct hostent *hp;
- char tmpserv[16];
-
- if (serv != NULL) {
- snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
- if (strlcpy(serv, tmpserv, servlen) >= servlen)
- return (EAI_MEMORY);
- }
-
- if (host != NULL) {
- if (flags & NI_NUMERICHOST) {
- if (strlcpy(host, inet_ntoa(sin->sin_addr),
- hostlen) >= hostlen)
- return (EAI_MEMORY);
- else
- return (0);
- } else {
- hp = gethostbyaddr((char *)&sin->sin_addr,
- sizeof(struct in_addr), AF_INET);
- if (hp == NULL)
- return (EAI_NODATA);
-
- if (strlcpy(host, hp->h_name, hostlen) >= hostlen)
- return (EAI_MEMORY);
- else
- return (0);
- }
- }
- return (0);
-}
-#endif /* !HAVE_GETNAMEINFO */
-
-#ifndef HAVE_GAI_STRERROR
-#ifdef HAVE_CONST_GAI_STRERROR_PROTO
-const char *
-#else
-char *
-#endif
-gai_strerror(int err)
-{
- switch (err) {
- case EAI_NODATA:
- return ("no address associated with name");
- case EAI_MEMORY:
- return ("memory allocation failure.");
- case EAI_NONAME:
- return ("nodename nor servname provided, or not known");
- default:
- return ("unknown/invalid error.");
- }
-}
-#endif /* !HAVE_GAI_STRERROR */
-
-#ifndef HAVE_FREEADDRINFO
-void
-freeaddrinfo(struct addrinfo *ai)
-{
- struct addrinfo *next;
-
- for(; ai != NULL;) {
- next = ai->ai_next;
- free(ai);
- ai = next;
- }
-}
-#endif /* !HAVE_FREEADDRINFO */
-
-#ifndef HAVE_GETADDRINFO
-static struct
-addrinfo *malloc_ai(int port, u_long addr, const struct addrinfo *hints)
-{
- struct addrinfo *ai;
-
- ai = calloc(1, sizeof(*ai) + sizeof(struct sockaddr_in));
- if (ai == NULL)
- return (NULL);
-
- ai->ai_addr = (struct sockaddr *)(ai + 1);
- /* XXX -- ssh doesn't use sa_len */
- ai->ai_addrlen = sizeof(struct sockaddr_in);
- ai->ai_addr->sa_family = ai->ai_family = AF_INET;
-
- ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
- ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
-
- /* XXX: the following is not generally correct, but does what we want */
- if (hints->ai_socktype)
- ai->ai_socktype = hints->ai_socktype;
- else
- ai->ai_socktype = SOCK_STREAM;
-
- if (hints->ai_protocol)
- ai->ai_protocol = hints->ai_protocol;
-
- return (ai);
-}
-
-int
-getaddrinfo(const char *hostname, const char *servname,
- const struct addrinfo *hints, struct addrinfo **res)
-{
- struct hostent *hp;
- struct servent *sp;
- struct in_addr in;
- int i;
- long int port;
- u_long addr;
-
- port = 0;
- if (servname != NULL) {
- char *cp;
-
- port = strtol(servname, &cp, 10);
- if (port > 0 && port <= 65535 && *cp == '\0')
- port = htons(port);
- else if ((sp = getservbyname(servname, NULL)) != NULL)
- port = sp->s_port;
- else
- port = 0;
- }
-
- if (hints && hints->ai_flags & AI_PASSIVE) {
- addr = htonl(0x00000000);
- if (hostname && inet_aton(hostname, &in) != 0)
- addr = in.s_addr;
- *res = malloc_ai(port, addr, hints);
- if (*res == NULL)
- return (EAI_MEMORY);
- return (0);
- }
-
- if (!hostname) {
- *res = malloc_ai(port, htonl(0x7f000001), hints);
- if (*res == NULL)
- return (EAI_MEMORY);
- return (0);
- }
-
- if (inet_aton(hostname, &in)) {
- *res = malloc_ai(port, in.s_addr, hints);
- if (*res == NULL)
- return (EAI_MEMORY);
- return (0);
- }
-
- /* Don't try DNS if AI_NUMERICHOST is set */
- if (hints && hints->ai_flags & AI_NUMERICHOST)
- return (EAI_NONAME);
-
- hp = gethostbyname(hostname);
- if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
- struct addrinfo *cur, *prev;
-
- cur = prev = *res = NULL;
- for (i = 0; hp->h_addr_list[i]; i++) {
- struct in_addr *in = (struct in_addr *)hp->h_addr_list[i];
-
- cur = malloc_ai(port, in->s_addr, hints);
- if (cur == NULL) {
- if (*res != NULL)
- freeaddrinfo(*res);
- return (EAI_MEMORY);
- }
- if (prev)
- prev->ai_next = cur;
- else
- *res = cur;
-
- prev = cur;
- }
- return (0);
- }
-
- return (EAI_NODATA);
-}
-#endif /* !HAVE_GETADDRINFO */
diff --git a/external/unbound/compat/fake-rfc2553.h b/external/unbound/compat/fake-rfc2553.h
deleted file mode 100644
index 466c0e663..000000000
--- a/external/unbound/compat/fake-rfc2553.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* From openssh 4.3p2 filename openbsd-compat/fake-rfc2553.h */
-/*
- * Copyright (C) 2000-2003 Damien Miller. All rights reserved.
- * Copyright (C) 1999 WIDE Project. 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``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 PROJECT OR CONTRIBUTORS 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.
- */
-
-/*
- * Pseudo-implementation of RFC2553 name / address resolution functions
- *
- * But these functions are not implemented correctly. The minimum subset
- * is implemented for ssh use only. For example, this routine assumes
- * that ai_family is AF_INET. Don't use it for another purpose.
- */
-
-#ifndef _FAKE_RFC2553_H
-#define _FAKE_RFC2553_H
-
-#include <config.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <limits.h>
-
-/*
- * First, socket and INET6 related definitions
- */
-#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
-# define _SS_MAXSIZE 128 /* Implementation specific max size */
-# define _SS_PADSIZE (_SS_MAXSIZE - sizeof (struct sockaddr))
-struct sockaddr_storage {
- struct sockaddr ss_sa;
- char __ss_pad2[_SS_PADSIZE];
-};
-# define ss_family ss_sa.sa_family
-#endif /* !HAVE_STRUCT_SOCKADDR_STORAGE */
-
-#ifndef IN6_IS_ADDR_LOOPBACK
-# define IN6_IS_ADDR_LOOPBACK(a) \
- (((uint32_t *)(a))[0] == 0 && ((uint32_t *)(a))[1] == 0 && \
- ((uint32_t *)(a))[2] == 0 && ((uint32_t *)(a))[3] == htonl(1))
-#endif /* !IN6_IS_ADDR_LOOPBACK */
-
-#ifndef HAVE_STRUCT_IN6_ADDR
-struct in6_addr {
- uint8_t s6_addr[16];
-};
-#endif /* !HAVE_STRUCT_IN6_ADDR */
-
-#ifndef HAVE_STRUCT_SOCKADDR_IN6
-struct sockaddr_in6 {
- unsigned short sin6_family;
- uint16_t sin6_port;
- uint32_t sin6_flowinfo;
- struct in6_addr sin6_addr;
-};
-#endif /* !HAVE_STRUCT_SOCKADDR_IN6 */
-
-#ifndef AF_INET6
-/* Define it to something that should never appear */
-#define AF_INET6 AF_MAX
-#endif
-
-/*
- * Next, RFC2553 name / address resolution API
- */
-
-#ifndef NI_NUMERICHOST
-# define NI_NUMERICHOST (1)
-#endif
-#ifndef NI_NAMEREQD
-# define NI_NAMEREQD (1<<1)
-#endif
-#ifndef NI_NUMERICSERV
-# define NI_NUMERICSERV (1<<2)
-#endif
-
-#ifndef AI_PASSIVE
-# define AI_PASSIVE (1)
-#endif
-#ifndef AI_CANONNAME
-# define AI_CANONNAME (1<<1)
-#endif
-#ifndef AI_NUMERICHOST
-# define AI_NUMERICHOST (1<<2)
-#endif
-
-#ifndef NI_MAXSERV
-# define NI_MAXSERV 32
-#endif /* !NI_MAXSERV */
-#ifndef NI_MAXHOST
-# define NI_MAXHOST 1025
-#endif /* !NI_MAXHOST */
-
-#ifndef INT_MAX
-#define INT_MAX 0xffffffff
-#endif
-
-#ifndef EAI_NODATA
-# define EAI_NODATA (INT_MAX - 1)
-#endif
-#ifndef EAI_MEMORY
-# define EAI_MEMORY (INT_MAX - 2)
-#endif
-#ifndef EAI_NONAME
-# define EAI_NONAME (INT_MAX - 3)
-#endif
-#ifndef EAI_SYSTEM
-# define EAI_SYSTEM (INT_MAX - 4)
-#endif
-
-#ifndef HAVE_STRUCT_ADDRINFO
-struct addrinfo {
- int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
- int ai_family; /* PF_xxx */
- int ai_socktype; /* SOCK_xxx */
- int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
- size_t ai_addrlen; /* length of ai_addr */
- char *ai_canonname; /* canonical name for hostname */
- struct sockaddr *ai_addr; /* binary address */
- struct addrinfo *ai_next; /* next structure in linked list */
-};
-#endif /* !HAVE_STRUCT_ADDRINFO */
-
-#ifndef HAVE_GETADDRINFO
-#ifdef getaddrinfo
-# undef getaddrinfo
-#endif
-#define getaddrinfo(a,b,c,d) (getaddrinfo_unbound(a,b,c,d))
-int getaddrinfo(const char *, const char *,
- const struct addrinfo *, struct addrinfo **);
-#endif /* !HAVE_GETADDRINFO */
-
-#if !defined(HAVE_GAI_STRERROR) && !defined(HAVE_CONST_GAI_STRERROR_PROTO)
-#define gai_strerror(a) (gai_strerror_unbound(a))
-char *gai_strerror(int);
-#endif /* !HAVE_GAI_STRERROR */
-
-#ifndef HAVE_FREEADDRINFO
-#define freeaddrinfo(a) (freeaddrinfo_unbound(a))
-void freeaddrinfo(struct addrinfo *);
-#endif /* !HAVE_FREEADDRINFO */
-
-#ifndef HAVE_GETNAMEINFO
-#define getnameinfo(a,b,c,d,e,f,g) (getnameinfo_unbound(a,b,c,d,e,f,g))
-int getnameinfo(const struct sockaddr *, size_t, char *, size_t,
- char *, size_t, int);
-#endif /* !HAVE_GETNAMEINFO */
-
-#endif /* !_FAKE_RFC2553_H */
-
diff --git a/external/unbound/compat/getentropy_linux.c b/external/unbound/compat/getentropy_linux.c
deleted file mode 100644
index cae18e03b..000000000
--- a/external/unbound/compat/getentropy_linux.c
+++ /dev/null
@@ -1,566 +0,0 @@
-/* $OpenBSD: getentropy_linux.c,v 1.20 2014/07/12 15:43:49 beck Exp $ */
-
-/*
- * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
- * Copyright (c) 2014 Bob Beck <beck@obtuse.com>
- *
- * 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.
- */
-#include "config.h"
-
-/*
-#define _POSIX_C_SOURCE 199309L
-#define _GNU_SOURCE 1
-*/
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/syscall.h>
-#ifdef HAVE_SYS_SYSCTL_H
-#include <sys/sysctl.h>
-#endif
-#ifdef __ANDROID__
-#include <sys/vfs.h>
-#define statvfs statfs
-#define fstatvfs fstatfs
-#else
-#include <sys/statvfs.h>
-#endif
-#include <sys/socket.h>
-#include <sys/mount.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <time.h>
-
-#if defined(HAVE_SSL)
-#include <openssl/sha.h>
-#elif defined(HAVE_NETTLE)
-#include <nettle/sha.h>
-#endif
-
-#include <linux/types.h>
-#include <linux/random.h>
-#include <linux/sysctl.h>
-#ifdef HAVE_GETAUXVAL
-#include <sys/auxv.h>
-#endif
-#include <sys/vfs.h>
-#ifndef MAP_ANON
-#define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#define REPEAT 5
-#define min(a, b) (((a) < (b)) ? (a) : (b))
-
-#define HX(a, b) \
- do { \
- if ((a)) \
- HD(errno); \
- else \
- HD(b); \
- } while (0)
-
-#if defined(HAVE_SSL)
-#define CRYPTO_SHA512_CTX SHA512_CTX
-#define CRYPTO_SHA512_INIT(x) SHA512_Init(x)
-#define CRYPTO_SHA512_FINAL(r, c) SHA512_Final(r, c)
-#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
-#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
-#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
-#elif defined(HAVE_NETTLE)
-#define CRYPTO_SHA512_CTX struct sha512_ctx
-#define CRYPTO_SHA512_INIT(x) sha512_init(x)
-#define CRYPTO_SHA512_FINAL(r, c) sha512_digest(c, SHA512_DIGEST_SIZE, r)
-#define HR(x, l) (sha512_update(&ctx, (l), (uint8_t *)(x)))
-#define HD(x) (sha512_update(&ctx, sizeof (x), (uint8_t *)&(x)))
-#define HF(x) (sha512_update(&ctx, sizeof (void*), (uint8_t *)&(x)))
-#endif
-
-int getentropy(void *buf, size_t len);
-
-#ifdef CAN_REFERENCE_MAIN
-extern int main(int, char *argv[]);
-#endif
-static int gotdata(char *buf, size_t len);
-#if defined(SYS_getrandom) && defined(__NR_getrandom)
-static int getentropy_getrandom(void *buf, size_t len);
-#endif
-static int getentropy_urandom(void *buf, size_t len);
-#ifdef SYS__sysctl
-static int getentropy_sysctl(void *buf, size_t len);
-#endif
-static int getentropy_fallback(void *buf, size_t len);
-
-int
-getentropy(void *buf, size_t len)
-{
- int ret = -1;
-
- if (len > 256) {
- errno = EIO;
- return -1;
- }
-
-#if defined(SYS_getrandom) && defined(__NR_getrandom)
- /*
- * Try descriptor-less getrandom()
- */
- ret = getentropy_getrandom(buf, len);
- if (ret != -1)
- return (ret);
- if (errno != ENOSYS)
- return (-1);
-#endif
-
- /*
- * Try to get entropy with /dev/urandom
- *
- * This can fail if the process is inside a chroot or if file
- * descriptors are exhausted.
- */
- ret = getentropy_urandom(buf, len);
- if (ret != -1)
- return (ret);
-
-#ifdef SYS__sysctl
- /*
- * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID.
- * sysctl is a failsafe API, so it guarantees a result. This
- * should work inside a chroot, or when file descriptors are
- * exhausted.
- *
- * However this can fail if the Linux kernel removes support
- * for sysctl. Starting in 2007, there have been efforts to
- * deprecate the sysctl API/ABI, and push callers towards use
- * of the chroot-unavailable fd-using /proc mechanism --
- * essentially the same problems as /dev/urandom.
- *
- * Numerous setbacks have been encountered in their deprecation
- * schedule, so as of June 2014 the kernel ABI still exists on
- * most Linux architectures. The sysctl() stub in libc is missing
- * on some systems. There are also reports that some kernels
- * spew messages to the console.
- */
- ret = getentropy_sysctl(buf, len);
- if (ret != -1)
- return (ret);
-#endif /* SYS__sysctl */
-
- /*
- * Entropy collection via /dev/urandom and sysctl have failed.
- *
- * No other API exists for collecting entropy. See the large
- * comment block above.
- *
- * We have very few options:
- * - Even syslog_r is unsafe to call at this low level, so
- * there is no way to alert the user or program.
- * - Cannot call abort() because some systems have unsafe
- * corefiles.
- * - Could raise(SIGKILL) resulting in silent program termination.
- * - Return EIO, to hint that arc4random's stir function
- * should raise(SIGKILL)
- * - Do the best under the circumstances....
- *
- * This code path exists to bring light to the issue that Linux
- * does not provide a failsafe API for entropy collection.
- *
- * We hope this demonstrates that Linux should either retain their
- * sysctl ABI, or consider providing a new failsafe API which
- * works in a chroot or when file descriptors are exhausted.
- */
-#undef FAIL_INSTEAD_OF_TRYING_FALLBACK
-#ifdef FAIL_INSTEAD_OF_TRYING_FALLBACK
- raise(SIGKILL);
-#endif
- ret = getentropy_fallback(buf, len);
- if (ret != -1)
- return (ret);
-
- errno = EIO;
- return (ret);
-}
-
-/*
- * Basic sanity checking; wish we could do better.
- */
-static int
-gotdata(char *buf, size_t len)
-{
- char any_set = 0;
- size_t i;
-
- for (i = 0; i < len; ++i)
- any_set |= buf[i];
- if (any_set == 0)
- return -1;
- return 0;
-}
-
-#if defined(SYS_getrandom) && defined(__NR_getrandom)
-static int
-getentropy_getrandom(void *buf, size_t len)
-{
- int pre_errno = errno;
- int ret;
- if (len > 256)
- return (-1);
- do {
- ret = syscall(SYS_getrandom, buf, len, 0);
- } while (ret == -1 && errno == EINTR);
-
- if (ret != (int)len)
- return (-1);
- errno = pre_errno;
- return (0);
-}
-#endif
-
-static int
-getentropy_urandom(void *buf, size_t len)
-{
- struct stat st;
- size_t i;
- int fd, cnt, flags;
- int save_errno = errno;
-
-start:
-
- flags = O_RDONLY;
-#ifdef O_NOFOLLOW
- flags |= O_NOFOLLOW;
-#endif
-#ifdef O_CLOEXEC
- flags |= O_CLOEXEC;
-#endif
- fd = open("/dev/urandom", flags, 0);
- if (fd == -1) {
- if (errno == EINTR)
- goto start;
- goto nodevrandom;
- }
-#ifndef O_CLOEXEC
- fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-#endif
-
- /* Lightly verify that the device node looks sane */
- if (fstat(fd, &st) == -1 || !S_ISCHR(st.st_mode)) {
- close(fd);
- goto nodevrandom;
- }
- if (ioctl(fd, RNDGETENTCNT, &cnt) == -1) {
- close(fd);
- goto nodevrandom;
- }
- for (i = 0; i < len; ) {
- size_t wanted = len - i;
- ssize_t ret = read(fd, (char*)buf + i, wanted);
-
- if (ret == -1) {
- if (errno == EAGAIN || errno == EINTR)
- continue;
- close(fd);
- goto nodevrandom;
- }
- i += ret;
- }
- close(fd);
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return 0; /* satisfied */
- }
-nodevrandom:
- errno = EIO;
- return -1;
-}
-
-#ifdef SYS__sysctl
-static int
-getentropy_sysctl(void *buf, size_t len)
-{
- static int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };
- size_t i;
- int save_errno = errno;
-
- for (i = 0; i < len; ) {
- size_t chunk = min(len - i, 16);
-
- /* SYS__sysctl because some systems already removed sysctl() */
- struct __sysctl_args args = {
- .name = mib,
- .nlen = 3,
- .oldval = (char *)buf + i,
- .oldlenp = &chunk,
- };
- if (syscall(SYS__sysctl, &args) != 0)
- goto sysctlfailed;
- i += chunk;
- }
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return (0); /* satisfied */
- }
-sysctlfailed:
- errno = EIO;
- return -1;
-}
-#endif /* SYS__sysctl */
-
-static int cl[] = {
- CLOCK_REALTIME,
-#ifdef CLOCK_MONOTONIC
- CLOCK_MONOTONIC,
-#endif
-#ifdef CLOCK_MONOTONIC_RAW
- CLOCK_MONOTONIC_RAW,
-#endif
-#ifdef CLOCK_TAI
- CLOCK_TAI,
-#endif
-#ifdef CLOCK_VIRTUAL
- CLOCK_VIRTUAL,
-#endif
-#ifdef CLOCK_UPTIME
- CLOCK_UPTIME,
-#endif
-#ifdef CLOCK_PROCESS_CPUTIME_ID
- CLOCK_PROCESS_CPUTIME_ID,
-#endif
-#ifdef CLOCK_THREAD_CPUTIME_ID
- CLOCK_THREAD_CPUTIME_ID,
-#endif
-};
-
-static int
-getentropy_fallback(void *buf, size_t len)
-{
- uint8_t results[SHA512_DIGEST_LENGTH];
- int save_errno = errno, e, pgs = getpagesize(), faster = 0, repeat;
- static int cnt;
- struct timespec ts;
- struct timeval tv;
- struct rusage ru;
- sigset_t sigset;
- struct stat st;
- CRYPTO_SHA512_CTX ctx;
- static pid_t lastpid;
- pid_t pid;
- size_t i, ii, m;
- char *p;
-
- pid = getpid();
- if (lastpid == pid) {
- faster = 1;
- repeat = 2;
- } else {
- faster = 0;
- lastpid = pid;
- repeat = REPEAT;
- }
- for (i = 0; i < len; ) {
- int j;
- CRYPTO_SHA512_INIT(&ctx);
- for (j = 0; j < repeat; j++) {
- HX((e = gettimeofday(&tv, NULL)) == -1, tv);
- if (e != -1) {
- cnt += (int)tv.tv_sec;
- cnt += (int)tv.tv_usec;
- }
-
- for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); ii++)
- HX(clock_gettime(cl[ii], &ts) == -1, ts);
-
- HX((pid = getpid()) == -1, pid);
- HX((pid = getsid(pid)) == -1, pid);
- HX((pid = getppid()) == -1, pid);
- HX((pid = getpgid(0)) == -1, pid);
- HX((e = getpriority(0, 0)) == -1, e);
-
- if (!faster) {
- ts.tv_sec = 0;
- ts.tv_nsec = 1;
- (void) nanosleep(&ts, NULL);
- }
-
- HX(sigpending(&sigset) == -1, sigset);
- HX(sigprocmask(SIG_BLOCK, NULL, &sigset) == -1,
- sigset);
-
-#ifdef CAN_REFERENCE_MAIN
- HF(main); /* an addr in program */
-#endif
- HF(getentropy); /* an addr in this library */
- HF(printf); /* an addr in libc */
- p = (char *)&p;
- HD(p); /* an addr on stack */
- p = (char *)&errno;
- HD(p); /* the addr of errno */
-
- if (i == 0) {
- struct sockaddr_storage ss;
- struct statvfs stvfs;
- struct termios tios;
- struct statfs stfs;
- socklen_t ssl;
- off_t off;
-
- /*
- * Prime-sized mappings encourage fragmentation;
- * thus exposing some address entropy.
- */
- struct mm {
- size_t npg;
- void *p;
- } mm[] = {
- { 17, MAP_FAILED }, { 3, MAP_FAILED },
- { 11, MAP_FAILED }, { 2, MAP_FAILED },
- { 5, MAP_FAILED }, { 3, MAP_FAILED },
- { 7, MAP_FAILED }, { 1, MAP_FAILED },
- { 57, MAP_FAILED }, { 3, MAP_FAILED },
- { 131, MAP_FAILED }, { 1, MAP_FAILED },
- };
-
- for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
- HX(mm[m].p = mmap(NULL,
- mm[m].npg * pgs,
- PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, -1,
- (off_t)0), mm[m].p);
- if (mm[m].p != MAP_FAILED) {
- size_t mo;
-
- /* Touch some memory... */
- p = mm[m].p;
- mo = cnt %
- (mm[m].npg * pgs - 1);
- p[mo] = 1;
- cnt += (int)((long)(mm[m].p)
- / pgs);
- }
-
- /* Check cnts and times... */
- for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]);
- ii++) {
- HX((e = clock_gettime(cl[ii],
- &ts)) == -1, ts);
- if (e != -1)
- cnt += (int)ts.tv_nsec;
- }
-
- HX((e = getrusage(RUSAGE_SELF,
- &ru)) == -1, ru);
- if (e != -1) {
- cnt += (int)ru.ru_utime.tv_sec;
- cnt += (int)ru.ru_utime.tv_usec;
- }
- }
-
- for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
- if (mm[m].p != MAP_FAILED)
- munmap(mm[m].p, mm[m].npg * pgs);
- mm[m].p = MAP_FAILED;
- }
-
- HX(stat(".", &st) == -1, st);
- HX(statvfs(".", &stvfs) == -1, stvfs);
- HX(statfs(".", &stfs) == -1, stfs);
-
- HX(stat("/", &st) == -1, st);
- HX(statvfs("/", &stvfs) == -1, stvfs);
- HX(statfs("/", &stfs) == -1, stfs);
-
- HX((e = fstat(0, &st)) == -1, st);
- if (e == -1) {
- if (S_ISREG(st.st_mode) ||
- S_ISFIFO(st.st_mode) ||
- S_ISSOCK(st.st_mode)) {
- HX(fstatvfs(0, &stvfs) == -1,
- stvfs);
- HX(fstatfs(0, &stfs) == -1,
- stfs);
- HX((off = lseek(0, (off_t)0,
- SEEK_CUR)) < 0, off);
- }
- if (S_ISCHR(st.st_mode)) {
- HX(tcgetattr(0, &tios) == -1,
- tios);
- } else if (S_ISSOCK(st.st_mode)) {
- memset(&ss, 0, sizeof ss);
- ssl = sizeof(ss);
- HX(getpeername(0,
- (void *)&ss, &ssl) == -1,
- ss);
- }
- }
-
- HX((e = getrusage(RUSAGE_CHILDREN,
- &ru)) == -1, ru);
- if (e != -1) {
- cnt += (int)ru.ru_utime.tv_sec;
- cnt += (int)ru.ru_utime.tv_usec;
- }
- } else {
- /* Subsequent hashes absorb previous result */
- HD(results);
- }
-
- HX((e = gettimeofday(&tv, NULL)) == -1, tv);
- if (e != -1) {
- cnt += (int)tv.tv_sec;
- cnt += (int)tv.tv_usec;
- }
-
- HD(cnt);
- }
-#ifdef HAVE_GETAUXVAL
-# ifdef AT_RANDOM
- /* Not as random as you think but we take what we are given */
- p = (char *) getauxval(AT_RANDOM);
- if (p)
- HR(p, 16);
-# endif
-# ifdef AT_SYSINFO_EHDR
- p = (char *) getauxval(AT_SYSINFO_EHDR);
- if (p)
- HR(p, pgs);
-# endif
-# ifdef AT_BASE
- p = (char *) getauxval(AT_BASE);
- if (p)
- HD(p);
-# endif
-#endif /* HAVE_GETAUXVAL */
-
- CRYPTO_SHA512_FINAL(results, &ctx);
- memcpy((char*)buf + i, results, min(sizeof(results), len - i));
- i += min(sizeof(results), len - i);
- }
- memset(results, 0, sizeof results);
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return 0; /* satisfied */
- }
- errno = EIO;
- return -1;
-}
diff --git a/external/unbound/compat/getentropy_osx.c b/external/unbound/compat/getentropy_osx.c
deleted file mode 100644
index d5a64ab36..000000000
--- a/external/unbound/compat/getentropy_osx.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* $OpenBSD: getentropy_osx.c,v 1.3 2014/07/12 14:48:00 deraadt Exp $ */
-
-/*
- * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
- * Copyright (c) 2014 Bob Beck <beck@obtuse.com>
- *
- * 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.
- */
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/syscall.h>
-#include <sys/sysctl.h>
-#include <sys/statvfs.h>
-#include <sys/socket.h>
-#include <sys/mount.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <time.h>
-#include <mach/mach_time.h>
-#include <mach/mach_host.h>
-#include <mach/host_info.h>
-#include <sys/socketvar.h>
-#include <sys/vmmeter.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <netinet/udp.h>
-#include <netinet/ip_var.h>
-#include <netinet/tcp_var.h>
-#include <netinet/udp_var.h>
-#include <CommonCrypto/CommonDigest.h>
-#define SHA512_Update(a, b, c) (CC_SHA512_Update((a), (b), (c)))
-#define SHA512_Init(xxx) (CC_SHA512_Init((xxx)))
-#define SHA512_Final(xxx, yyy) (CC_SHA512_Final((xxx), (yyy)))
-#define SHA512_CTX CC_SHA512_CTX
-#define SHA512_DIGEST_LENGTH CC_SHA512_DIGEST_LENGTH
-
-#define REPEAT 5
-#define min(a, b) (((a) < (b)) ? (a) : (b))
-
-#define HX(a, b) \
- do { \
- if ((a)) \
- HD(errno); \
- else \
- HD(b); \
- } while (0)
-
-#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
-#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
-#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
-
-int getentropy(void *buf, size_t len);
-
-#ifdef CAN_REFERENCE_MAIN
-extern int main(int, char *argv[]);
-#endif
-static int gotdata(char *buf, size_t len);
-static int getentropy_urandom(void *buf, size_t len);
-static int getentropy_fallback(void *buf, size_t len);
-
-int
-getentropy(void *buf, size_t len)
-{
- int ret = -1;
-
- if (len > 256) {
- errno = EIO;
- return -1;
- }
-
- /*
- * Try to get entropy with /dev/urandom
- *
- * This can fail if the process is inside a chroot or if file
- * descriptors are exhausted.
- */
- ret = getentropy_urandom(buf, len);
- if (ret != -1)
- return (ret);
-
- /*
- * Entropy collection via /dev/urandom and sysctl have failed.
- *
- * No other API exists for collecting entropy, and we have
- * no failsafe way to get it on OSX that is not sensitive
- * to resource exhaustion.
- *
- * We have very few options:
- * - Even syslog_r is unsafe to call at this low level, so
- * there is no way to alert the user or program.
- * - Cannot call abort() because some systems have unsafe
- * corefiles.
- * - Could raise(SIGKILL) resulting in silent program termination.
- * - Return EIO, to hint that arc4random's stir function
- * should raise(SIGKILL)
- * - Do the best under the circumstances....
- *
- * This code path exists to bring light to the issue that OSX
- * does not provide a failsafe API for entropy collection.
- *
- * We hope this demonstrates that OSX should consider
- * providing a new failsafe API which works in a chroot or
- * when file descriptors are exhausted.
- */
-#undef FAIL_INSTEAD_OF_TRYING_FALLBACK
-#ifdef FAIL_INSTEAD_OF_TRYING_FALLBACK
- raise(SIGKILL);
-#endif
- ret = getentropy_fallback(buf, len);
- if (ret != -1)
- return (ret);
-
- errno = EIO;
- return (ret);
-}
-
-/*
- * Basic sanity checking; wish we could do better.
- */
-static int
-gotdata(char *buf, size_t len)
-{
- char any_set = 0;
- size_t i;
-
- for (i = 0; i < len; ++i)
- any_set |= buf[i];
- if (any_set == 0)
- return -1;
- return 0;
-}
-
-static int
-getentropy_urandom(void *buf, size_t len)
-{
- struct stat st;
- size_t i;
- int fd, flags;
- int save_errno = errno;
-
-start:
-
- flags = O_RDONLY;
-#ifdef O_NOFOLLOW
- flags |= O_NOFOLLOW;
-#endif
-#ifdef O_CLOEXEC
- flags |= O_CLOEXEC;
-#endif
- fd = open("/dev/urandom", flags, 0);
- if (fd == -1) {
- if (errno == EINTR)
- goto start;
- goto nodevrandom;
- }
-#ifndef O_CLOEXEC
- fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-#endif
-
- /* Lightly verify that the device node looks sane */
- if (fstat(fd, &st) == -1 || !S_ISCHR(st.st_mode)) {
- close(fd);
- goto nodevrandom;
- }
- for (i = 0; i < len; ) {
- size_t wanted = len - i;
- ssize_t ret = read(fd, (char*)buf + i, wanted);
-
- if (ret == -1) {
- if (errno == EAGAIN || errno == EINTR)
- continue;
- close(fd);
- goto nodevrandom;
- }
- i += ret;
- }
- close(fd);
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return 0; /* satisfied */
- }
-nodevrandom:
- errno = EIO;
- return -1;
-}
-
-static int tcpmib[] = { CTL_NET, AF_INET, IPPROTO_TCP, TCPCTL_STATS };
-static int udpmib[] = { CTL_NET, AF_INET, IPPROTO_UDP, UDPCTL_STATS };
-static int ipmib[] = { CTL_NET, AF_INET, IPPROTO_IP, IPCTL_STATS };
-static int kmib[] = { CTL_KERN, KERN_USRSTACK };
-static int hwmib[] = { CTL_HW, HW_USERMEM };
-
-static int
-getentropy_fallback(void *buf, size_t len)
-{
- uint8_t results[SHA512_DIGEST_LENGTH];
- int save_errno = errno, e, pgs = getpagesize(), faster = 0, repeat;
- static int cnt;
- struct timespec ts;
- struct timeval tv;
- struct rusage ru;
- sigset_t sigset;
- struct stat st;
- SHA512_CTX ctx;
- static pid_t lastpid;
- pid_t pid;
- size_t i, ii, m;
- char *p;
- struct tcpstat tcpstat;
- struct udpstat udpstat;
- struct ipstat ipstat;
- u_int64_t mach_time;
- unsigned int idata;
- void *addr;
-
- pid = getpid();
- if (lastpid == pid) {
- faster = 1;
- repeat = 2;
- } else {
- faster = 0;
- lastpid = pid;
- repeat = REPEAT;
- }
- for (i = 0; i < len; ) {
- int j;
- SHA512_Init(&ctx);
- for (j = 0; j < repeat; j++) {
- HX((e = gettimeofday(&tv, NULL)) == -1, tv);
- if (e != -1) {
- cnt += (int)tv.tv_sec;
- cnt += (int)tv.tv_usec;
- }
-
- mach_time = mach_absolute_time();
- HD(mach_time);
-
- ii = sizeof(addr);
- HX(sysctl(kmib, sizeof(kmib) / sizeof(kmib[0]),
- &addr, &ii, NULL, 0) == -1, addr);
-
- ii = sizeof(idata);
- HX(sysctl(hwmib, sizeof(hwmib) / sizeof(hwmib[0]),
- &idata, &ii, NULL, 0) == -1, idata);
-
- ii = sizeof(tcpstat);
- HX(sysctl(tcpmib, sizeof(tcpmib) / sizeof(tcpmib[0]),
- &tcpstat, &ii, NULL, 0) == -1, tcpstat);
-
- ii = sizeof(udpstat);
- HX(sysctl(udpmib, sizeof(udpmib) / sizeof(udpmib[0]),
- &udpstat, &ii, NULL, 0) == -1, udpstat);
-
- ii = sizeof(ipstat);
- HX(sysctl(ipmib, sizeof(ipmib) / sizeof(ipmib[0]),
- &ipstat, &ii, NULL, 0) == -1, ipstat);
-
- HX((pid = getpid()) == -1, pid);
- HX((pid = getsid(pid)) == -1, pid);
- HX((pid = getppid()) == -1, pid);
- HX((pid = getpgid(0)) == -1, pid);
- HX((e = getpriority(0, 0)) == -1, e);
-
- if (!faster) {
- ts.tv_sec = 0;
- ts.tv_nsec = 1;
- (void) nanosleep(&ts, NULL);
- }
-
- HX(sigpending(&sigset) == -1, sigset);
- HX(sigprocmask(SIG_BLOCK, NULL, &sigset) == -1,
- sigset);
-
-#ifdef CAN_REFERENCE_MAIN
- HF(main); /* an addr in program */
-#endif
- HF(getentropy); /* an addr in this library */
- HF(printf); /* an addr in libc */
- p = (char *)&p;
- HD(p); /* an addr on stack */
- p = (char *)&errno;
- HD(p); /* the addr of errno */
-
- if (i == 0) {
- struct sockaddr_storage ss;
- struct statvfs stvfs;
- struct termios tios;
- struct statfs stfs;
- socklen_t ssl;
- off_t off;
-
- /*
- * Prime-sized mappings encourage fragmentation;
- * thus exposing some address entropy.
- */
- struct mm {
- size_t npg;
- void *p;
- } mm[] = {
- { 17, MAP_FAILED }, { 3, MAP_FAILED },
- { 11, MAP_FAILED }, { 2, MAP_FAILED },
- { 5, MAP_FAILED }, { 3, MAP_FAILED },
- { 7, MAP_FAILED }, { 1, MAP_FAILED },
- { 57, MAP_FAILED }, { 3, MAP_FAILED },
- { 131, MAP_FAILED }, { 1, MAP_FAILED },
- };
-
- for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
- HX(mm[m].p = mmap(NULL,
- mm[m].npg * pgs,
- PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, -1,
- (off_t)0), mm[m].p);
- if (mm[m].p != MAP_FAILED) {
- size_t mo;
-
- /* Touch some memory... */
- p = mm[m].p;
- mo = cnt %
- (mm[m].npg * pgs - 1);
- p[mo] = 1;
- cnt += (int)((long)(mm[m].p)
- / pgs);
- }
-
- /* Check cnts and times... */
- mach_time = mach_absolute_time();
- HD(mach_time);
- cnt += (int)mach_time;
-
- HX((e = getrusage(RUSAGE_SELF,
- &ru)) == -1, ru);
- if (e != -1) {
- cnt += (int)ru.ru_utime.tv_sec;
- cnt += (int)ru.ru_utime.tv_usec;
- }
- }
-
- for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
- if (mm[m].p != MAP_FAILED)
- munmap(mm[m].p, mm[m].npg * pgs);
- mm[m].p = MAP_FAILED;
- }
-
- HX(stat(".", &st) == -1, st);
- HX(statvfs(".", &stvfs) == -1, stvfs);
- HX(statfs(".", &stfs) == -1, stfs);
-
- HX(stat("/", &st) == -1, st);
- HX(statvfs("/", &stvfs) == -1, stvfs);
- HX(statfs("/", &stfs) == -1, stfs);
-
- HX((e = fstat(0, &st)) == -1, st);
- if (e == -1) {
- if (S_ISREG(st.st_mode) ||
- S_ISFIFO(st.st_mode) ||
- S_ISSOCK(st.st_mode)) {
- HX(fstatvfs(0, &stvfs) == -1,
- stvfs);
- HX(fstatfs(0, &stfs) == -1,
- stfs);
- HX((off = lseek(0, (off_t)0,
- SEEK_CUR)) < 0, off);
- }
- if (S_ISCHR(st.st_mode)) {
- HX(tcgetattr(0, &tios) == -1,
- tios);
- } else if (S_ISSOCK(st.st_mode)) {
- memset(&ss, 0, sizeof ss);
- ssl = sizeof(ss);
- HX(getpeername(0,
- (void *)&ss, &ssl) == -1,
- ss);
- }
- }
-
- HX((e = getrusage(RUSAGE_CHILDREN,
- &ru)) == -1, ru);
- if (e != -1) {
- cnt += (int)ru.ru_utime.tv_sec;
- cnt += (int)ru.ru_utime.tv_usec;
- }
- } else {
- /* Subsequent hashes absorb previous result */
- HD(results);
- }
-
- HX((e = gettimeofday(&tv, NULL)) == -1, tv);
- if (e != -1) {
- cnt += (int)tv.tv_sec;
- cnt += (int)tv.tv_usec;
- }
-
- HD(cnt);
- }
-
- SHA512_Final(results, &ctx);
- memcpy((char*)buf + i, results, min(sizeof(results), len - i));
- i += min(sizeof(results), len - i);
- }
- memset(results, 0, sizeof results);
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return 0; /* satisfied */
- }
- errno = EIO;
- return -1;
-}
diff --git a/external/unbound/compat/getentropy_solaris.c b/external/unbound/compat/getentropy_solaris.c
deleted file mode 100644
index 810098a8d..000000000
--- a/external/unbound/compat/getentropy_solaris.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/* $OpenBSD: getentropy_solaris.c,v 1.3 2014/07/12 14:46:31 deraadt Exp $ */
-
-/*
- * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
- * Copyright (c) 2014 Bob Beck <beck@obtuse.com>
- *
- * 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.
- */
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/syscall.h>
-#include <sys/statvfs.h>
-#include <sys/socket.h>
-#include <sys/mount.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <stdlib.h>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#include <stdio.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <time.h>
-#ifdef HAVE_SYS_SHA2_H
-#include <sys/sha2.h>
-#define SHA512_Init SHA512Init
-#define SHA512_Update SHA512Update
-#define SHA512_Final SHA512Final
-#else
-#include "openssl/sha.h"
-#endif
-
-#include <sys/vfs.h>
-#include <sys/statfs.h>
-#include <sys/loadavg.h>
-
-#define REPEAT 5
-#define min(a, b) (((a) < (b)) ? (a) : (b))
-
-#define HX(a, b) \
- do { \
- if ((a)) \
- HD(errno); \
- else \
- HD(b); \
- } while (0)
-
-#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
-#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
-#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
-
-int getentropy(void *buf, size_t len);
-
-#ifdef CAN_REFERENCE_MAIN
-extern int main(int, char *argv[]);
-#endif
-static int gotdata(char *buf, size_t len);
-static int getentropy_urandom(void *buf, size_t len, const char *path,
- int devfscheck);
-static int getentropy_fallback(void *buf, size_t len);
-
-int
-getentropy(void *buf, size_t len)
-{
- int ret = -1;
-
- if (len > 256) {
- errno = EIO;
- return -1;
- }
-
- /*
- * Try to get entropy with /dev/urandom
- *
- * Solaris provides /dev/urandom as a symbolic link to
- * /devices/pseudo/random@0:urandom which is provided by
- * a devfs filesystem. Best practice is to use O_NOFOLLOW,
- * so we must try the unpublished name directly.
- *
- * This can fail if the process is inside a chroot which lacks
- * the devfs mount, or if file descriptors are exhausted.
- */
- ret = getentropy_urandom(buf, len,
- "/devices/pseudo/random@0:urandom", 1);
- if (ret != -1)
- return (ret);
-
- /*
- * Unfortunately, chroot spaces on Solaris are sometimes setup
- * with direct device node of the well-known /dev/urandom name
- * (perhaps to avoid dragging all of devfs into the space).
- *
- * This can fail if the process is inside a chroot or if file
- * descriptors are exhausted.
- */
- ret = getentropy_urandom(buf, len, "/dev/urandom", 0);
- if (ret != -1)
- return (ret);
-
- /*
- * Entropy collection via /dev/urandom has failed.
- *
- * No other API exists for collecting entropy, and we have
- * no failsafe way to get it on Solaris that is not sensitive
- * to resource exhaustion.
- *
- * We have very few options:
- * - Even syslog_r is unsafe to call at this low level, so
- * there is no way to alert the user or program.
- * - Cannot call abort() because some systems have unsafe
- * corefiles.
- * - Could raise(SIGKILL) resulting in silent program termination.
- * - Return EIO, to hint that arc4random's stir function
- * should raise(SIGKILL)
- * - Do the best under the circumstances....
- *
- * This code path exists to bring light to the issue that Solaris
- * does not provide a failsafe API for entropy collection.
- *
- * We hope this demonstrates that Solaris should consider
- * providing a new failsafe API which works in a chroot or
- * when file descriptors are exhausted.
- */
-#undef FAIL_INSTEAD_OF_TRYING_FALLBACK
-#ifdef FAIL_INSTEAD_OF_TRYING_FALLBACK
- raise(SIGKILL);
-#endif
- ret = getentropy_fallback(buf, len);
- if (ret != -1)
- return (ret);
-
- errno = EIO;
- return (ret);
-}
-
-/*
- * Basic sanity checking; wish we could do better.
- */
-static int
-gotdata(char *buf, size_t len)
-{
- char any_set = 0;
- size_t i;
-
- for (i = 0; i < len; ++i)
- any_set |= buf[i];
- if (any_set == 0)
- return -1;
- return 0;
-}
-
-static int
-getentropy_urandom(void *buf, size_t len, const char *path, int devfscheck)
-{
- struct stat st;
- size_t i;
- int fd, flags;
- int save_errno = errno;
-
-start:
-
- flags = O_RDONLY;
-#ifdef O_NOFOLLOW
- flags |= O_NOFOLLOW;
-#endif
-#ifdef O_CLOEXEC
- flags |= O_CLOEXEC;
-#endif
- fd = open(path, flags, 0);
- if (fd == -1) {
- if (errno == EINTR)
- goto start;
- goto nodevrandom;
- }
-#ifndef O_CLOEXEC
- fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-#endif
-
- /* Lightly verify that the device node looks sane */
- if (fstat(fd, &st) == -1 || !S_ISCHR(st.st_mode) ||
- (devfscheck && (strcmp(st.st_fstype, "devfs") != 0))) {
- close(fd);
- goto nodevrandom;
- }
- for (i = 0; i < len; ) {
- size_t wanted = len - i;
- ssize_t ret = read(fd, (char*)buf + i, wanted);
-
- if (ret == -1) {
- if (errno == EAGAIN || errno == EINTR)
- continue;
- close(fd);
- goto nodevrandom;
- }
- i += ret;
- }
- close(fd);
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return 0; /* satisfied */
- }
-nodevrandom:
- errno = EIO;
- return -1;
-}
-
-static const int cl[] = {
- CLOCK_REALTIME,
-#ifdef CLOCK_MONOTONIC
- CLOCK_MONOTONIC,
-#endif
-#ifdef CLOCK_MONOTONIC_RAW
- CLOCK_MONOTONIC_RAW,
-#endif
-#ifdef CLOCK_TAI
- CLOCK_TAI,
-#endif
-#ifdef CLOCK_VIRTUAL
- CLOCK_VIRTUAL,
-#endif
-#ifdef CLOCK_UPTIME
- CLOCK_UPTIME,
-#endif
-#ifdef CLOCK_PROCESS_CPUTIME_ID
- CLOCK_PROCESS_CPUTIME_ID,
-#endif
-#ifdef CLOCK_THREAD_CPUTIME_ID
- CLOCK_THREAD_CPUTIME_ID,
-#endif
-};
-
-static int
-getentropy_fallback(void *buf, size_t len)
-{
- uint8_t results[SHA512_DIGEST_LENGTH];
- int save_errno = errno, e, pgs = getpagesize(), faster = 0, repeat;
- static int cnt;
- struct timespec ts;
- struct timeval tv;
- double loadavg[3];
- struct rusage ru;
- sigset_t sigset;
- struct stat st;
- SHA512_CTX ctx;
- static pid_t lastpid;
- pid_t pid;
- size_t i, ii, m;
- char *p;
-
- pid = getpid();
- if (lastpid == pid) {
- faster = 1;
- repeat = 2;
- } else {
- faster = 0;
- lastpid = pid;
- repeat = REPEAT;
- }
- for (i = 0; i < len; ) {
- int j;
- SHA512_Init(&ctx);
- for (j = 0; j < repeat; j++) {
- HX((e = gettimeofday(&tv, NULL)) == -1, tv);
- if (e != -1) {
- cnt += (int)tv.tv_sec;
- cnt += (int)tv.tv_usec;
- }
-
- for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); ii++)
- HX(clock_gettime(cl[ii], &ts) == -1, ts);
-
- HX((pid = getpid()) == -1, pid);
- HX((pid = getsid(pid)) == -1, pid);
- HX((pid = getppid()) == -1, pid);
- HX((pid = getpgid(0)) == -1, pid);
- HX((e = getpriority(0, 0)) == -1, e);
- HX((getloadavg(loadavg, 3) == -1), loadavg);
-
- if (!faster) {
- ts.tv_sec = 0;
- ts.tv_nsec = 1;
- (void) nanosleep(&ts, NULL);
- }
-
- HX(sigpending(&sigset) == -1, sigset);
- HX(sigprocmask(SIG_BLOCK, NULL, &sigset) == -1,
- sigset);
-
-#ifdef CAN_REFERENCE_MAIN
- HF(main); /* an addr in program */
-#endif
- HF(getentropy); /* an addr in this library */
- HF(printf); /* an addr in libc */
- p = (char *)&p;
- HD(p); /* an addr on stack */
- p = (char *)&errno;
- HD(p); /* the addr of errno */
-
- if (i == 0) {
- struct sockaddr_storage ss;
- struct statvfs stvfs;
- struct termios tios;
- socklen_t ssl;
- off_t off;
-
- /*
- * Prime-sized mappings encourage fragmentation;
- * thus exposing some address entropy.
- */
- struct mm {
- size_t npg;
- void *p;
- } mm[] = {
- { 17, MAP_FAILED }, { 3, MAP_FAILED },
- { 11, MAP_FAILED }, { 2, MAP_FAILED },
- { 5, MAP_FAILED }, { 3, MAP_FAILED },
- { 7, MAP_FAILED }, { 1, MAP_FAILED },
- { 57, MAP_FAILED }, { 3, MAP_FAILED },
- { 131, MAP_FAILED }, { 1, MAP_FAILED },
- };
-
- for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
- HX(mm[m].p = mmap(NULL,
- mm[m].npg * pgs,
- PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, -1,
- (off_t)0), mm[m].p);
- if (mm[m].p != MAP_FAILED) {
- size_t mo;
-
- /* Touch some memory... */
- p = mm[m].p;
- mo = cnt %
- (mm[m].npg * pgs - 1);
- p[mo] = 1;
- cnt += (int)((long)(mm[m].p)
- / pgs);
- }
-
- /* Check cnts and times... */
- for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]);
- ii++) {
- HX((e = clock_gettime(cl[ii],
- &ts)) == -1, ts);
- if (e != -1)
- cnt += (int)ts.tv_nsec;
- }
-
- HX((e = getrusage(RUSAGE_SELF,
- &ru)) == -1, ru);
- if (e != -1) {
- cnt += (int)ru.ru_utime.tv_sec;
- cnt += (int)ru.ru_utime.tv_usec;
- }
- }
-
- for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
- if (mm[m].p != MAP_FAILED)
- munmap(mm[m].p, mm[m].npg * pgs);
- mm[m].p = MAP_FAILED;
- }
-
- HX(stat(".", &st) == -1, st);
- HX(statvfs(".", &stvfs) == -1, stvfs);
-
- HX(stat("/", &st) == -1, st);
- HX(statvfs("/", &stvfs) == -1, stvfs);
-
- HX((e = fstat(0, &st)) == -1, st);
- if (e == -1) {
- if (S_ISREG(st.st_mode) ||
- S_ISFIFO(st.st_mode) ||
- S_ISSOCK(st.st_mode)) {
- HX(fstatvfs(0, &stvfs) == -1,
- stvfs);
- HX((off = lseek(0, (off_t)0,
- SEEK_CUR)) < 0, off);
- }
- if (S_ISCHR(st.st_mode)) {
- HX(tcgetattr(0, &tios) == -1,
- tios);
- } else if (S_ISSOCK(st.st_mode)) {
- memset(&ss, 0, sizeof ss);
- ssl = sizeof(ss);
- HX(getpeername(0,
- (void *)&ss, &ssl) == -1,
- ss);
- }
- }
-
- HX((e = getrusage(RUSAGE_CHILDREN,
- &ru)) == -1, ru);
- if (e != -1) {
- cnt += (int)ru.ru_utime.tv_sec;
- cnt += (int)ru.ru_utime.tv_usec;
- }
- } else {
- /* Subsequent hashes absorb previous result */
- HD(results);
- }
-
- HX((e = gettimeofday(&tv, NULL)) == -1, tv);
- if (e != -1) {
- cnt += (int)tv.tv_sec;
- cnt += (int)tv.tv_usec;
- }
-
- HD(cnt);
- }
- SHA512_Final(results, &ctx);
- memcpy((char*)buf + i, results, min(sizeof(results), len - i));
- i += min(sizeof(results), len - i);
- }
- memset(results, 0, sizeof results);
- if (gotdata(buf, len) == 0) {
- errno = save_errno;
- return 0; /* satisfied */
- }
- errno = EIO;
- return -1;
-}
diff --git a/external/unbound/compat/getentropy_win.c b/external/unbound/compat/getentropy_win.c
deleted file mode 100644
index 71fb955e7..000000000
--- a/external/unbound/compat/getentropy_win.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* $OpenBSD$ */
-
-/*
- * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
- * Copyright (c) 2014, Bob Beck <beck@obtuse.com>
- *
- * 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.
- */
-
-#include <windows.h>
-#include <errno.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <wincrypt.h>
-#include <process.h>
-
-int getentropy(void *buf, size_t len);
-
-/*
- * On Windows, CryptGenRandom is supposed to be a well-seeded
- * cryptographically strong random number generator.
- */
-int
-getentropy(void *buf, size_t len)
-{
- HCRYPTPROV provider;
-
- if (len > 256) {
- errno = EIO;
- return -1;
- }
-
- if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT) == 0)
- goto fail;
- if (CryptGenRandom(provider, len, buf) == 0) {
- CryptReleaseContext(provider, 0);
- goto fail;
- }
- CryptReleaseContext(provider, 0);
- return (0);
-
-fail:
- errno = EIO;
- return (-1);
-}
diff --git a/external/unbound/compat/gmtime_r.c b/external/unbound/compat/gmtime_r.c
deleted file mode 100644
index 19eb637e3..000000000
--- a/external/unbound/compat/gmtime_r.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Taken from FreeBSD src / lib / libc / stdtime / localtime.c 1.43 revision.
- * localtime.c 7.78.
- * tzfile.h 1.8
- * adapted to be replacement gmtime_r.
- */
-#include "config.h"
-
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-
-#define MONSPERYEAR 12
-#define DAYSPERNYEAR 365
-#define DAYSPERLYEAR 366
-#define SECSPERMIN 60
-#define SECSPERHOUR (60*60)
-#define SECSPERDAY (24*60*60)
-#define DAYSPERWEEK 7
-#define TM_SUNDAY 0
-#define TM_MONDAY 1
-#define TM_TUESDAY 2
-#define TM_WEDNESDAY 3
-#define TM_THURSDAY 4
-#define TM_FRIDAY 5
-#define TM_SATURDAY 6
-
-#define TM_YEAR_BASE 1900
-
-#define EPOCH_YEAR 1970
-#define EPOCH_WDAY TM_THURSDAY
-
-#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
-
-static const int mon_lengths[2][MONSPERYEAR] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-static const int year_lengths[2] = {
- DAYSPERNYEAR, DAYSPERLYEAR
-};
-
-static void
-timesub(timep, offset, tmp)
-const time_t * const timep;
-const long offset;
-struct tm * const tmp;
-{
- long days;
- long rem;
- long y;
- int yleap;
- const int * ip;
-
- days = *timep / SECSPERDAY;
- rem = *timep % SECSPERDAY;
- rem += (offset);
- while (rem < 0) {
- rem += SECSPERDAY;
- --days;
- }
- while (rem >= SECSPERDAY) {
- rem -= SECSPERDAY;
- ++days;
- }
- tmp->tm_hour = (int) (rem / SECSPERHOUR);
- rem = rem % SECSPERHOUR;
- tmp->tm_min = (int) (rem / SECSPERMIN);
- /*
- ** A positive leap second requires a special
- ** representation. This uses "... ??:59:60" et seq.
- */
- tmp->tm_sec = (int) (rem % SECSPERMIN) ;
- tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYSPERWEEK);
- if (tmp->tm_wday < 0)
- tmp->tm_wday += DAYSPERWEEK;
- y = EPOCH_YEAR;
-#define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400)
- while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) {
- long newy;
-
- newy = y + days / DAYSPERNYEAR;
- if (days < 0)
- --newy;
- days -= (newy - y) * DAYSPERNYEAR +
- LEAPS_THRU_END_OF(newy - 1) -
- LEAPS_THRU_END_OF(y - 1);
- y = newy;
- }
- tmp->tm_year = y - TM_YEAR_BASE;
- tmp->tm_yday = (int) days;
- ip = mon_lengths[yleap];
- for (tmp->tm_mon = 0; days >= (long) ip[tmp->tm_mon]; ++(tmp->tm_mon))
- days = days - (long) ip[tmp->tm_mon];
- tmp->tm_mday = (int) (days + 1);
- tmp->tm_isdst = 0;
-}
-
-/*
-* Re-entrant version of gmtime.
-*/
-struct tm * gmtime_r(const time_t* timep, struct tm *tm)
-{
- timesub(timep, 0L, tm);
- return tm;
-}
diff --git a/external/unbound/compat/inet_aton.c b/external/unbound/compat/inet_aton.c
deleted file mode 100644
index e93fe8d73..000000000
--- a/external/unbound/compat/inet_aton.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* From openssh4.3p2 compat/inet_aton.c */
-/*
- * Copyright (c) 1983, 1990, 1993
- * The Regents of the University of California. 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.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
- * -
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * 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, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION 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.
- * -
- * --Copyright--
- */
-
-/* OPENBSD ORIGINAL: lib/libc/net/inet_addr.c */
-
-#include <config.h>
-
-#if !defined(HAVE_INET_ATON)
-
-#include <sys/types.h>
-#include <sys/param.h>
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-#include <ctype.h>
-
-#if 0
-/*
- * Ascii internet address interpretation routine.
- * The value returned is in network order.
- */
-in_addr_t
-inet_addr(const char *cp)
-{
- struct in_addr val;
-
- if (inet_aton(cp, &val))
- return (val.s_addr);
- return (INADDR_NONE);
-}
-#endif
-
-/*
- * Check whether "cp" is a valid ascii representation
- * of an Internet address and convert to a binary address.
- * Returns 1 if the address is valid, 0 if not.
- * This replaces inet_addr, the return value from which
- * cannot distinguish between failure and a local broadcast address.
- */
-int
-inet_aton(const char *cp, struct in_addr *addr)
-{
- uint32_t val;
- int base, n;
- char c;
- unsigned int parts[4];
- unsigned int *pp = parts;
-
- c = *cp;
- for (;;) {
- /*
- * Collect number up to ``.''.
- * Values are specified as for C:
- * 0x=hex, 0=octal, isdigit=decimal.
- */
- if (!isdigit((unsigned char)c))
- return (0);
- val = 0; base = 10;
- if (c == '0') {
- c = *++cp;
- if (c == 'x' || c == 'X')
- base = 16, c = *++cp;
- else
- base = 8;
- }
- for (;;) {
- if (isascii((unsigned char)c) && isdigit((unsigned char)c)) {
- val = (val * base) + (c - '0');
- c = *++cp;
- } else if (base == 16 && isascii((unsigned char)c) && isxdigit((unsigned char)c)) {
- val = (val << 4) |
- (c + 10 - (islower((unsigned char)c) ? 'a' : 'A'));
- c = *++cp;
- } else
- break;
- }
- if (c == '.') {
- /*
- * Internet format:
- * a.b.c.d
- * a.b.c (with c treated as 16 bits)
- * a.b (with b treated as 24 bits)
- */
- if (pp >= parts + 3)
- return (0);
- *pp++ = val;
- c = *++cp;
- } else
- break;
- }
- /*
- * Check for trailing characters.
- */
- if (c != '\0' && (!isascii((unsigned char)c) || !isspace((unsigned char)c)))
- return (0);
- /*
- * Concoct the address according to
- * the number of parts specified.
- */
- n = pp - parts + 1;
- switch (n) {
-
- case 0:
- return (0); /* initial nondigit */
-
- case 1: /* a -- 32 bits */
- break;
-
- case 2: /* a.b -- 8.24 bits */
- if ((val > 0xffffff) || (parts[0] > 0xff))
- return (0);
- val |= parts[0] << 24;
- break;
-
- case 3: /* a.b.c -- 8.8.16 bits */
- if ((val > 0xffff) || (parts[0] > 0xff) || (parts[1] > 0xff))
- return (0);
- val |= (parts[0] << 24) | (parts[1] << 16);
- break;
-
- case 4: /* a.b.c.d -- 8.8.8.8 bits */
- if ((val > 0xff) || (parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff))
- return (0);
- val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
- break;
- }
- if (addr)
- addr->s_addr = htonl(val);
- return (1);
-}
-
-#endif /* !defined(HAVE_INET_ATON) */
diff --git a/external/unbound/compat/inet_ntop.c b/external/unbound/compat/inet_ntop.c
deleted file mode 100644
index bd418ae7d..000000000
--- a/external/unbound/compat/inet_ntop.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* From openssh 4.3p2 compat/inet_ntop.c */
-/* Copyright (c) 1996 by Internet Software Consortium.
- *
- * 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM 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.
- */
-
-/* OPENBSD ORIGINAL: lib/libc/net/inet_ntop.c */
-
-#include <config.h>
-
-#ifndef HAVE_INET_NTOP
-
-#include <sys/param.h>
-#include <sys/types.h>
-#ifdef HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-
-#ifndef IN6ADDRSZ
-#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
-#endif
-
-#ifndef INT16SZ
-#define INT16SZ 2 /* for systems without 16-bit ints */
-#endif
-
-/*
- * WARNING: Don't even consider trying to compile this on a system where
- * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
- */
-
-static const char *inet_ntop4(const u_char *src, char *dst, size_t size);
-static const char *inet_ntop6(const u_char *src, char *dst, size_t size);
-
-/* char *
- * inet_ntop(af, src, dst, size)
- * convert a network format address to presentation format.
- * return:
- * pointer to presentation format address (`dst'), or NULL (see errno).
- * author:
- * Paul Vixie, 1996.
- */
-const char *
-inet_ntop(int af, const void *src, char *dst, size_t size)
-{
- switch (af) {
- case AF_INET:
- return (inet_ntop4(src, dst, size));
- case AF_INET6:
- return (inet_ntop6(src, dst, size));
- default:
-#ifdef EAFNOSUPPORT
- errno = EAFNOSUPPORT;
-#else
- errno = ENOSYS;
-#endif
- return (NULL);
- }
- /* NOTREACHED */
-}
-
-/* const char *
- * inet_ntop4(src, dst, size)
- * format an IPv4 address, more or less like inet_ntoa()
- * return:
- * `dst' (as a const)
- * notes:
- * (1) uses no statics
- * (2) takes a u_char* not an in_addr as input
- * author:
- * Paul Vixie, 1996.
- */
-static const char *
-inet_ntop4(const u_char *src, char *dst, size_t size)
-{
- static const char fmt[] = "%u.%u.%u.%u";
- char tmp[sizeof "255.255.255.255"];
- int l;
-
- l = snprintf(tmp, size, fmt, src[0], src[1], src[2], src[3]);
- if (l <= 0 || l >= (int)size) {
- errno = ENOSPC;
- return (NULL);
- }
- strlcpy(dst, tmp, size);
- return (dst);
-}
-
-/* const char *
- * inet_ntop6(src, dst, size)
- * convert IPv6 binary address into presentation (printable) format
- * author:
- * Paul Vixie, 1996.
- */
-static const char *
-inet_ntop6(const u_char *src, char *dst, size_t size)
-{
- /*
- * Note that int32_t and int16_t need only be "at least" large enough
- * to contain a value of the specified size. On some systems, like
- * Crays, there is no such thing as an integer variable with 16 bits.
- * Keep this in mind if you think this function should have been coded
- * to use pointer overlays. All the world's not a VAX.
- */
- char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
- char *tp, *ep;
- struct { int base, len; } best, cur;
- u_int words[IN6ADDRSZ / INT16SZ];
- int i;
- int advance;
-
- /*
- * Preprocess:
- * Copy the input (bytewise) array into a wordwise array.
- * Find the longest run of 0x00's in src[] for :: shorthanding.
- */
- memset(words, '\0', sizeof words);
- for (i = 0; i < IN6ADDRSZ; i++)
- words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
- best.base = -1;
- best.len = 0;
- cur.base = -1;
- cur.len = 0;
- for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
- if (words[i] == 0) {
- if (cur.base == -1)
- cur.base = i, cur.len = 1;
- else
- cur.len++;
- } else {
- if (cur.base != -1) {
- if (best.base == -1 || cur.len > best.len)
- best = cur;
- cur.base = -1;
- }
- }
- }
- if (cur.base != -1) {
- if (best.base == -1 || cur.len > best.len)
- best = cur;
- }
- if (best.base != -1 && best.len < 2)
- best.base = -1;
-
- /*
- * Format the result.
- */
- tp = tmp;
- ep = tmp + sizeof(tmp);
- for (i = 0; i < (IN6ADDRSZ / INT16SZ) && tp < ep; i++) {
- /* Are we inside the best run of 0x00's? */
- if (best.base != -1 && i >= best.base &&
- i < (best.base + best.len)) {
- if (i == best.base) {
- if (tp + 1 >= ep)
- return (NULL);
- *tp++ = ':';
- }
- continue;
- }
- /* Are we following an initial run of 0x00s or any real hex? */
- if (i != 0) {
- if (tp + 1 >= ep)
- return (NULL);
- *tp++ = ':';
- }
- /* Is this address an encapsulated IPv4? */
- if (i == 6 && best.base == 0 &&
- (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
- if (!inet_ntop4(src+12, tp, (size_t)(ep - tp)))
- return (NULL);
- tp += strlen(tp);
- break;
- }
- advance = snprintf(tp, ep - tp, "%x", words[i]);
- if (advance <= 0 || advance >= ep - tp)
- return (NULL);
- tp += advance;
- }
- /* Was it a trailing run of 0x00's? */
- if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) {
- if (tp + 1 >= ep)
- return (NULL);
- *tp++ = ':';
- }
- if (tp + 1 >= ep)
- return (NULL);
- *tp++ = '\0';
-
- /*
- * Check for overflow, copy, and we're done.
- */
- if ((size_t)(tp - tmp) > size) {
- errno = ENOSPC;
- return (NULL);
- }
- strlcpy(dst, tmp, size);
- return (dst);
-}
-
-#endif /* !HAVE_INET_NTOP */
diff --git a/external/unbound/compat/inet_pton.c b/external/unbound/compat/inet_pton.c
deleted file mode 100644
index 15780d0b7..000000000
--- a/external/unbound/compat/inet_pton.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* $KAME: inet_pton.c,v 1.5 2001/08/20 02:32:40 itojun Exp $ */
-
-/* Copyright (c) 1996 by Internet Software Consortium.
- *
- * 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM 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.
- */
-
-#include <config.h>
-
-#include <string.h>
-#include <stdio.h>
-#include <errno.h>
-
-/*
- * WARNING: Don't even consider trying to compile this on a system where
- * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
- */
-
-static int inet_pton4 (const char *src, uint8_t *dst);
-static int inet_pton6 (const char *src, uint8_t *dst);
-
-/*
- *
- * The definitions we might miss.
- *
- */
-#ifndef NS_INT16SZ
-#define NS_INT16SZ 2
-#endif
-
-#ifndef NS_IN6ADDRSZ
-#define NS_IN6ADDRSZ 16
-#endif
-
-#ifndef NS_INADDRSZ
-#define NS_INADDRSZ 4
-#endif
-
-/* int
- * inet_pton(af, src, dst)
- * convert from presentation format (which usually means ASCII printable)
- * to network format (which is usually some kind of binary format).
- * return:
- * 1 if the address was valid for the specified address family
- * 0 if the address wasn't valid (`dst' is untouched in this case)
- * -1 if some other error occurred (`dst' is untouched in this case, too)
- * author:
- * Paul Vixie, 1996.
- */
-int
-inet_pton(af, src, dst)
- int af;
- const char *src;
- void *dst;
-{
- switch (af) {
- case AF_INET:
- return (inet_pton4(src, dst));
- case AF_INET6:
- return (inet_pton6(src, dst));
- default:
-#ifdef EAFNOSUPPORT
- errno = EAFNOSUPPORT;
-#else
- errno = ENOSYS;
-#endif
- return (-1);
- }
- /* NOTREACHED */
-}
-
-/* int
- * inet_pton4(src, dst)
- * like inet_aton() but without all the hexadecimal and shorthand.
- * return:
- * 1 if `src' is a valid dotted quad, else 0.
- * notice:
- * does not touch `dst' unless it's returning 1.
- * author:
- * Paul Vixie, 1996.
- */
-static int
-inet_pton4(src, dst)
- const char *src;
- uint8_t *dst;
-{
- static const char digits[] = "0123456789";
- int saw_digit, octets, ch;
- uint8_t tmp[NS_INADDRSZ], *tp;
-
- saw_digit = 0;
- octets = 0;
- *(tp = tmp) = 0;
- while ((ch = *src++) != '\0') {
- const char *pch;
-
- if ((pch = strchr(digits, ch)) != NULL) {
- uint32_t new = *tp * 10 + (pch - digits);
-
- if (new > 255)
- return (0);
- *tp = new;
- if (! saw_digit) {
- if (++octets > 4)
- return (0);
- saw_digit = 1;
- }
- } else if (ch == '.' && saw_digit) {
- if (octets == 4)
- return (0);
- *++tp = 0;
- saw_digit = 0;
- } else
- return (0);
- }
- if (octets < 4)
- return (0);
-
- memcpy(dst, tmp, NS_INADDRSZ);
- return (1);
-}
-
-/* int
- * inet_pton6(src, dst)
- * convert presentation level address to network order binary form.
- * return:
- * 1 if `src' is a valid [RFC1884 2.2] address, else 0.
- * notice:
- * (1) does not touch `dst' unless it's returning 1.
- * (2) :: in a full address is silently ignored.
- * credit:
- * inspired by Mark Andrews.
- * author:
- * Paul Vixie, 1996.
- */
-static int
-inet_pton6(src, dst)
- const char *src;
- uint8_t *dst;
-{
- static const char xdigits_l[] = "0123456789abcdef",
- xdigits_u[] = "0123456789ABCDEF";
- uint8_t tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
- const char *xdigits, *curtok;
- int ch, saw_xdigit;
- uint32_t val;
-
- memset((tp = tmp), '\0', NS_IN6ADDRSZ);
- endp = tp + NS_IN6ADDRSZ;
- colonp = NULL;
- /* Leading :: requires some special handling. */
- if (*src == ':')
- if (*++src != ':')
- return (0);
- curtok = src;
- saw_xdigit = 0;
- val = 0;
- while ((ch = *src++) != '\0') {
- const char *pch;
-
- if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
- pch = strchr((xdigits = xdigits_u), ch);
- if (pch != NULL) {
- val <<= 4;
- val |= (pch - xdigits);
- if (val > 0xffff)
- return (0);
- saw_xdigit = 1;
- continue;
- }
- if (ch == ':') {
- curtok = src;
- if (!saw_xdigit) {
- if (colonp)
- return (0);
- colonp = tp;
- continue;
- }
- if (tp + NS_INT16SZ > endp)
- return (0);
- *tp++ = (uint8_t) (val >> 8) & 0xff;
- *tp++ = (uint8_t) val & 0xff;
- saw_xdigit = 0;
- val = 0;
- continue;
- }
- if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
- inet_pton4(curtok, tp) > 0) {
- tp += NS_INADDRSZ;
- saw_xdigit = 0;
- break; /* '\0' was seen by inet_pton4(). */
- }
- return (0);
- }
- if (saw_xdigit) {
- if (tp + NS_INT16SZ > endp)
- return (0);
- *tp++ = (uint8_t) (val >> 8) & 0xff;
- *tp++ = (uint8_t) val & 0xff;
- }
- if (colonp != NULL) {
- /*
- * Since some memmove()'s erroneously fail to handle
- * overlapping regions, we'll do the shift by hand.
- */
- const int n = tp - colonp;
- int i;
-
- for (i = 1; i <= n; i++) {
- endp[- i] = colonp[n - i];
- colonp[n - i] = 0;
- }
- tp = endp;
- }
- if (tp != endp)
- return (0);
- memcpy(dst, tmp, NS_IN6ADDRSZ);
- return (1);
-}
diff --git a/external/unbound/compat/isblank.c b/external/unbound/compat/isblank.c
deleted file mode 100644
index 8feabed45..000000000
--- a/external/unbound/compat/isblank.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* isblank - compatibility implementation of isblank
- *
- * Copyright (c) 2015, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 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.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 COPYRIGHT
- * HOLDER OR CONTRIBUTORS 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.
- */
-
-#include "config.h"
-
-/* return true for a blank character: space or tab */
-int isblank(int c);
-
-/* implementation of isblank. unsigned char is the argument */
-int
-isblank(int c)
-{
- return (c==' ' || c=='\t');
-}
diff --git a/external/unbound/compat/malloc.c b/external/unbound/compat/malloc.c
deleted file mode 100644
index 559aa100d..000000000
--- a/external/unbound/compat/malloc.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Just a replacement, if the original malloc is not
- GNU-compliant. See autoconf documentation. */
-
-#include "config.h"
-#undef malloc
-#include <sys/types.h>
-
-void *malloc ();
-
-/* Allocate an N-byte block of memory from the heap.
- If N is zero, allocate a 1-byte block. */
-
-void *
-rpl_malloc_unbound (size_t n)
-{
- if (n == 0)
- n = 1;
- return malloc (n);
-}
diff --git a/external/unbound/compat/memcmp.c b/external/unbound/compat/memcmp.c
deleted file mode 100644
index 9446276f4..000000000
--- a/external/unbound/compat/memcmp.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * memcmp.c: memcmp compat implementation.
- *
- * Copyright (c) 2010, NLnet Labs. All rights reserved.
- *
- * See LICENSE for the license.
-*/
-
-#include <config.h>
-
-int memcmp(const void *x, const void *y, size_t n);
-
-int memcmp(const void *x, const void *y, size_t n)
-{
- const uint8_t* x8 = (const uint8_t*)x;
- const uint8_t* y8 = (const uint8_t*)y;
- size_t i;
- for(i=0; i<n; i++) {
- if(x8[i] < y8[i])
- return -1;
- else if(x8[i] > y8[i])
- return 1;
- }
- return 0;
-}
diff --git a/external/unbound/compat/memcmp.h b/external/unbound/compat/memcmp.h
deleted file mode 100644
index c1d195ccf..000000000
--- a/external/unbound/compat/memcmp.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * memcmp.h: undef memcmp for compat.
- *
- * Copyright (c) 2012, NLnet Labs. All rights reserved.
- *
- * See LICENSE for the license.
-*/
-#ifndef COMPAT_MEMCMP_H
-#define COMPAT_MEMCMP_H
-
-#ifdef memcmp
-/* undef here otherwise autoheader messes it up in config.h */
-# undef memcmp
-#endif
-
-#endif /* COMPAT_MEMCMP_H */
diff --git a/external/unbound/compat/memmove.c b/external/unbound/compat/memmove.c
deleted file mode 100644
index fe319bb49..000000000
--- a/external/unbound/compat/memmove.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * memmove.c: memmove compat implementation.
- *
- * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
- *
- * See LICENSE for the license.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-
-void *memmove(void *dest, const void *src, size_t n);
-
-void *memmove(void *dest, const void *src, size_t n)
-{
- uint8_t* from = (uint8_t*) src;
- uint8_t* to = (uint8_t*) dest;
-
- if (from == to || n == 0)
- return dest;
- if (to > from && to-from < (int)n) {
- /* to overlaps with from */
- /* <from......> */
- /* <to........> */
- /* copy in reverse, to avoid overwriting from */
- int i;
- for(i=n-1; i>=0; i--)
- to[i] = from[i];
- return dest;
- }
- if (from > to && from-to < (int)n) {
- /* to overlaps with from */
- /* <from......> */
- /* <to........> */
- /* copy forwards, to avoid overwriting from */
- size_t i;
- for(i=0; i<n; i++)
- to[i] = from[i];
- return dest;
- }
- memcpy(dest, src, n);
- return dest;
-}
diff --git a/external/unbound/compat/reallocarray.c b/external/unbound/compat/reallocarray.c
deleted file mode 100644
index c969bd067..000000000
--- a/external/unbound/compat/reallocarray.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $OpenBSD: reallocarray.c,v 1.1 2014/05/08 21:43:49 deraadt Exp $ */
-/*
- * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
- *
- * 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.
- */
-
-#include "config.h"
-#include <sys/types.h>
-#include <errno.h>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#include <limits.h>
-#include <stdlib.h>
-
-/*
- * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
- * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
- */
-#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
-
-void *
-reallocarray(void *optr, size_t nmemb, size_t size)
-{
- if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
- nmemb > 0 && SIZE_MAX / nmemb < size) {
- errno = ENOMEM;
- return NULL;
- }
- return realloc(optr, size * nmemb);
-}
diff --git a/external/unbound/compat/sha512.c b/external/unbound/compat/sha512.c
deleted file mode 100644
index 744b7ac7b..000000000
--- a/external/unbound/compat/sha512.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * FILE: sha2.c
- * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/
- *
- * Copyright (c) 2000-2001, Aaron D. Gifford
- * All rights reserved.
- *
- * Modified by Jelte Jansen to fit in ldns, and not clash with any
- * system-defined SHA code.
- * Changes:
- * - Renamed (external) functions and constants to fit ldns style
- * - Removed _End and _Data functions
- * - Added ldns_shaX(data, len, digest) convenience functions
- * - Removed prototypes of _Transform functions and made those static
- * Modified by Wouter, and trimmed, to provide SHA512 for getentropy_fallback.
- *
- * 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.
- * 3. Neither the name of the copyright holder nor the names of contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``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 OR CONTRIBUTOR(S) 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.
- *
- * $Id: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
- */
-#include "config.h"
-
-#include <string.h> /* memcpy()/memset() or bcopy()/bzero() */
-#include <assert.h> /* assert() */
-
-/* do we have sha512 header defs */
-#ifndef SHA512_DIGEST_LENGTH
-#define SHA512_BLOCK_LENGTH 128
-#define SHA512_DIGEST_LENGTH 64
-#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
-typedef struct _SHA512_CTX {
- uint64_t state[8];
- uint64_t bitcount[2];
- uint8_t buffer[SHA512_BLOCK_LENGTH];
-} SHA512_CTX;
-#endif /* do we have sha512 header defs */
-
-void SHA512_Init(SHA512_CTX*);
-void SHA512_Update(SHA512_CTX*, void*, size_t);
-void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
-unsigned char *SHA512(void *data, unsigned int data_len, unsigned char *digest);
-
-
-/*** SHA-256/384/512 Machine Architecture Definitions *****************/
-/*
- * BYTE_ORDER NOTE:
- *
- * Please make sure that your system defines BYTE_ORDER. If your
- * architecture is little-endian, make sure it also defines
- * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
- * equivalent.
- *
- * If your system does not define the above, then you can do so by
- * hand like this:
- *
- * #define LITTLE_ENDIAN 1234
- * #define BIG_ENDIAN 4321
- *
- * And for little-endian machines, add:
- *
- * #define BYTE_ORDER LITTLE_ENDIAN
- *
- * Or for big-endian machines:
- *
- * #define BYTE_ORDER BIG_ENDIAN
- *
- * The FreeBSD machine this was written on defines BYTE_ORDER
- * appropriately by including <sys/types.h> (which in turn includes
- * <machine/endian.h> where the appropriate definitions are actually
- * made).
- */
-#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
-#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
-#endif
-
-typedef uint8_t sha2_byte; /* Exactly 1 byte */
-typedef uint32_t sha2_word32; /* Exactly 4 bytes */
-#ifdef S_SPLINT_S
-typedef unsigned long long sha2_word64; /* lint 8 bytes */
-#else
-typedef uint64_t sha2_word64; /* Exactly 8 bytes */
-#endif
-
-/*** SHA-256/384/512 Various Length Definitions ***********************/
-#define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
-
-
-/*** ENDIAN REVERSAL MACROS *******************************************/
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define REVERSE32(w,x) { \
- sha2_word32 tmp = (w); \
- tmp = (tmp >> 16) | (tmp << 16); \
- (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
-}
-#ifndef S_SPLINT_S
-#define REVERSE64(w,x) { \
- sha2_word64 tmp = (w); \
- tmp = (tmp >> 32) | (tmp << 32); \
- tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
- ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
- (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
- ((tmp & 0x0000ffff0000ffffULL) << 16); \
-}
-#else /* splint */
-#define REVERSE64(w,x) /* splint */
-#endif /* splint */
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
-
-/*
- * Macro for incrementally adding the unsigned 64-bit integer n to the
- * unsigned 128-bit integer (represented using a two-element array of
- * 64-bit words):
- */
-#define ADDINC128(w,n) { \
- (w)[0] += (sha2_word64)(n); \
- if ((w)[0] < (n)) { \
- (w)[1]++; \
- } \
-}
-#ifdef S_SPLINT_S
-#undef ADDINC128
-#define ADDINC128(w,n) /* splint */
-#endif
-
-/*
- * Macros for copying blocks of memory and for zeroing out ranges
- * of memory. Using these macros makes it easy to switch from
- * using memset()/memcpy() and using bzero()/bcopy().
- *
- * Please define either SHA2_USE_MEMSET_MEMCPY or define
- * SHA2_USE_BZERO_BCOPY depending on which function set you
- * choose to use:
- */
-#if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY)
-/* Default to memset()/memcpy() if no option is specified */
-#define SHA2_USE_MEMSET_MEMCPY 1
-#endif
-#if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY)
-/* Abort with an error if BOTH options are defined */
-#error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both!
-#endif
-
-#ifdef SHA2_USE_MEMSET_MEMCPY
-#define MEMSET_BZERO(p,l) memset((p), 0, (l))
-#define MEMCPY_BCOPY(d,s,l) memcpy((d), (s), (l))
-#endif
-#ifdef SHA2_USE_BZERO_BCOPY
-#define MEMSET_BZERO(p,l) bzero((p), (l))
-#define MEMCPY_BCOPY(d,s,l) bcopy((s), (d), (l))
-#endif
-
-
-/*** THE SIX LOGICAL FUNCTIONS ****************************************/
-/*
- * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
- *
- * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
- * S is a ROTATION) because the SHA-256/384/512 description document
- * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
- * same "backwards" definition.
- */
-/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
-#define R(b,x) ((x) >> (b))
-/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
-#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
-
-/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
-#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
-#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
-
-/* Four of six logical functions used in SHA-384 and SHA-512: */
-#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
-#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
-#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
-#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
-
-/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
-/* Hash constant words K for SHA-384 and SHA-512: */
-static const sha2_word64 K512[80] = {
- 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
- 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
- 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
- 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
- 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
- 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
- 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
- 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
- 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
- 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
- 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
- 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
- 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
- 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
- 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
- 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
- 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
- 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
- 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
- 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
- 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
- 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
- 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
- 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
- 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
- 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
- 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
- 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
- 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
- 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
- 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
- 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
- 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
- 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
- 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
- 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
- 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
- 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
- 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
- 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
-};
-
-/* initial hash value H for SHA-512 */
-static const sha2_word64 sha512_initial_hash_value[8] = {
- 0x6a09e667f3bcc908ULL,
- 0xbb67ae8584caa73bULL,
- 0x3c6ef372fe94f82bULL,
- 0xa54ff53a5f1d36f1ULL,
- 0x510e527fade682d1ULL,
- 0x9b05688c2b3e6c1fULL,
- 0x1f83d9abfb41bd6bULL,
- 0x5be0cd19137e2179ULL
-};
-
-typedef union _ldns_sha2_buffer_union {
- uint8_t* theChars;
- uint64_t* theLongs;
-} ldns_sha2_buffer_union;
-
-/*** SHA-512: *********************************************************/
-void SHA512_Init(SHA512_CTX* context) {
- if (context == (SHA512_CTX*)0) {
- return;
- }
- MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH);
- MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH);
- context->bitcount[0] = context->bitcount[1] = 0;
-}
-
-static void SHA512_Transform(SHA512_CTX* context,
- const sha2_word64* data) {
- sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
- sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer;
- int j;
-
- /* initialize registers with the prev. intermediate value */
- a = context->state[0];
- b = context->state[1];
- c = context->state[2];
- d = context->state[3];
- e = context->state[4];
- f = context->state[5];
- g = context->state[6];
- h = context->state[7];
-
- j = 0;
- do {
-#if BYTE_ORDER == LITTLE_ENDIAN
- /* Convert TO host byte order */
- REVERSE64(*data++, W512[j]);
- /* Apply the SHA-512 compression function to update a..h */
- T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
-#else /* BYTE_ORDER == LITTLE_ENDIAN */
- /* Apply the SHA-512 compression function to update a..h with copy */
- T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
- T2 = Sigma0_512(a) + Maj(a, b, c);
- h = g;
- g = f;
- f = e;
- e = d + T1;
- d = c;
- c = b;
- b = a;
- a = T1 + T2;
-
- j++;
- } while (j < 16);
-
- do {
- /* Part of the message block expansion: */
- s0 = W512[(j+1)&0x0f];
- s0 = sigma0_512(s0);
- s1 = W512[(j+14)&0x0f];
- s1 = sigma1_512(s1);
-
- /* Apply the SHA-512 compression function to update a..h */
- T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
- (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
- T2 = Sigma0_512(a) + Maj(a, b, c);
- h = g;
- g = f;
- f = e;
- e = d + T1;
- d = c;
- c = b;
- b = a;
- a = T1 + T2;
-
- j++;
- } while (j < 80);
-
- /* Compute the current intermediate hash value */
- context->state[0] += a;
- context->state[1] += b;
- context->state[2] += c;
- context->state[3] += d;
- context->state[4] += e;
- context->state[5] += f;
- context->state[6] += g;
- context->state[7] += h;
-
- /* Clean up */
- a = b = c = d = e = f = g = h = T1 = T2 = 0;
-}
-
-void SHA512_Update(SHA512_CTX* context, void *datain, size_t len) {
- size_t freespace, usedspace;
- const sha2_byte* data = (const sha2_byte*)datain;
-
- if (len == 0) {
- /* Calling with no data is valid - we do nothing */
- return;
- }
-
- /* Sanity check: */
- assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0);
-
- usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
- if (usedspace > 0) {
- /* Calculate how much free space is available in the buffer */
- freespace = SHA512_BLOCK_LENGTH - usedspace;
-
- if (len >= freespace) {
- /* Fill the buffer completely and process it */
- MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace);
- ADDINC128(context->bitcount, freespace << 3);
- len -= freespace;
- data += freespace;
- SHA512_Transform(context, (sha2_word64*)context->buffer);
- } else {
- /* The buffer is not yet full */
- MEMCPY_BCOPY(&context->buffer[usedspace], data, len);
- ADDINC128(context->bitcount, len << 3);
- /* Clean up: */
- usedspace = freespace = 0;
- return;
- }
- }
- while (len >= SHA512_BLOCK_LENGTH) {
- /* Process as many complete blocks as we can */
- SHA512_Transform(context, (sha2_word64*)data);
- ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
- len -= SHA512_BLOCK_LENGTH;
- data += SHA512_BLOCK_LENGTH;
- }
- if (len > 0) {
- /* There's left-overs, so save 'em */
- MEMCPY_BCOPY(context->buffer, data, len);
- ADDINC128(context->bitcount, len << 3);
- }
- /* Clean up: */
- usedspace = freespace = 0;
-}
-
-static void SHA512_Last(SHA512_CTX* context) {
- size_t usedspace;
- ldns_sha2_buffer_union cast_var;
-
- usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
-#if BYTE_ORDER == LITTLE_ENDIAN
- /* Convert FROM host byte order */
- REVERSE64(context->bitcount[0],context->bitcount[0]);
- REVERSE64(context->bitcount[1],context->bitcount[1]);
-#endif
- if (usedspace > 0) {
- /* Begin padding with a 1 bit: */
- context->buffer[usedspace++] = 0x80;
-
- if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
- /* Set-up for the last transform: */
- MEMSET_BZERO(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
- } else {
- if (usedspace < SHA512_BLOCK_LENGTH) {
- MEMSET_BZERO(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
- }
- /* Do second-to-last transform: */
- SHA512_Transform(context, (sha2_word64*)context->buffer);
-
- /* And set-up for the last transform: */
- MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH - 2);
- }
- } else {
- /* Prepare for final transform: */
- MEMSET_BZERO(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
-
- /* Begin padding with a 1 bit: */
- *context->buffer = 0x80;
- }
- /* Store the length of input data (in bits): */
- cast_var.theChars = context->buffer;
- cast_var.theLongs[SHA512_SHORT_BLOCK_LENGTH / 8] = context->bitcount[1];
- cast_var.theLongs[SHA512_SHORT_BLOCK_LENGTH / 8 + 1] = context->bitcount[0];
-
- /* final transform: */
- SHA512_Transform(context, (sha2_word64*)context->buffer);
-}
-
-void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
- sha2_word64 *d = (sha2_word64*)digest;
-
- /* Sanity check: */
- assert(context != (SHA512_CTX*)0);
-
- /* If no digest buffer is passed, we don't bother doing this: */
- if (digest != (sha2_byte*)0) {
- SHA512_Last(context);
-
- /* Save the hash data for output: */
-#if BYTE_ORDER == LITTLE_ENDIAN
- {
- /* Convert TO host byte order */
- int j;
- for (j = 0; j < 8; j++) {
- REVERSE64(context->state[j],context->state[j]);
- *d++ = context->state[j];
- }
- }
-#else
- MEMCPY_BCOPY(d, context->state, SHA512_DIGEST_LENGTH);
-#endif
- }
-
- /* Zero out state data */
- MEMSET_BZERO(context, sizeof(SHA512_CTX));
-}
-
-unsigned char *
-SHA512(void *data, unsigned int data_len, unsigned char *digest)
-{
- SHA512_CTX ctx;
- SHA512_Init(&ctx);
- SHA512_Update(&ctx, data, data_len);
- SHA512_Final(digest, &ctx);
- return digest;
-}
diff --git a/external/unbound/compat/snprintf.c b/external/unbound/compat/snprintf.c
deleted file mode 100644
index 97cd7061f..000000000
--- a/external/unbound/compat/snprintf.c
+++ /dev/null
@@ -1,1037 +0,0 @@
-/* snprintf - compatibility implementation of snprintf, vsnprintf
- *
- * Copyright (c) 2013, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 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.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 COPYRIGHT
- * HOLDER OR CONTRIBUTORS 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.
- */
-
-#include "config.h"
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <errno.h>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#include <limits.h>
-
-/* for test */
-/* #define SNPRINTF_TEST 1 */
-#ifdef SNPRINTF_TEST
-#define snprintf my_snprintf
-#define vsnprintf my_vsnprintf
-#endif /* SNPRINTF_TEST */
-
-int snprintf(char* str, size_t size, const char* format, ...);
-int vsnprintf(char* str, size_t size, const char* format, va_list arg);
-
-/**
- * Very portable snprintf implementation, limited in functionality,
- * esp. for %[capital] %[nonportable] and so on. Reduced float functionality,
- * mostly in formatting and range (e+-16), for %f and %g.
- *
- * %s, %d, %u, %i, %x, %c, %n and %% are fully supported.
- * This includes width, precision, flags 0- +, and *(arg for wid,prec).
- * %f, %g, %m, %p have reduced support, support for wid,prec,flags,*, but
- * less floating point range, no %e formatting for %g.
- */
-int snprintf(char* str, size_t size, const char* format, ...)
-{
- int r;
- va_list args;
- va_start(args, format);
- r = vsnprintf(str, size, format, args);
- va_end(args);
- return r;
-}
-
-/** add padding to string */
-static void
-print_pad(char** at, size_t* left, int* ret, char p, int num)
-{
- while(num--) {
- if(*left > 1) {
- *(*at)++ = p;
- (*left)--;
- }
- (*ret)++;
- }
-}
-
-/** get negative symbol, 0 if none */
-static char
-get_negsign(int negative, int plus, int space)
-{
- if(negative)
- return '-';
- if(plus)
- return '+';
- if(space)
- return ' ';
- return 0;
-}
-
-#define PRINT_DEC_BUFSZ 32 /* 20 is enough for 64 bit decimals */
-/** print decimal into buffer, returns length */
-static int
-print_dec(char* buf, int max, unsigned int value)
-{
- int i = 0;
- if(value == 0) {
- if(max > 0) {
- buf[0] = '0';
- i = 1;
- }
- } else while(value && i < max) {
- buf[i++] = '0' + value % 10;
- value /= 10;
- }
- return i;
-}
-
-/** print long decimal into buffer, returns length */
-static int
-print_dec_l(char* buf, int max, unsigned long value)
-{
- int i = 0;
- if(value == 0) {
- if(max > 0) {
- buf[0] = '0';
- i = 1;
- }
- } else while(value && i < max) {
- buf[i++] = '0' + value % 10;
- value /= 10;
- }
- return i;
-}
-
-/** print long decimal into buffer, returns length */
-static int
-print_dec_ll(char* buf, int max, unsigned long long value)
-{
- int i = 0;
- if(value == 0) {
- if(max > 0) {
- buf[0] = '0';
- i = 1;
- }
- } else while(value && i < max) {
- buf[i++] = '0' + value % 10;
- value /= 10;
- }
- return i;
-}
-
-/** print hex into buffer, returns length */
-static int
-print_hex(char* buf, int max, unsigned int value)
-{
- const char* h = "0123456789abcdef";
- int i = 0;
- if(value == 0) {
- if(max > 0) {
- buf[0] = '0';
- i = 1;
- }
- } else while(value && i < max) {
- buf[i++] = h[value & 0x0f];
- value >>= 4;
- }
- return i;
-}
-
-/** print long hex into buffer, returns length */
-static int
-print_hex_l(char* buf, int max, unsigned long value)
-{
- const char* h = "0123456789abcdef";
- int i = 0;
- if(value == 0) {
- if(max > 0) {
- buf[0] = '0';
- i = 1;
- }
- } else while(value && i < max) {
- buf[i++] = h[value & 0x0f];
- value >>= 4;
- }
- return i;
-}
-
-/** print long long hex into buffer, returns length */
-static int
-print_hex_ll(char* buf, int max, unsigned long long value)
-{
- const char* h = "0123456789abcdef";
- int i = 0;
- if(value == 0) {
- if(max > 0) {
- buf[0] = '0';
- i = 1;
- }
- } else while(value && i < max) {
- buf[i++] = h[value & 0x0f];
- value >>= 4;
- }
- return i;
-}
-
-/** copy string into result, reversed */
-static void
-spool_str_rev(char** at, size_t* left, int* ret, const char* buf, int len)
-{
- int i = len;
- while(i) {
- if(*left > 1) {
- *(*at)++ = buf[--i];
- (*left)--;
- } else --i;
- (*ret)++;
- }
-}
-
-/** copy string into result */
-static void
-spool_str(char** at, size_t* left, int* ret, const char* buf, int len)
-{
- int i;
- for(i=0; i<len; i++) {
- if(*left > 1) {
- *(*at)++ = buf[i];
- (*left)--;
- }
- (*ret)++;
- }
-}
-
-/** print number formatted */
-static void
-print_num(char** at, size_t* left, int* ret, int minw, int precision,
- int prgiven, int zeropad, int minus, int plus, int space,
- int zero, int negative, char* buf, int len)
-{
- int w = len; /* excludes minus sign */
- char s = get_negsign(negative, plus, space);
- if(minus) {
- /* left adjust the number into the field, space padding */
- /* calc numw = [sign][zeroes][number] */
- int numw = w;
- if(precision == 0 && zero) numw = 0;
- if(numw < precision) numw = precision;
- if(s) numw++;
-
- /* sign */
- if(s) print_pad(at, left, ret, s, 1);
-
- /* number */
- if(precision == 0 && zero) {
- /* "" for the number */
- } else {
- if(w < precision)
- print_pad(at, left, ret, '0', precision - w);
- spool_str_rev(at, left, ret, buf, len);
- }
- /* spaces */
- if(numw < minw)
- print_pad(at, left, ret, ' ', minw - numw);
- } else {
- /* pad on the left of the number */
- /* calculate numw has width of [sign][zeroes][number] */
- int numw = w;
- if(precision == 0 && zero) numw = 0;
- if(numw < precision) numw = precision;
- if(!prgiven && zeropad && numw < minw) numw = minw;
- else if(s) numw++;
-
- /* pad with spaces */
- if(numw < minw)
- print_pad(at, left, ret, ' ', minw - numw);
- /* print sign (and one less zeropad if so) */
- if(s) {
- print_pad(at, left, ret, s, 1);
- numw--;
- }
- /* pad with zeroes */
- if(w < numw)
- print_pad(at, left, ret, '0', numw - w);
- if(precision == 0 && zero)
- return;
- /* print the characters for the value */
- spool_str_rev(at, left, ret, buf, len);
- }
-}
-
-/** print %d and %i */
-static void
-print_num_d(char** at, size_t* left, int* ret, int value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = (value < 0);
- int zero = (value == 0);
- int len = print_dec(buf, (int)sizeof(buf),
- (unsigned int)(negative?-value:value));
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %ld and %li */
-static void
-print_num_ld(char** at, size_t* left, int* ret, long value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = (value < 0);
- int zero = (value == 0);
- int len = print_dec_l(buf, (int)sizeof(buf),
- (unsigned long)(negative?-value:value));
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %lld and %lli */
-static void
-print_num_lld(char** at, size_t* left, int* ret, long long value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = (value < 0);
- int zero = (value == 0);
- int len = print_dec_ll(buf, (int)sizeof(buf),
- (unsigned long long)(negative?-value:value));
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %u */
-static void
-print_num_u(char** at, size_t* left, int* ret, unsigned int value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
- int len = print_dec(buf, (int)sizeof(buf), value);
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %lu */
-static void
-print_num_lu(char** at, size_t* left, int* ret, unsigned long value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
- int len = print_dec_l(buf, (int)sizeof(buf), value);
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %llu */
-static void
-print_num_llu(char** at, size_t* left, int* ret, unsigned long long value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
- int len = print_dec_ll(buf, (int)sizeof(buf), value);
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %x */
-static void
-print_num_x(char** at, size_t* left, int* ret, unsigned int value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
- int len = print_hex(buf, (int)sizeof(buf), value);
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %lx */
-static void
-print_num_lx(char** at, size_t* left, int* ret, unsigned long value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
- int len = print_hex_l(buf, (int)sizeof(buf), value);
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %llx */
-static void
-print_num_llx(char** at, size_t* left, int* ret, unsigned long long value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
- int len = print_hex_ll(buf, (int)sizeof(buf), value);
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/** print %llp */
-static void
-print_num_llp(char** at, size_t* left, int* ret, void* value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_DEC_BUFSZ];
- int negative = 0;
- int zero = (value == 0);
-#if defined(SIZE_MAX) && defined(UINT32_MAX) && (UINT32_MAX == SIZE_MAX || INT32_MAX == SIZE_MAX)
- /* avoid warning about upcast on 32bit systems */
- unsigned long long llvalue = (unsigned long)value;
-#else
- unsigned long long llvalue = (unsigned long long)value;
-#endif
- int len = print_hex_ll(buf, (int)sizeof(buf), llvalue);
- if(zero) {
- buf[0]=')';
- buf[1]='l';
- buf[2]='i';
- buf[3]='n';
- buf[4]='(';
- len = 5;
- } else {
- /* put '0x' in front of the (reversed) buffer result */
- if(len < PRINT_DEC_BUFSZ)
- buf[len++] = 'x';
- if(len < PRINT_DEC_BUFSZ)
- buf[len++] = '0';
- }
- print_num(at, left, ret, minw, precision, prgiven, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-#define PRINT_FLOAT_BUFSZ 64 /* xx.yy with 20.20 about the max */
-/** spool remainder after the decimal point to buffer, in reverse */
-static int
-print_remainder(char* buf, int max, double r, int prec)
-{
- unsigned long long cap = 1;
- unsigned long long value;
- int len, i;
- if(prec > 19) prec = 19; /* max we can do */
- if(max < prec) return 0;
- for(i=0; i<prec; i++) {
- cap *= 10;
- }
- r *= (double)cap;
- value = (unsigned long long)r;
- /* see if we need to round up */
- if(((unsigned long long)((r - (double)value)*10.0)) >= 5) {
- value++;
- /* that might carry to numbers before the comma, if so,
- * just ignore that rounding. failure because 64bitprintout */
- if(value >= cap)
- value = cap-1;
- }
- len = print_dec_ll(buf, max, value);
- while(len < prec) { /* pad with zeroes, e.g. if 0.0012 */
- buf[len++] = '0';
- }
- if(len < max)
- buf[len++] = '.';
- return len;
-}
-
-/** spool floating point to buffer */
-static int
-print_float(char* buf, int max, double value, int prec)
-{
- /* as xxx.xxx if prec==0, no '.', with prec decimals after . */
- /* no conversion for NAN and INF, because we do not want to require
- linking with -lm. */
- /* Thus, the conversions use 64bit integers to convert the numbers,
- * which makes 19 digits before and after the decimal point the max */
- unsigned long long whole = (unsigned long long)value;
- double remain = value - (double)whole;
- int len = 0;
- if(prec != 0)
- len = print_remainder(buf, max, remain, prec);
- len += print_dec_ll(buf+len, max-len, whole);
- return len;
-}
-
-/** print %f */
-static void
-print_num_f(char** at, size_t* left, int* ret, double value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_FLOAT_BUFSZ];
- int negative = (value < 0);
- int zero = 0;
- int len;
- if(!prgiven) precision = 6;
- len = print_float(buf, (int)sizeof(buf), negative?-value:value,
- precision);
- print_num(at, left, ret, minw, 1, 0, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-/* rudimentary %g support */
-static int
-print_float_g(char* buf, int max, double value, int prec)
-{
- unsigned long long whole = (unsigned long long)value;
- double remain = value - (double)whole;
- int before = 0;
- int len = 0;
-
- /* number of digits before the decimal point */
- while(whole > 0) {
- before++;
- whole /= 10;
- }
- whole = (unsigned long long)value;
-
- if(prec > before && remain != 0.0) {
- /* see if the last decimals are zero, if so, skip them */
- len = print_remainder(buf, max, remain, prec-before);
- while(len > 0 && buf[0]=='0') {
- memmove(buf, buf+1, --len);
- }
- }
- len += print_dec_ll(buf+len, max-len, whole);
- return len;
-}
-
-
-/** print %g */
-static void
-print_num_g(char** at, size_t* left, int* ret, double value,
- int minw, int precision, int prgiven, int zeropad, int minus,
- int plus, int space)
-{
- char buf[PRINT_FLOAT_BUFSZ];
- int negative = (value < 0);
- int zero = 0;
- int len;
- if(!prgiven) precision = 6;
- if(precision == 0) precision = 1;
- len = print_float_g(buf, (int)sizeof(buf), negative?-value:value,
- precision);
- print_num(at, left, ret, minw, 1, 0, zeropad, minus,
- plus, space, zero, negative, buf, len);
-}
-
-
-/** strnlen (compat implementation) */
-static int
-my_strnlen(const char* s, int max)
-{
- int i;
- for(i=0; i<max; i++)
- if(s[i]==0)
- return i;
- return max;
-}
-
-/** print %s */
-static void
-print_str(char** at, size_t* left, int* ret, char* s,
- int minw, int precision, int prgiven, int minus)
-{
- int w;
- /* with prec: no more than x characters from this string, stop at 0 */
- if(prgiven)
- w = my_strnlen(s, precision);
- else w = (int)strlen(s); /* up to the nul */
- if(w < minw && !minus)
- print_pad(at, left, ret, ' ', minw - w);
- spool_str(at, left, ret, s, w);
- if(w < minw && minus)
- print_pad(at, left, ret, ' ', minw - w);
-}
-
-/** print %c */
-static void
-print_char(char** at, size_t* left, int* ret, int c,
- int minw, int minus)
-{
- if(1 < minw && !minus)
- print_pad(at, left, ret, ' ', minw - 1);
- print_pad(at, left, ret, c, 1);
- if(1 < minw && minus)
- print_pad(at, left, ret, ' ', minw - 1);
-}
-
-
-/**
- * Print to string.
- * str: string buffer for result. result will be null terminated.
- * size: size of the buffer. null is put inside buffer.
- * format: printf format string.
- * arg: '...' arguments to print.
- * returns number of characters. a null is printed after this.
- * return number of bytes that would have been written
- * if the buffer had been large enough.
- *
- * supported format specifiers:
- * %s, %u, %d, %x, %i, %f, %g, %c, %p, %n.
- * length: l, ll (for d, u, x).
- * precision: 6.6d (for d, u, x)
- * %f, %g precisions, 0.3f
- * %20s, '.*s'
- * and %%.
- */
-int vsnprintf(char* str, size_t size, const char* format, va_list arg)
-{
- char* at = str;
- size_t left = size;
- int ret = 0;
- const char* fmt = format;
- int conv, minw, precision, prgiven, zeropad, minus, plus, space, length;
- while(*fmt) {
- /* copy string before % */
- while(*fmt && *fmt!='%') {
- if(left > 1) {
- *at++ = *fmt++;
- left--;
- } else fmt++;
- ret++;
- }
-
- /* see if we are at end */
- if(!*fmt) break;
-
- /* fetch next argument % designation from format string */
- fmt++; /* skip the '%' */
-
- /********************************/
- /* get the argument designation */
- /********************************/
- /* we must do this vararg stuff inside this function for
- * portability. Hence, get_designation, and print_designation
- * are not their own functions. */
-
- /* printout designation:
- * conversion specifier: x, d, u, s, c, n, m, p
- * flags: # not supported
- * 0 zeropad (on the left)
- * - left adjust (right by default)
- * ' ' printspace for positive number (in - position).
- * + alwayssign
- * fieldwidth: [1-9][0-9]* minimum field width.
- * if this is * then type int next argument specifies the minwidth.
- * if this is negative, the - flag is set (with positive width).
- * precision: period[digits]*, %.2x.
- * if this is * then type int next argument specifies the precision.
- * just '.' or negative value means precision=0.
- * this is mindigits to print for d, i, u, x
- * this is aftercomma digits for f
- * this is max number significant digits for g
- * maxnumber characters to be printed for s
- * length: 0-none (int), 1-l (long), 2-ll (long long)
- * notsupported: hh (char), h (short), L (long double), q, j, z, t
- * Does not support %m$ and *m$ argument designation as array indices.
- * Does not support %#x
- *
- */
- minw = 0;
- precision = 1;
- prgiven = 0;
- zeropad = 0;
- minus = 0;
- plus = 0;
- space = 0;
- length = 0;
-
- /* get flags in any order */
- for(;;) {
- if(*fmt == '0')
- zeropad = 1;
- else if(*fmt == '-')
- minus = 1;
- else if(*fmt == '+')
- plus = 1;
- else if(*fmt == ' ')
- space = 1;
- else break;
- fmt++;
- }
-
- /* field width */
- if(*fmt == '*') {
- fmt++; /* skip char */
- minw = va_arg(arg, int);
- if(minw < 0) {
- minus = 1;
- minw = -minw;
- }
- } else while(*fmt >= '0' && *fmt <= '9') {
- minw = minw*10 + (*fmt++)-'0';
- }
-
- /* precision */
- if(*fmt == '.') {
- fmt++; /* skip period */
- prgiven = 1;
- precision = 0;
- if(*fmt == '*') {
- fmt++; /* skip char */
- precision = va_arg(arg, int);
- if(precision < 0)
- precision = 0;
- } else while(*fmt >= '0' && *fmt <= '9') {
- precision = precision*10 + (*fmt++)-'0';
- }
- }
-
- /* length */
- if(*fmt == 'l') {
- fmt++; /* skip char */
- length = 1;
- if(*fmt == 'l') {
- fmt++; /* skip char */
- length = 2;
- }
- }
-
- /* get the conversion */
- if(!*fmt) conv = 0;
- else conv = *fmt++;
-
- /***********************************/
- /* print that argument designation */
- /***********************************/
- switch(conv) {
- case 'i':
- case 'd':
- if(length == 0)
- print_num_d(&at, &left, &ret, va_arg(arg, int),
- minw, precision, prgiven, zeropad, minus, plus, space);
- else if(length == 1)
- print_num_ld(&at, &left, &ret, va_arg(arg, long),
- minw, precision, prgiven, zeropad, minus, plus, space);
- else if(length == 2)
- print_num_lld(&at, &left, &ret,
- va_arg(arg, long long),
- minw, precision, prgiven, zeropad, minus, plus, space);
- break;
- case 'u':
- if(length == 0)
- print_num_u(&at, &left, &ret,
- va_arg(arg, unsigned int),
- minw, precision, prgiven, zeropad, minus, plus, space);
- else if(length == 1)
- print_num_lu(&at, &left, &ret,
- va_arg(arg, unsigned long),
- minw, precision, prgiven, zeropad, minus, plus, space);
- else if(length == 2)
- print_num_llu(&at, &left, &ret,
- va_arg(arg, unsigned long long),
- minw, precision, prgiven, zeropad, minus, plus, space);
- break;
- case 'x':
- if(length == 0)
- print_num_x(&at, &left, &ret,
- va_arg(arg, unsigned int),
- minw, precision, prgiven, zeropad, minus, plus, space);
- else if(length == 1)
- print_num_lx(&at, &left, &ret,
- va_arg(arg, unsigned long),
- minw, precision, prgiven, zeropad, minus, plus, space);
- else if(length == 2)
- print_num_llx(&at, &left, &ret,
- va_arg(arg, unsigned long long),
- minw, precision, prgiven, zeropad, minus, plus, space);
- break;
- case 's':
- print_str(&at, &left, &ret, va_arg(arg, char*),
- minw, precision, prgiven, minus);
- break;
- case 'c':
- print_char(&at, &left, &ret, va_arg(arg, int),
- minw, minus);
- break;
- case 'n':
- *va_arg(arg, int*) = ret;
- break;
- case 'm':
- print_str(&at, &left, &ret, strerror(errno),
- minw, precision, prgiven, minus);
- break;
- case 'p':
- print_num_llp(&at, &left, &ret, va_arg(arg, void*),
- minw, precision, prgiven, zeropad, minus, plus, space);
- break;
- case '%':
- print_pad(&at, &left, &ret, '%', 1);
- break;
- case 'f':
- print_num_f(&at, &left, &ret, va_arg(arg, double),
- minw, precision, prgiven, zeropad, minus, plus, space);
- break;
- case 'g':
- print_num_g(&at, &left, &ret, va_arg(arg, double),
- minw, precision, prgiven, zeropad, minus, plus, space);
- break;
- /* unknown */
- default:
- case 0: break;
- }
- }
-
- /* zero terminate */
- if(left > 0)
- *at = 0;
- return ret;
-}
-
-#ifdef SNPRINTF_TEST
-
-/** do tests */
-#undef snprintf
-#define DOTEST(bufsz, result, retval, ...) do { \
- char buf[bufsz]; \
- printf("now test %s\n", #__VA_ARGS__); \
- int r=my_snprintf(buf, sizeof(buf), __VA_ARGS__); \
- if(r != retval || strcmp(buf, result) != 0) { \
- printf("error test(%s) was \"%s\":%d\n", \
- ""#bufsz", "#result", "#retval", "#__VA_ARGS__, \
- buf, r); \
- exit(1); \
- } \
- r=snprintf(buf, sizeof(buf), __VA_ARGS__); \
- if(r != retval || strcmp(buf, result) != 0) { \
- printf("error test(%s) differs with system, \"%s\":%d\n", \
- ""#bufsz", "#result", "#retval", "#__VA_ARGS__, \
- buf, r); \
- exit(1); \
- } \
- printf("test(\"%s\":%d) passed\n", buf, r); \
- } while(0);
-
-/** test program */
-int main(void)
-{
- int x = 0;
-
- /* bufsize, expectedstring, expectedretval, snprintf arguments */
- DOTEST(1024, "hello", 5, "hello");
- DOTEST(1024, "h", 1, "h");
- /* warning from gcc for format string, but it does work
- * DOTEST(1024, "", 0, ""); */
-
- DOTEST(3, "he", 5, "hello");
- DOTEST(1, "", 7, "%d", 7823089);
-
- /* test positive numbers */
- DOTEST(1024, "0", 1, "%d", 0);
- DOTEST(1024, "1", 1, "%d", 1);
- DOTEST(1024, "9", 1, "%d", 9);
- DOTEST(1024, "15", 2, "%d", 15);
- DOTEST(1024, "ab15cd", 6, "ab%dcd", 15);
- DOTEST(1024, "167", 3, "%d", 167);
- DOTEST(1024, "7823089", 7, "%d", 7823089);
- DOTEST(1024, " 12", 3, "%3d", 12);
- DOTEST(1024, "012", 3, "%.3d", 12);
- DOTEST(1024, "012", 3, "%3.3d", 12);
- DOTEST(1024, "012", 3, "%03d", 12);
- DOTEST(1024, " 012", 4, "%4.3d", 12);
- DOTEST(1024, "", 0, "%.0d", 0);
-
- /* test negative numbers */
- DOTEST(1024, "-1", 2, "%d", -1);
- DOTEST(1024, "-12", 3, "%3d", -12);
- DOTEST(1024, " -2", 3, "%3d", -2);
- DOTEST(1024, "-012", 4, "%.3d", -12);
- DOTEST(1024, "-012", 4, "%3.3d", -12);
- DOTEST(1024, "-012", 4, "%4.3d", -12);
- DOTEST(1024, " -012", 5, "%5.3d", -12);
- DOTEST(1024, "-12", 3, "%03d", -12);
- DOTEST(1024, "-02", 3, "%03d", -2);
- DOTEST(1024, "-15", 3, "%d", -15);
- DOTEST(1024, "-7307", 5, "%d", -7307);
- DOTEST(1024, "-12 ", 5, "%-5d", -12);
- DOTEST(1024, "-00012", 6, "%-.5d", -12);
-
- /* test + and space flags */
- DOTEST(1024, "+12", 3, "%+d", 12);
- DOTEST(1024, " 12", 3, "% d", 12);
-
- /* test %u */
- DOTEST(1024, "12", 2, "%u", 12);
- DOTEST(1024, "0", 1, "%u", 0);
- DOTEST(1024, "4294967295", 10, "%u", 0xffffffff);
-
- /* test %x */
- DOTEST(1024, "0", 1, "%x", 0);
- DOTEST(1024, "c", 1, "%x", 12);
- DOTEST(1024, "12ab34cd", 8, "%x", 0x12ab34cd);
-
- /* test %llu, %lld */
- DOTEST(1024, "18446744073709551615", 20, "%llu",
- (long long)0xffffffffffffffff);
- DOTEST(1024, "-9223372036854775808", 20, "%lld",
- (long long)0x8000000000000000);
- DOTEST(1024, "9223372036854775808", 19, "%llu",
- (long long)0x8000000000000000);
-
- /* test %s */
- DOTEST(1024, "hello", 5, "%s", "hello");
- DOTEST(1024, " hello", 10, "%10s", "hello");
- DOTEST(1024, "hello ", 10, "%-10s", "hello");
- DOTEST(1024, "he", 2, "%.2s", "hello");
- DOTEST(1024, " he", 4, "%4.2s", "hello");
- DOTEST(1024, " h", 4, "%4.2s", "h");
-
- /* test %c */
- DOTEST(1024, "a", 1, "%c", 'a');
- /* warning from gcc for format string, but it does work
- DOTEST(1024, " a", 5, "%5c", 'a');
- DOTEST(1024, "a", 1, "%.0c", 'a'); */
-
- /* test %n */
- DOTEST(1024, "hello", 5, "hello%n", &x);
- if(x != 5) { printf("the %%n failed\n"); exit(1); }
-
- /* test %m */
- errno = 0;
- DOTEST(1024, "Success", 7, "%m");
-
- /* test %p */
- DOTEST(1024, "0x10", 4, "%p", (void*)0x10);
- DOTEST(1024, "(nil)", 5, "%p", (void*)0x0);
-
- /* test %% */
- DOTEST(1024, "%", 1, "%%");
-
- /* test %f */
- DOTEST(1024, "0.000000", 8, "%f", 0.0);
- DOTEST(1024, "0.00", 4, "%.2f", 0.0);
- /* differs, "-0.00" DOTEST(1024, "0.00", 4, "%.2f", -0.0); */
- DOTEST(1024, "234.00", 6, "%.2f", 234.005);
- DOTEST(1024, "8973497.1246", 12, "%.4f", 8973497.12456);
- DOTEST(1024, "-12.000000", 10, "%f", -12.0);
- DOTEST(1024, "6", 1, "%.0f", 6.0);
-
- DOTEST(1024, "6", 1, "%g", 6.0);
- DOTEST(1024, "6.1", 3, "%g", 6.1);
- DOTEST(1024, "6.15", 4, "%g", 6.15);
-
- /* These format strings are from the code of NSD, Unbound, ldns */
-
- DOTEST(1024, "abcdef", 6, "%s", "abcdef");
- DOTEST(1024, "005", 3, "%03u", 5);
- DOTEST(1024, "12345", 5, "%03u", 12345);
- DOTEST(1024, "5", 1, "%d", 5);
- DOTEST(1024, "(nil)", 5, "%p", NULL);
- DOTEST(1024, "12345", 5, "%ld", (long)12345);
- DOTEST(1024, "12345", 5, "%lu", (long)12345);
- DOTEST(1024, " 12345", 12, "%12u", (unsigned)12345);
- DOTEST(1024, "12345", 5, "%u", (unsigned)12345);
- DOTEST(1024, "12345", 5, "%llu", (unsigned long long)12345);
- DOTEST(1024, "12345", 5, "%x", 0x12345);
- DOTEST(1024, "12345", 5, "%llx", (long long)0x12345);
- DOTEST(1024, "012345", 6, "%6.6d", 12345);
- DOTEST(1024, "012345", 6, "%6.6u", 12345);
- DOTEST(1024, "1234.54", 7, "%g", 1234.54);
- DOTEST(1024, "123456789.54", 12, "%.12g", 123456789.54);
- DOTEST(1024, "3456789123456.54", 16, "%.16g", 3456789123456.54);
- /* %24g does not work with 24 digits, not enough accuracy,
- * the first 16 digits are correct */
- DOTEST(1024, "12345", 5, "%3.3d", 12345);
- DOTEST(1024, "000", 3, "%3.3d", 0);
- DOTEST(1024, "001", 3, "%3.3d", 1);
- DOTEST(1024, "012", 3, "%3.3d", 12);
- DOTEST(1024, "-012", 4, "%3.3d", -12);
- DOTEST(1024, "he", 2, "%.2s", "hello");
- DOTEST(1024, "helloworld", 10, "%s%s", "hello", "world");
- DOTEST(1024, "he", 2, "%.*s", 2, "hello");
- DOTEST(1024, " hello", 7, "%*s", 7, "hello");
- DOTEST(1024, "hello ", 7, "%*s", -7, "hello");
- DOTEST(1024, "0", 1, "%c", '0');
- DOTEST(1024, "A", 1, "%c", 'A');
- DOTEST(1024, "", 1, "%c", 0);
- DOTEST(1024, "\010", 1, "%c", 8);
- DOTEST(1024, "%", 1, "%%");
- DOTEST(1024, "0a", 2, "%02x", 0x0a);
- DOTEST(1024, "bd", 2, "%02x", 0xbd);
- DOTEST(1024, "12", 2, "%02ld", (long)12);
- DOTEST(1024, "02", 2, "%02ld", (long)2);
- DOTEST(1024, "02", 2, "%02u", (unsigned)2);
- DOTEST(1024, "765432", 6, "%05u", (unsigned)765432);
- DOTEST(1024, "10.234", 6, "%0.3f", 10.23421);
- DOTEST(1024, "123456.234", 10, "%0.3f", 123456.23421);
- DOTEST(1024, "123456789.234", 13, "%0.3f", 123456789.23421);
- DOTEST(1024, "123456.23", 9, "%.2f", 123456.23421);
- DOTEST(1024, "123456", 6, "%.0f", 123456.23421);
- DOTEST(1024, "0123", 4, "%.4x", 0x0123);
- DOTEST(1024, "00000123", 8, "%.8x", 0x0123);
- DOTEST(1024, "ffeb0cde", 8, "%.8x", 0xffeb0cde);
- DOTEST(1024, " 987654321", 10, "%10lu", (unsigned long)987654321);
- DOTEST(1024, " 987654321", 12, "%12lu", (unsigned long)987654321);
- DOTEST(1024, "987654321", 9, "%i", 987654321);
- DOTEST(1024, "-87654321", 9, "%i", -87654321);
- DOTEST(1024, "hello ", 16, "%-16s", "hello");
- DOTEST(1024, " ", 16, "%-16s", "");
- DOTEST(1024, "a ", 16, "%-16s", "a");
- DOTEST(1024, "foobarfoobar ", 16, "%-16s", "foobarfoobar");
- DOTEST(1024, "foobarfoobarfoobar", 18, "%-16s", "foobarfoobarfoobar");
-
- /* combined expressions */
- DOTEST(1024, "foo 1.0 size 512 edns", 21,
- "foo %s size %d %s%s", "1.0", 512, "", "edns");
- DOTEST(15, "foo 1.0 size 5", 21,
- "foo %s size %d %s%s", "1.0", 512, "", "edns");
- DOTEST(1024, "packet 1203ceff id", 18,
- "packet %2.2x%2.2x%2.2x%2.2x id", 0x12, 0x03, 0xce, 0xff);
- DOTEST(1024, "/tmp/testbound_123abcd.tmp", 26, "/tmp/testbound_%u%s%s.tmp", 123, "ab", "cd");
-
- return 0;
-}
-#endif /* SNPRINTF_TEST */
diff --git a/external/unbound/compat/strlcat.c b/external/unbound/compat/strlcat.c
deleted file mode 100644
index 0bea9250b..000000000
--- a/external/unbound/compat/strlcat.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* compat/strlcat.c */
-
-/*-
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- * 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.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``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: lib/libc/string/strlcat.c */
-
-#include "config.h"
-#ifndef HAVE_STRLCAT
-
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Appends src to string dst of size siz (unlike strncat, siz is the
- * full size of dst, not space left). At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
- * Returns strlen(src) + MIN(siz, strlen(initial dst)).
- * If retval >= siz, truncation occurred.
- */
-size_t
-strlcat(char *dst, const char *src, size_t siz)
-{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
- size_t dlen;
-
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (n-- != 0 && *d != '\0')
- d++;
- dlen = d - dst;
- n = siz - dlen;
-
- if (n == 0)
- return(dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
- n--;
- }
- s++;
- }
- *d = '\0';
-
- return(dlen + (s - src)); /* count does not include NUL */
-}
-
-#endif /* !HAVE_STRLCAT */
diff --git a/external/unbound/compat/strlcpy.c b/external/unbound/compat/strlcpy.c
deleted file mode 100644
index acd306a15..000000000
--- a/external/unbound/compat/strlcpy.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* from openssh 4.3p2 compat/strlcpy.c */
-/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- *
- * 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.
- */
-
-/* OPENBSD ORIGINAL: lib/libc/string/strlcpy.c */
-
-#include <config.h>
-#ifndef HAVE_STRLCPY
-
-#include <sys/types.h>
-#include <string.h>
-
-/*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns strlen(src); if retval >= siz, truncation occurred.
- */
-size_t
-strlcpy(char *dst, const char *src, size_t siz)
-{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
-
- /* Copy as many bytes as will fit */
- if (n != 0 && --n != 0) {
- do {
- if ((*d++ = *s++) == 0)
- break;
- } while (--n != 0);
- }
-
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++)
- ;
- }
-
- return(s - src - 1); /* count does not include NUL */
-}
-
-#endif /* !HAVE_STRLCPY */
diff --git a/external/unbound/compat/strptime.c b/external/unbound/compat/strptime.c
deleted file mode 100644
index 10ec31574..000000000
--- a/external/unbound/compat/strptime.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/** strptime workaround (for oa macos leopard)
- * This strptime follows the man strptime (2001-11-12)
- * conforming to SUSv2, POSIX.1-2001
- *
- * This very simple version of strptime has no:
- * - E alternatives
- * - O alternatives
- * - Glibc additions
- * - Does not process week numbers
- * - Does not properly processes year day
- *
- * LICENSE
- * Copyright (c) 2008, NLnet Labs, Matthijs Mekking
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of NLnetLabs nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
- **/
-
-#include "config.h"
-
-#ifndef HAVE_CONFIG_H
-#include <time.h>
-#endif
-
-#ifndef STRPTIME_WORKS
-
-#define TM_YEAR_BASE 1900
-
-#include <ctype.h>
-#include <string.h>
-
-static const char *abb_weekdays[] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL
-};
-static const char *full_weekdays[] = {
- "Sunday", "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday", NULL
-};
-static const char *abb_months[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL
-};
-static const char *full_months[] = {
- "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December", NULL
-};
-static const char *ampm[] = {
- "am", "pm", NULL
-};
-
-static int
-match_string(const char **buf, const char **strs)
-{
- int i = 0;
-
- for (i = 0; strs[i] != NULL; i++) {
- int len = strlen(strs[i]);
- if (strncasecmp (*buf, strs[i], len) == 0) {
- *buf += len;
- return i;
- }
- }
- return -1;
-}
-
-static int
-str2int(const char **buf, int max)
-{
- int ret=0, count=0;
-
- while (*buf[0] != '\0' && isdigit((unsigned char)*buf[0]) && count<max) {
- ret = ret*10 + (*buf[0] - '0');
- (*buf)++;
- count++;
- }
-
- if (!count)
- return -1;
- return ret;
-}
-
-/** Converts the character string s to values which are stored in tm
- * using the format specified by format
- **/
-char *
-unbound_strptime(const char *s, const char *format, struct tm *tm)
-{
- int c, ret;
- int split_year = 0;
-
- while ((c = *format) != '\0') {
- /* whitespace, literal or format */
- if (isspace((unsigned char)c)) { /* whitespace */
- /** whitespace matches zero or more whitespace characters in the
- * input string.
- **/
- while (isspace((unsigned char)*s))
- s++;
- }
- else if (c == '%') { /* format */
- format++;
- c = *format;
- switch (c) {
- case '%': /* %% is converted to % */
- if (*s != c) {
- return NULL;
- }
- s++;
- break;
- case 'a': /* weekday name, abbreviated or full */
- case 'A':
- ret = match_string(&s, full_weekdays);
- if (ret < 0)
- ret = match_string(&s, abb_weekdays);
- if (ret < 0) {
- return NULL;
- }
- tm->tm_wday = ret;
- break;
- case 'b': /* month name, abbreviated or full */
- case 'B':
- case 'h':
- ret = match_string(&s, full_months);
- if (ret < 0)
- ret = match_string(&s, abb_months);
- if (ret < 0) {
- return NULL;
- }
- tm->tm_mon = ret;
- break;
- case 'c': /* date and time representation */
- if (!(s = unbound_strptime(s, "%x %X", tm))) {
- return NULL;
- }
- break;
- case 'C': /* century number */
- ret = str2int(&s, 2);
- if (ret < 0 || ret > 99) { /* must be in [00,99] */
- return NULL;
- }
-
- if (split_year) {
- tm->tm_year = ret*100 + (tm->tm_year%100);
- }
- else {
- tm->tm_year = ret*100 - TM_YEAR_BASE;
- split_year = 1;
- }
- break;
- case 'd': /* day of month */
- case 'e':
- ret = str2int(&s, 2);
- if (ret < 1 || ret > 31) { /* must be in [01,31] */
- return NULL;
- }
- tm->tm_mday = ret;
- break;
- case 'D': /* equivalent to %m/%d/%y */
- if (!(s = unbound_strptime(s, "%m/%d/%y", tm))) {
- return NULL;
- }
- break;
- case 'H': /* hour */
- ret = str2int(&s, 2);
- if (ret < 0 || ret > 23) { /* must be in [00,23] */
- return NULL;
- }
- tm->tm_hour = ret;
- break;
- case 'I': /* 12hr clock hour */
- ret = str2int(&s, 2);
- if (ret < 1 || ret > 12) { /* must be in [01,12] */
- return NULL;
- }
- if (ret == 12) /* actually [0,11] */
- ret = 0;
- tm->tm_hour = ret;
- break;
- case 'j': /* day of year */
- ret = str2int(&s, 2);
- if (ret < 1 || ret > 366) { /* must be in [001,366] */
- return NULL;
- }
- tm->tm_yday = ret;
- break;
- case 'm': /* month */
- ret = str2int(&s, 2);
- if (ret < 1 || ret > 12) { /* must be in [01,12] */
- return NULL;
- }
- /* months go from 0-11 */
- tm->tm_mon = (ret-1);
- break;
- case 'M': /* minute */
- ret = str2int(&s, 2);
- if (ret < 0 || ret > 59) { /* must be in [00,59] */
- return NULL;
- }
- tm->tm_min = ret;
- break;
- case 'n': /* arbitrary whitespace */
- case 't':
- while (isspace((unsigned char)*s))
- s++;
- break;
- case 'p': /* am pm */
- ret = match_string(&s, ampm);
- if (ret < 0) {
- return NULL;
- }
- if (tm->tm_hour < 0 || tm->tm_hour > 11) { /* %I */
- return NULL;
- }
-
- if (ret == 1) /* pm */
- tm->tm_hour += 12;
- break;
- case 'r': /* equivalent of %I:%M:%S %p */
- if (!(s = unbound_strptime(s, "%I:%M:%S %p", tm))) {
- return NULL;
- }
- break;
- case 'R': /* equivalent of %H:%M */
- if (!(s = unbound_strptime(s, "%H:%M", tm))) {
- return NULL;
- }
- break;
- case 'S': /* seconds */
- ret = str2int(&s, 2);
- /* 60 may occur for leap seconds */
- /* earlier 61 was also allowed */
- if (ret < 0 || ret > 60) { /* must be in [00,60] */
- return NULL;
- }
- tm->tm_sec = ret;
- break;
- case 'T': /* equivalent of %H:%M:%S */
- if (!(s = unbound_strptime(s, "%H:%M:%S", tm))) {
- return NULL;
- }
- break;
- case 'U': /* week number, with the first Sun of Jan being w1 */
- ret = str2int(&s, 2);
- if (ret < 0 || ret > 53) { /* must be in [00,53] */
- return NULL;
- }
- /** it is hard (and not necessary for nsd) to determine time
- * data from week number.
- **/
- break;
- case 'w': /* day of week */
- ret = str2int(&s, 1);
- if (ret < 0 || ret > 6) { /* must be in [0,6] */
- return NULL;
- }
- tm->tm_wday = ret;
- break;
- case 'W': /* week number, with the first Mon of Jan being w1 */
- ret = str2int(&s, 2);
- if (ret < 0 || ret > 53) { /* must be in [00,53] */
- return NULL;
- }
- /** it is hard (and not necessary for nsd) to determine time
- * data from week number.
- **/
- break;
- case 'x': /* date format */
- if (!(s = unbound_strptime(s, "%m/%d/%y", tm))) {
- return NULL;
- }
- break;
- case 'X': /* time format */
- if (!(s = unbound_strptime(s, "%H:%M:%S", tm))) {
- return NULL;
- }
- break;
- case 'y': /* last two digits of a year */
- ret = str2int(&s, 2);
- if (ret < 0 || ret > 99) { /* must be in [00,99] */
- return NULL;
- }
- if (split_year) {
- tm->tm_year = ((tm->tm_year/100) * 100) + ret;
- }
- else {
- split_year = 1;
-
- /** currently:
- * if in [0,68] we are in 21th century,
- * if in [69,99] we are in 20th century.
- **/
- if (ret < 69) /* 2000 */
- ret += 100;
- tm->tm_year = ret;
- }
- break;
- case 'Y': /* year */
- ret = str2int(&s, 4);
- if (ret < 0 || ret > 9999) {
- return NULL;
- }
- tm->tm_year = ret - TM_YEAR_BASE;
- break;
- case '\0':
- default: /* unsupported, cannot match format */
- return NULL;
- break;
- }
- }
- else { /* literal */
- /* if input cannot match format, return NULL */
- if (*s != c)
- return NULL;
- s++;
- }
-
- format++;
- }
-
- /* return pointer to remainder of s */
- return (char*) s;
-}
-
-#endif /* STRPTIME_WORKS */
diff --git a/external/unbound/compat/strsep.c b/external/unbound/compat/strsep.c
deleted file mode 100644
index 4e3f05c52..000000000
--- a/external/unbound/compat/strsep.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * strsep implementation for compatibility.
- *
- * LICENSE
- * Copyright (c) 2016, NLnet Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of NLnetLabs nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
- **/
-
-#include "config.h"
-
-/** see if character is in the delimiter array */
-static int
-in_delim(char c, const char* delim)
-{
- const char* p;
- if(!delim)
- return 0;
- for(p=delim; *p; p++) {
- if(*p == c)
- return 1;
- }
- return 0;
-}
-
-char *strsep(char **stringp, const char *delim)
-{
- char* s;
- char* orig;
- if(stringp == NULL || *stringp == NULL)
- return NULL;
- orig = *stringp;
- s = *stringp;
- while(*s && !in_delim(*s, delim))
- s++;
- if(*s) {
- *s = 0;
- *stringp = s+1;
- } else {
- *stringp = NULL;
- }
- return orig;
-}