mirror of
https://github.com/janet-lang/janet
synced 2024-11-29 03:19:54 +00:00
Switch to using /dev/urandom for OS X prior to 10.7
This commit is contained in:
parent
f5d208d5d6
commit
f06e9ae30c
@ -58,7 +58,6 @@
|
|||||||
/* #define JANET_NO_REALPATH */
|
/* #define JANET_NO_REALPATH */
|
||||||
/* #define JANET_NO_SYMLINKS */
|
/* #define JANET_NO_SYMLINKS */
|
||||||
/* #define JANET_NO_UMASK */
|
/* #define JANET_NO_UMASK */
|
||||||
/* #define JANET_NO_ARC4RANDOM_BUF */
|
|
||||||
/* #define JANET_OUT_OF_MEMORY do { printf("janet out of memory\n"); exit(1); } while (0) */
|
/* #define JANET_OUT_OF_MEMORY do { printf("janet out of memory\n"); exit(1); } while (0) */
|
||||||
/* #define JANET_EXIT(msg) do { printf("C assert failed executing janet: %s\n", msg); exit(1); } while (0) */
|
/* #define JANET_EXIT(msg) do { printf("C assert failed executing janet: %s\n", msg); exit(1); } while (0) */
|
||||||
/* #define JANET_TOP_LEVEL_SIGNAL(msg) call_my_function((msg), stderr) */
|
/* #define JANET_TOP_LEVEL_SIGNAL(msg) call_my_function((msg), stderr) */
|
||||||
|
@ -39,6 +39,10 @@
|
|||||||
|
|
||||||
#define RETRY_EINTR(RC, CALL) do { (RC) = CALL; } while((RC) < 0 && errno == EINTR)
|
#define RETRY_EINTR(RC, CALL) do { (RC) = CALL; } while((RC) < 0 && errno == EINTR)
|
||||||
|
|
||||||
|
#ifdef JANET_APPLE
|
||||||
|
#include <AvailabilityMacros.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef JANET_WINDOWS
|
#ifdef JANET_WINDOWS
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
@ -66,29 +70,10 @@ extern char **environ;
|
|||||||
|
|
||||||
/* Setting C99 standard makes this not available, but it should
|
/* Setting C99 standard makes this not available, but it should
|
||||||
* work/link properly if we detect a BSD */
|
* work/link properly if we detect a BSD */
|
||||||
#if defined(JANET_BSD) || defined(JANET_APPLE)
|
#if defined(JANET_BSD) || defined(MAC_OS_X_VERSION_10_7)
|
||||||
void arc4random_buf(void *buf, size_t nbytes);
|
void arc4random_buf(void *buf, size_t nbytes);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* arc4random_buf wasn't available in OS X until 10.7. */
|
|
||||||
#ifdef JANET_NO_ARC4RANDOM_BUF
|
|
||||||
uint32_t arc4random(void);
|
|
||||||
void arc4random_buf(void *buf, size_t nbytes) {
|
|
||||||
uint32_t *buf_as_words = (uint32_t*)buf;
|
|
||||||
size_t nwords = nbytes / 4;
|
|
||||||
for (size_t i=0; i < nwords; i++) {
|
|
||||||
buf_as_words[i] = arc4random();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t tail_len = nbytes % 4;
|
|
||||||
if (tail_len) {
|
|
||||||
uint8_t *tail = buf + nbytes - tail_len;
|
|
||||||
uint32_t rand = arc4random();
|
|
||||||
memcpy(tail, &rand, tail_len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Not POSIX, but all Unixes but Solaris have this function. */
|
/* Not POSIX, but all Unixes but Solaris have this function. */
|
||||||
#if defined(JANET_POSIX) && !defined(__sun)
|
#if defined(JANET_POSIX) && !defined(__sun)
|
||||||
time_t timegm(struct tm *tm);
|
time_t timegm(struct tm *tm);
|
||||||
@ -625,10 +610,11 @@ static Janet os_cryptorand(int32_t argc, Janet *argv) {
|
|||||||
v = v >> 8;
|
v = v >> 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(JANET_LINUX)
|
#elif defined(JANET_LINUX) || ( defined(JANET_APPLE) && !defined(MAC_OS_X_VERSION_10_7) )
|
||||||
/* We should be able to call getrandom on linux, but it doesn't seem
|
/* We should be able to call getrandom on linux, but it doesn't seem
|
||||||
to be uniformly supported on linux distros.
|
to be uniformly supported on linux distros.
|
||||||
In both cases, use this fallback path for now... */
|
On Mac, arc4random_buf wasn't available on until 10.7.
|
||||||
|
In these cases, use this fallback path for now... */
|
||||||
int rc;
|
int rc;
|
||||||
int randfd;
|
int randfd;
|
||||||
RETRY_EINTR(randfd, open("/dev/urandom", O_RDONLY | O_CLOEXEC));
|
RETRY_EINTR(randfd, open("/dev/urandom", O_RDONLY | O_CLOEXEC));
|
||||||
@ -645,7 +631,7 @@ static Janet os_cryptorand(int32_t argc, Janet *argv) {
|
|||||||
n -= nread;
|
n -= nread;
|
||||||
}
|
}
|
||||||
RETRY_EINTR(rc, close(randfd));
|
RETRY_EINTR(rc, close(randfd));
|
||||||
#elif defined(JANET_BSD) || defined(JANET_APPLE)
|
#elif defined(JANET_BSD) || defined(MAC_OS_X_VERSION_10_7)
|
||||||
(void) genericerr;
|
(void) genericerr;
|
||||||
arc4random_buf(buffer->data + offset, n);
|
arc4random_buf(buffer->data + offset, n);
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user