summaryrefslogtreecommitdiffstats
path: root/vendor/rustix/src/imp/libc/rand/syscalls.rs
blob: 1c4286235630a0287e47a50b8c283031edcb6642 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//! libc syscalls supporting `rustix::rand`.

#[cfg(target_os = "linux")]
use {super::super::c, super::super::conv::ret_ssize_t, crate::io, crate::rand::GetRandomFlags};

#[cfg(target_os = "linux")]
pub(crate) fn getrandom(buf: &mut [u8], flags: GetRandomFlags) -> io::Result<usize> {
    // `getrandom` wasn't supported in glibc until 2.25.
    weak_or_syscall! {
        fn getrandom(buf: *mut c::c_void, buflen: c::size_t, flags: c::c_uint) via SYS_getrandom -> c::ssize_t
    }

    let nread =
        unsafe { ret_ssize_t(getrandom(buf.as_mut_ptr().cast(), buf.len(), flags.bits()))? };
    Ok(nread as usize)
}