34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
//! 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)) }
|
|
}
|