| 1 | //! System-specific implementations. |
| 2 | //! |
| 3 | //! This module should provide `fill_inner` with the signature |
| 4 | //! `fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error>`. |
| 5 | //! The function MUST fully initialize `dest` when `Ok(())` is returned. |
| 6 | //! The function MUST NOT ever write uninitialized bytes into `dest`, |
| 7 | //! regardless of what value it returns. |
| 8 | |
| 9 | cfg_if! { |
| 10 | if #[cfg(getrandom_backend = "custom" )] { |
| 11 | mod custom; |
| 12 | pub use custom::*; |
| 13 | } else if #[cfg(getrandom_backend = "linux_getrandom" )] { |
| 14 | mod getrandom; |
| 15 | pub use getrandom::*; |
| 16 | } else if #[cfg(getrandom_backend = "linux_raw" )] { |
| 17 | mod linux_raw; |
| 18 | pub use linux_raw::*; |
| 19 | } else if #[cfg(getrandom_backend = "rdrand" )] { |
| 20 | mod rdrand; |
| 21 | pub use rdrand::*; |
| 22 | } else if #[cfg(getrandom_backend = "rndr" )] { |
| 23 | mod rndr; |
| 24 | pub use rndr::*; |
| 25 | } else if #[cfg(getrandom_backend = "efi_rng" )] { |
| 26 | mod efi_rng; |
| 27 | pub use efi_rng::*; |
| 28 | } else if #[cfg(all(getrandom_backend = "wasm_js" ))] { |
| 29 | cfg_if! { |
| 30 | if #[cfg(feature = "wasm_js" )] { |
| 31 | mod wasm_js; |
| 32 | pub use wasm_js::*; |
| 33 | } else { |
| 34 | compile_error!( |
| 35 | "The \"wasm_js \" backend requires the `wasm_js` feature \ |
| 36 | for `getrandom`. For more information see: \ |
| 37 | https://docs.rs/getrandom/#webassembly-support" |
| 38 | ); |
| 39 | } |
| 40 | } |
| 41 | } else if #[cfg(all(target_os = "linux" , target_env = "" ))] { |
| 42 | mod linux_raw; |
| 43 | pub use linux_raw::*; |
| 44 | } else if #[cfg(target_os = "espidf" )] { |
| 45 | mod esp_idf; |
| 46 | pub use esp_idf::*; |
| 47 | } else if #[cfg(any( |
| 48 | target_os = "haiku" , |
| 49 | target_os = "redox" , |
| 50 | target_os = "nto" , |
| 51 | target_os = "aix" , |
| 52 | ))] { |
| 53 | mod use_file; |
| 54 | pub use use_file::*; |
| 55 | } else if #[cfg(any( |
| 56 | target_os = "macos" , |
| 57 | target_os = "openbsd" , |
| 58 | target_os = "vita" , |
| 59 | target_os = "emscripten" , |
| 60 | ))] { |
| 61 | mod getentropy; |
| 62 | pub use getentropy::*; |
| 63 | } else if #[cfg(any( |
| 64 | // Rust supports Android API level 19 (KitKat) [0] and the next upgrade targets |
| 65 | // level 21 (Lollipop) [1], while `getrandom(2)` was added only in |
| 66 | // level 23 (Marshmallow). Note that it applies only to the "old" `target_arch`es, |
| 67 | // RISC-V Android targets sufficiently new API level, same will apply for potential |
| 68 | // new Android `target_arch`es. |
| 69 | // [0]: https://blog.rust-lang.org/2023/01/09/android-ndk-update-r25.html |
| 70 | // [1]: https://github.com/rust-lang/rust/pull/120593 |
| 71 | all( |
| 72 | target_os = "android" , |
| 73 | any( |
| 74 | target_arch = "aarch64" , |
| 75 | target_arch = "arm" , |
| 76 | target_arch = "x86" , |
| 77 | target_arch = "x86_64" , |
| 78 | ), |
| 79 | ), |
| 80 | // Only on these `target_arch`es Rust supports Linux kernel versions (3.2+) |
| 81 | // that precede the version (3.17) in which `getrandom(2)` was added: |
| 82 | // https://doc.rust-lang.org/stable/rustc/platform-support.html |
| 83 | all( |
| 84 | target_os = "linux" , |
| 85 | any( |
| 86 | target_arch = "aarch64" , |
| 87 | target_arch = "arm" , |
| 88 | target_arch = "powerpc" , |
| 89 | target_arch = "powerpc64" , |
| 90 | target_arch = "s390x" , |
| 91 | target_arch = "x86" , |
| 92 | target_arch = "x86_64" , |
| 93 | // Minimum supported Linux kernel version for MUSL targets |
| 94 | // is not specified explicitly (as of Rust 1.77) and they |
| 95 | // are used in practice to target pre-3.17 kernels. |
| 96 | target_env = "musl" , |
| 97 | ), |
| 98 | ) |
| 99 | ))] { |
| 100 | mod use_file; |
| 101 | mod linux_android_with_fallback; |
| 102 | pub use linux_android_with_fallback::*; |
| 103 | } else if #[cfg(any( |
| 104 | target_os = "android" , |
| 105 | target_os = "linux" , |
| 106 | target_os = "dragonfly" , |
| 107 | target_os = "freebsd" , |
| 108 | target_os = "hurd" , |
| 109 | target_os = "illumos" , |
| 110 | target_os = "cygwin" , |
| 111 | // Check for target_arch = "arm" to only include the 3DS. Does not |
| 112 | // include the Nintendo Switch (which is target_arch = "aarch64"). |
| 113 | all(target_os = "horizon" , target_arch = "arm" ), |
| 114 | ))] { |
| 115 | mod getrandom; |
| 116 | pub use getrandom::*; |
| 117 | } else if #[cfg(target_os = "solaris" )] { |
| 118 | mod solaris; |
| 119 | pub use solaris::*; |
| 120 | } else if #[cfg(target_os = "netbsd" )] { |
| 121 | mod netbsd; |
| 122 | pub use netbsd::*; |
| 123 | } else if #[cfg(target_os = "fuchsia" )] { |
| 124 | mod fuchsia; |
| 125 | pub use fuchsia::*; |
| 126 | } else if #[cfg(any( |
| 127 | target_os = "ios" , |
| 128 | target_os = "visionos" , |
| 129 | target_os = "watchos" , |
| 130 | target_os = "tvos" , |
| 131 | ))] { |
| 132 | mod apple_other; |
| 133 | pub use apple_other::*; |
| 134 | } else if #[cfg(all(target_arch = "wasm32" , target_os = "wasi" ))] { |
| 135 | cfg_if! { |
| 136 | if #[cfg(target_env = "p1" )] { |
| 137 | mod wasi_p1; |
| 138 | pub use wasi_p1::*; |
| 139 | } else if #[cfg(target_env = "p2" )] { |
| 140 | mod wasi_p2; |
| 141 | pub use wasi_p2::*; |
| 142 | } else { |
| 143 | compile_error!( |
| 144 | "Unknown version of WASI (only previews 1 and 2 are supported) \ |
| 145 | or Rust version older than 1.80 was used" |
| 146 | ); |
| 147 | } |
| 148 | } |
| 149 | } else if #[cfg(target_os = "hermit" )] { |
| 150 | mod hermit; |
| 151 | pub use hermit::*; |
| 152 | } else if #[cfg(target_os = "vxworks" )] { |
| 153 | mod vxworks; |
| 154 | pub use vxworks::*; |
| 155 | } else if #[cfg(target_os = "solid_asp3" )] { |
| 156 | mod solid; |
| 157 | pub use solid::*; |
| 158 | } else if #[cfg(all(windows, any(target_vendor = "win7" , getrandom_windows_legacy)))] { |
| 159 | mod windows7; |
| 160 | pub use windows7::*; |
| 161 | } else if #[cfg(windows)] { |
| 162 | mod windows; |
| 163 | pub use windows::*; |
| 164 | } else if #[cfg(all(target_arch = "x86_64" , target_env = "sgx" ))] { |
| 165 | mod rdrand; |
| 166 | pub use rdrand::*; |
| 167 | } else if #[cfg(all(target_arch = "wasm32" , any(target_os = "unknown" , target_os = "none" )))] { |
| 168 | compile_error!( |
| 169 | "The wasm32-unknown-unknown targets are not supported by default; \ |
| 170 | you may need to enable the \"wasm_js \" configuration flag. Note \ |
| 171 | that enabling the `wasm_js` feature flag alone is insufficient. \ |
| 172 | For more information see: \ |
| 173 | https://docs.rs/getrandom/#webassembly-support" |
| 174 | ); |
| 175 | } else { |
| 176 | compile_error!("target is not supported. You may need to define \ |
| 177 | a custom backend see: \ |
| 178 | https://docs.rs/getrandom/#custom-backends" ); |
| 179 | } |
| 180 | } |
| 181 | |