]> git.proxmox.com Git - rustc.git/blame - vendor/getrandom/src/vxworks.rs
New upstream version 1.52.1+dfsg1
[rustc.git] / vendor / getrandom / src / vxworks.rs
CommitLineData
f20569fa
XL
1// Copyright 2018 Developers of the Rand project.
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9//! Implementation for VxWorks
10use crate::{util_libc::last_os_error, Error};
11use core::sync::atomic::{AtomicBool, Ordering::Relaxed};
12
13pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> {
14 static RNG_INIT: AtomicBool = AtomicBool::new(false);
15 while !RNG_INIT.load(Relaxed) {
16 let ret = unsafe { libc::randSecure() };
17 if ret < 0 {
18 return Err(Error::VXWORKS_RAND_SECURE);
19 } else if ret > 0 {
20 RNG_INIT.store(true, Relaxed);
21 break;
22 }
23 unsafe { libc::usleep(10) };
24 }
25
26 // Prevent overflow of i32
27 for chunk in dest.chunks_mut(i32::max_value() as usize) {
28 let ret = unsafe { libc::randABytes(chunk.as_mut_ptr(), chunk.len() as i32) };
29 if ret != 0 {
30 return Err(last_os_error());
31 }
32 }
33 Ok(())
34}