-
Notifications
You must be signed in to change notification settings - Fork 256
Expand file tree
/
Copy pathhermit.rs
More file actions
21 lines (19 loc) · 769 Bytes
/
hermit.rs
File metadata and controls
21 lines (19 loc) · 769 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use crate::Error;
use core::{cmp::min, mem::MaybeUninit, num::NonZeroU32};
extern "C" {
fn sys_read_entropy(buffer: *mut u8, length: usize, flags: u32) -> isize;
}
pub fn getrandom_inner(mut dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
while !dest.is_empty() {
let res = unsafe { sys_read_entropy(dest.as_mut_ptr() as *mut u8, dest.len(), 0) };
if res < 0 {
// SAFETY: all Hermit error codes use i32 under the hood:
// https://github.com/hermitcore/libhermit-rs/blob/master/src/errno.rs
let code = unsafe { NonZeroU32::new_unchecked((-res) as u32) };
return Err(code.into());
}
let len = min(res as usize, dest.len());
dest = &mut dest[len..];
}
Ok(())
}