<pre style='margin:0'>
Chris Jones (cjones051073) pushed a commit to branch getentropy
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/4609c1fd46ea41a96448e6132ff9cb9a579df037">https://github.com/macports/macports-legacy-support/commit/4609c1fd46ea41a96448e6132ff9cb9a579df037</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 4609c1fd46ea41a96448e6132ff9cb9a579df037
</span>Author: Chris Jones <jonesc@hep.phy.cam.ac.uk>
AuthorDate: Tue Oct 12 14:59:02 2021 +0100

<span style='display:block; white-space:pre;color:#404040;'>    move getentropy implementation to own source file
</span>---
 src/arc4random.c | 69 ++-----------------------------------------
 src/getentropy.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 66 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/arc4random.c b/src/arc4random.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 9a1dbae..dc00b5b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/arc4random.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/arc4random.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -37,11 +37,11 @@
</span> #include <unistd.h>
 #include <sys/types.h>
 #include <sys/time.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/random.h>
</span> #include <assert.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <stdarg.h>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <errno.h>
</span> 
 
 #define ARC4R_KEYSZ     32
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -64,10 +64,6 @@ struct rand_state
</span> };
 typedef struct rand_state rand_state;
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/* kernel entropy */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-extern int _getentropy(void* buf, size_t n);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> #define KEYSTREAM_ONLY
 
 typedef unsigned char u8;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -329,7 +325,7 @@ _rs_stir(rand_state* st)
</span>     u8 rnd[ARC4R_KEYSZ + ARC4R_IVSZ];
 
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    int r = _getentropy(rnd, sizeof rnd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int r = getentropy(rnd, sizeof rnd);
</span>     assert(r == 0);
 
     _rs_rekey(st, rnd, sizeof(rnd));
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -429,7 +425,7 @@ _screate()
</span>      * systems.
      */
     uint8_t buf[8];
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    _getentropy(buf, sizeof buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    getentropy(buf, sizeof buf);
</span> }
 
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -503,7 +499,6 @@ arc4random_buf(void* b, size_t n)
</span> 
 
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> /*
  * Calculate a uniformly distributed random number less than upper_bound
  * avoiding "modulo bias".
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -541,63 +536,5 @@ arc4random_uniform(uint32_t upper_bound)
</span>     return r % upper_bound;
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-_error(int doexit, int err, const char* fmt, ...)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    va_list ap;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fflush(stdout);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fflush(stderr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    va_start(ap, fmt);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    vfprintf(stderr, fmt, ap);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    va_end(ap);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if (err > 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fprintf(stderr, "\n  %s (Errno %d)\n", strerror(err), err);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if (doexit) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fflush(stderr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        exit(1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-static int
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-_randopen(const char* name)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    int fd = open(name, O_RDONLY);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if (fd < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        _error(1, errno, "Cannot open system random number dev %s", name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return fd;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-_getentropy(void* buf, size_t n)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    static int fd = -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    uint8_t* b    = (uint8_t*)buf;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if (fd < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fd = _randopen("/dev/urandom");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    while (n > 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ssize_t m = (read)(fd, b, n);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (m < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if (errno == EINTR) continue;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            _error(1, errno, "Fatal read error while reading rand dev");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        b += m;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        n -= m;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> 
 #endif /* __MP_LEGACY_SUPPORT_ARC4RANDOM__ */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/getentropy.c b/src/getentropy.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..847745e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/getentropy.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,89 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2021
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// MP support header
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacySupport.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MP_LEGACY_SUPPORT_GETENTROPY__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdint.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/random.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdarg.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+_error(int doexit, int err, const char* fmt, ...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    va_list ap;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fflush(stdout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fflush(stderr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    va_start(ap, fmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    vfprintf(stderr, fmt, ap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    va_end(ap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (err > 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fprintf(stderr, "\n  %s (Errno %d)\n", strerror(err), err);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (doexit) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fflush(stderr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+_randopen(const char* name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int fd = open(name, O_RDONLY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (fd < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      _error(1, errno, "Cannot open system random number dev %s", name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+getentropy(void* buf, size_t n)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    static int fd = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    uint8_t* b    = (uint8_t*)buf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (fd < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fd = _randopen("/dev/urandom");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while (n > 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ssize_t m = (read)(fd, b, n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (m < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if (errno == EINTR) continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            _error(1, errno, "Fatal read error while reading rand dev");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        b += m;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        n -= m;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MP_LEGACY_SUPPORT_GETENTROPY__ */
</span></pre><pre style='margin:0'>

</pre>