]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | // |
2 | // Copyright (c) 2017 James E. King III | |
3 | // | |
4 | // Distributed under the Boost Software License, Version 1.0. | |
5 | // (See accompanying file LICENSE_1_0.txt or copy at | |
92f5a8d4 | 6 | // https://www.boost.org/LICENSE_1_0.txt) |
11fdf7f2 TL |
7 | // |
8 | // Platform-specific random entropy provider platform detection | |
9 | // | |
10 | ||
11 | #ifndef BOOST_UUID_DETAIL_RANDOM_PROVIDER_PLATFORM_DETECTION_HPP | |
12 | #define BOOST_UUID_DETAIL_RANDOM_PROVIDER_PLATFORM_DETECTION_HPP | |
13 | ||
14 | #include <boost/predef/library/c/cloudabi.h> | |
15 | #include <boost/predef/library/c/gnu.h> | |
16 | #include <boost/predef/os/bsd/open.h> | |
17 | #include <boost/predef/os/windows.h> | |
18 | ||
92f5a8d4 TL |
19 | // Note: Don't use Boost.Predef to detect Linux and Android as it may give different results depending on header inclusion order. |
20 | // https://github.com/boostorg/predef/issues/81#issuecomment-413329061 | |
21 | #if (defined(__linux__) || defined(__linux) || defined(linux)) && (!defined(__ANDROID__) || __ANDROID_API__ >= 28) | |
22 | #include <sys/syscall.h> | |
23 | #if defined(SYS_getrandom) | |
24 | #define BOOST_UUID_RANDOM_PROVIDER_HAS_GETRANDOM | |
25 | #endif // defined(SYS_getrandom) | |
26 | #endif | |
27 | ||
28 | // On Linux, getentropy is implemented via getrandom. If we know that getrandom is not supported by the kernel, getentropy | |
29 | // will certainly not work, even if libc provides a wrapper function for it. There is no reason, ever, to use getentropy on that platform. | |
30 | #if !defined(BOOST_UUID_RANDOM_PROVIDER_DISABLE_GETENTROPY) && (defined(__linux__) || defined(__linux) || defined(linux) || defined(__ANDROID__)) | |
31 | #define BOOST_UUID_RANDOM_PROVIDER_DISABLE_GETENTROPY | |
32 | #endif | |
33 | ||
11fdf7f2 TL |
34 | // |
35 | // Platform Detection - will load in the correct header and | |
36 | // will define the class <tt>random_provider_base</tt>. | |
37 | // | |
38 | ||
39 | #if BOOST_OS_BSD_OPEN >= BOOST_VERSION_NUMBER(2, 1, 0) || BOOST_LIB_C_CLOUDABI | |
40 | # define BOOST_UUID_RANDOM_PROVIDER_ARC4RANDOM | |
41 | # define BOOST_UUID_RANDOM_PROVIDER_NAME arc4random | |
42 | ||
43 | #elif BOOST_OS_WINDOWS | |
44 | # include <boost/winapi/config.hpp> | |
45 | # if BOOST_WINAPI_PARTITION_APP_SYSTEM && \ | |
46 | !defined(BOOST_UUID_RANDOM_PROVIDER_FORCE_WINCRYPT) && \ | |
47 | !defined(_WIN32_WCE) && \ | |
92f5a8d4 | 48 | (BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6) |
11fdf7f2 TL |
49 | # define BOOST_UUID_RANDOM_PROVIDER_BCRYPT |
50 | # define BOOST_UUID_RANDOM_PROVIDER_NAME bcrypt | |
51 | ||
52 | # elif BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM | |
53 | # define BOOST_UUID_RANDOM_PROVIDER_WINCRYPT | |
54 | # define BOOST_UUID_RANDOM_PROVIDER_NAME wincrypt | |
55 | # else | |
56 | # error Unable to find a suitable windows entropy provider | |
57 | # endif | |
58 | ||
92f5a8d4 TL |
59 | #elif defined(BOOST_UUID_RANDOM_PROVIDER_HAS_GETRANDOM) && !defined(BOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX) && !defined(BOOST_UUID_RANDOM_PROVIDER_DISABLE_GETRANDOM) |
60 | # define BOOST_UUID_RANDOM_PROVIDER_GETRANDOM | |
61 | # define BOOST_UUID_RANDOM_PROVIDER_NAME getrandom | |
62 | ||
63 | #elif BOOST_LIB_C_GNU >= BOOST_VERSION_NUMBER(2, 25, 0) && !defined(BOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX) && !defined(BOOST_UUID_RANDOM_PROVIDER_DISABLE_GETENTROPY) | |
11fdf7f2 TL |
64 | # define BOOST_UUID_RANDOM_PROVIDER_GETENTROPY |
65 | # define BOOST_UUID_RANDOM_PROVIDER_NAME getentropy | |
66 | ||
67 | #else | |
68 | # define BOOST_UUID_RANDOM_PROVIDER_POSIX | |
69 | # define BOOST_UUID_RANDOM_PROVIDER_NAME posix | |
70 | ||
71 | #endif | |
72 | ||
73 | #define BOOST_UUID_RANDOM_PROVIDER_STRINGIFY2(X) #X | |
74 | #define BOOST_UUID_RANDOM_PROVIDER_STRINGIFY(X) BOOST_UUID_RANDOM_PROVIDER_STRINGIFY2(X) | |
75 | ||
76 | #if defined(BOOST_UUID_RANDOM_PROVIDER_SHOW) | |
77 | #pragma message("BOOST_UUID_RANDOM_PROVIDER_NAME " BOOST_UUID_RANDOM_PROVIDER_STRINGIFY(BOOST_UUID_RANDOM_PROVIDER_NAME)) | |
78 | #endif | |
79 | ||
80 | #endif // BOOST_UUID_DETAIL_RANDOM_PROVIDER_PLATFORM_DETECTION_HPP |