diff options
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | random.c | 20 |
2 files changed, 28 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index 92713f3a3b..9328fa532d 100644 --- a/configure.ac +++ b/configure.ac @@ -3309,6 +3309,14 @@ AS_CASE(["$target_os"], ], [darwin*], [ RUBY_APPEND_OPTION(CFLAGS, -pipe) + AC_COMPILE_IFELSE([ + AC_LANG_BOOL_COMPILE_TRY([@%:@include <AvailabilityMacros.h>], + [MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7])], + [dnl + RUBY_APPEND_OPTION(XLDFLAGS, [-framework Security]) + RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Security]) + ]dnl + ) RUBY_APPEND_OPTION(XLDFLAGS, [-framework Foundation]) RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Foundation]) ], @@ -470,6 +470,26 @@ fill_random_bytes_urandom(void *seed, size_t size) #endif #if 0 +#elif defined __APPLE__ && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7 +#include <Security/Security.h> + +static int +fill_random_bytes_syscall(void *seed, size_t size, int unused) +{ + int status = SecRandomCopyBytes(kSecRandomDefault, size, seed); + + if (status != errSecSuccess) { +# if 0 + CFStringRef s = SecCopyErrorMessageString(status, NULL); + const char *m = s ? CFStringGetCStringPtr(s, kCFStringEncodingUTF8) : NULL; + fprintf(stderr, "SecRandomCopyBytes failed: %d: %s\n", status, + m ? m : "unknown"); + if (s) CFRelease(s); +# endif + return -1; + } + return 0; +} #elif defined(HAVE_ARC4RANDOM_BUF) static int fill_random_bytes_syscall(void *buf, size_t size, int unused) |