use crate::libc_;
use std::sync::atomic;
static GETRANDOM_UNSUPPORTED: atomic::AtomicI32 = atomic::AtomicI32::new(0);
type GetRandomFlag = usize;
pub fn get_random(p: &mut [u8], flags: GetRandomFlag) -> std::io::Result<usize> {
if p.is_empty() {
return Ok(0);
}
if GETRANDOM_UNSUPPORTED.load(std::sync::atomic::Ordering::SeqCst) != 0 {
return Err(std::io::Error::from(std::io::ErrorKind::Unsupported));
}
let r = unsafe {
libc_::getrandom(
p.as_mut_ptr() as *mut std::ffi::c_void,
p.len(),
flags as libc_::c_uint,
)
};
if r < 0 {
let errno = libc_::get_errno();
if errno == libc_::ENOSYS {
GETRANDOM_UNSUPPORTED.store(1, std::sync::atomic::Ordering::SeqCst);
}
return Err(std::io::Error::new(
std::io::ErrorKind::Other,
format!("errno: {}", errno),
));
}
Ok(r as usize)
}