diff options
author | dim <dim@FreeBSD.org> | 2015-10-06 17:53:29 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-10-06 17:53:29 +0000 |
commit | a6f4f28b545e1f0632ba4b20b86a7ab487932373 (patch) | |
tree | e9dbc6d658415636ba47d28716ee528c8ab7c862 /contrib/libc++/src/random.cpp | |
parent | 09f0c012db173aa7875b4d45fc67ef4d26c82548 (diff) | |
parent | 9ba87e73be0d01bbe1cf9547130ae12f9b15d7a7 (diff) | |
download | FreeBSD-src-a6f4f28b545e1f0632ba4b20b86a7ab487932373.zip FreeBSD-src-a6f4f28b545e1f0632ba4b20b86a7ab487932373.tar.gz |
Upgrade our copies of clang, llvm, lldb, compiler-rt and libc++ to 3.7.0
release.
Please note that from 3.5.0 onwards, clang, llvm and lldb require C++11
support to build; see UPDATING for more information.
Release notes for llvm and clang can be found here:
<http://llvm.org/releases/3.7.0/docs/ReleaseNotes.html>
<http://llvm.org/releases/3.7.0/tools/clang/docs/ReleaseNotes.html>
Thanks to Ed Maste, Andrew Turner and Antoine Brodin for their help.
Exp-run: antoine
Relnotes: yes
Diffstat (limited to 'contrib/libc++/src/random.cpp')
-rw-r--r-- | contrib/libc++/src/random.cpp | 96 |
1 files changed, 60 insertions, 36 deletions
diff --git a/contrib/libc++/src/random.cpp b/contrib/libc++/src/random.cpp index 15ed65b..4ab424e 100644 --- a/contrib/libc++/src/random.cpp +++ b/contrib/libc++/src/random.cpp @@ -7,11 +7,10 @@ // //===----------------------------------------------------------------------===// -#if defined(_WIN32) +#if defined(_LIBCPP_USING_WIN32_RANDOM) // Must be defined before including stdlib.h to enable rand_s(). #define _CRT_RAND_S -#include <stdio.h> -#endif // defined(_WIN32) +#endif // defined(_LIBCPP_USING_WIN32_RANDOM) #include "random" #include "system_error" @@ -19,21 +18,27 @@ #if defined(__sun__) #define rename solaris_headers_are_broken #endif // defined(__sun__) -#if !defined(_WIN32) + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> + +#if defined(_LIBCPP_USING_DEV_RANDOM) #include <fcntl.h> #include <unistd.h> -#endif // !defined(_WIN32) -#include <errno.h> -#if defined(_LIBCPP_USING_NACL_RANDOM) +#elif defined(_LIBCPP_USING_NACL_RANDOM) #include <nacl/nacl_random.h> -#endif // defined(_LIBCPP_USING_NACL_RANDOM) +#endif + _LIBCPP_BEGIN_NAMESPACE_STD -#if defined(_WIN32) +#if defined(_LIBCPP_USING_ARC4_RANDOM) -random_device::random_device(const string&) +random_device::random_device(const string& __token) { + if (__token != "/dev/urandom") + __throw_system_error(ENOENT, ("random device not supported " + __token).c_str()); } random_device::~random_device() @@ -43,10 +48,43 @@ random_device::~random_device() unsigned random_device::operator()() { + return arc4random(); +} + +#elif defined(_LIBCPP_USING_DEV_RANDOM) + +random_device::random_device(const string& __token) + : __f_(open(__token.c_str(), O_RDONLY)) +{ + if (__f_ < 0) + __throw_system_error(errno, ("random_device failed to open " + __token).c_str()); +} + +random_device::~random_device() +{ + close(__f_); +} + +unsigned +random_device::operator()() +{ unsigned r; - errno_t err = rand_s(&r); - if (err) - __throw_system_error(err, "random_device rand_s failed."); + size_t n = sizeof(r); + char* p = reinterpret_cast<char*>(&r); + while (n > 0) + { + ssize_t s = read(__f_, p, n); + if (s == 0) + __throw_system_error(ENODATA, "random_device got EOF"); + if (s == -1) + { + if (errno != EINTR) + __throw_system_error(errno, "random_device got an unexpected error"); + continue; + } + n -= static_cast<size_t>(s); + p += static_cast<size_t>(s); + } return r; } @@ -70,7 +108,6 @@ random_device::operator()() { unsigned r; size_t n = sizeof(r); - char* p = reinterpret_cast<char*>(&r); size_t bytes_written; int error = nacl_secure_random(&r, n, &bytes_written); if (error != 0) @@ -80,44 +117,31 @@ random_device::operator()() return r; } -#else // !defined(_WIN32) && !defined(_LIBCPP_USING_NACL_RANDOM) +#elif defined(_LIBCPP_USING_WIN32_RANDOM) random_device::random_device(const string& __token) - : __f_(open(__token.c_str(), O_RDONLY)) { - if (__f_ < 0) - __throw_system_error(errno, ("random_device failed to open " + __token).c_str()); + if (__token != "/dev/urandom") + __throw_system_error(ENOENT, ("random device not supported " + __token).c_str()); } random_device::~random_device() { - close(__f_); } unsigned random_device::operator()() { unsigned r; - size_t n = sizeof(r); - char* p = reinterpret_cast<char*>(&r); - while (n > 0) - { - ssize_t s = read(__f_, p, n); - if (s == 0) - __throw_system_error(ENODATA, "random_device got EOF"); - if (s == -1) - { - if (errno != EINTR) - __throw_system_error(errno, "random_device got an unexpected error"); - continue; - } - n -= static_cast<size_t>(s); - p += static_cast<size_t>(s); - } + errno_t err = rand_s(&r); + if (err) + __throw_system_error(err, "random_device rand_s failed."); return r; } -#endif // defined(_WIN32) || defined(_LIBCPP_USING_NACL_RANDOM) +#else +#error "Random device not implemented for this architecture" +#endif double random_device::entropy() const _NOEXCEPT |