blob: 69af9a3d4056313c78876c94b82254f585a32ac4 [file] [log] [blame]
//! Wrappers for `getrandom`.
#![allow(unsafe_code)]
use crate::buffer::Buffer;
use crate::{backend, io};
pub use backend::rand::types::GetRandomFlags;
/// `getrandom(buf, flags)`—Reads a sequence of random bytes.
///
/// This is a very low-level API which may be difficult to use correctly. Most
/// users should prefer to use [`getrandom`] or [`rand`] APIs instead.
///
/// This function is implemented using a system call, and not the
/// [vDSO mechanism] introduced in Linux 6.11. See [#1185] for details.
///
/// [`getrandom`]: https://crates.io/crates/getrandom
/// [`rand`]: https://crates.io/crates/rand
/// [vDSO mechanism]: https://lwn.net/Articles/983186/
/// [#1185]: https://github.com/bytecodealliance/rustix/issues/1185
///
/// # References
/// - [Linux]
///
/// [Linux]: https://man7.org/linux/man-pages/man2/getrandom.2.html
#[inline]
pub fn getrandom<Buf: Buffer<u8>>(mut buf: Buf, flags: GetRandomFlags) -> io::Result<Buf::Output> {
// SAFETY: `getrandom` behaves.
let len = unsafe { backend::rand::syscalls::getrandom(buf.parts_mut(), flags)? };
// SAFETY: `getrandom` behaves.
unsafe { Ok(buf.assume_init(len)) }
}