Joel Galenson | 4be0c6d | 2020-07-07 13:20:14 -0700 | [diff] [blame] | 1 | //! Implementation for VxWorks |
ThiƩbaud Weksteen | 9791b30 | 2021-03-03 16:30:20 +0100 | [diff] [blame] | 2 | use crate::{util_libc::last_os_error, Error}; |
Jeff Vander Stoep | 1872b3e | 2024-02-01 19:43:14 +0100 | [diff] [blame] | 3 | use core::{ |
| 4 | mem::MaybeUninit, |
| 5 | sync::atomic::{AtomicBool, Ordering::Relaxed}, |
| 6 | }; |
Joel Galenson | 4be0c6d | 2020-07-07 13:20:14 -0700 | [diff] [blame] | 7 | |
Jeff Vander Stoep | 1872b3e | 2024-02-01 19:43:14 +0100 | [diff] [blame] | 8 | pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> { |
Joel Galenson | 4be0c6d | 2020-07-07 13:20:14 -0700 | [diff] [blame] | 9 | static RNG_INIT: AtomicBool = AtomicBool::new(false); |
| 10 | while !RNG_INIT.load(Relaxed) { |
| 11 | let ret = unsafe { libc::randSecure() }; |
| 12 | if ret < 0 { |
ThiƩbaud Weksteen | 9791b30 | 2021-03-03 16:30:20 +0100 | [diff] [blame] | 13 | return Err(Error::VXWORKS_RAND_SECURE); |
Joel Galenson | 4be0c6d | 2020-07-07 13:20:14 -0700 | [diff] [blame] | 14 | } else if ret > 0 { |
| 15 | RNG_INIT.store(true, Relaxed); |
| 16 | break; |
| 17 | } |
| 18 | unsafe { libc::usleep(10) }; |
| 19 | } |
| 20 | |
| 21 | // Prevent overflow of i32 |
| 22 | for chunk in dest.chunks_mut(i32::max_value() as usize) { |
Jeff Vander Stoep | 1872b3e | 2024-02-01 19:43:14 +0100 | [diff] [blame] | 23 | let ret = unsafe { libc::randABytes(chunk.as_mut_ptr() as *mut u8, chunk.len() as i32) }; |
Joel Galenson | 4be0c6d | 2020-07-07 13:20:14 -0700 | [diff] [blame] | 24 | if ret != 0 { |
| 25 | return Err(last_os_error()); |
| 26 | } |
| 27 | } |
| 28 | Ok(()) |
| 29 | } |