1cdb3e2c8Sopenharmony_ci#![allow(dead_code)]
2cdb3e2c8Sopenharmony_ci
3cdb3e2c8Sopenharmony_ciuse std::ffi::OsString;
4cdb3e2c8Sopenharmony_ci#[cfg(unix)]
5cdb3e2c8Sopenharmony_ciuse std::os::unix::ffi::OsStringExt;
6cdb3e2c8Sopenharmony_ci#[cfg(windows)]
7cdb3e2c8Sopenharmony_ciuse std::os::windows::ffi::OsStringExt;
8cdb3e2c8Sopenharmony_ci#[cfg(windows)]
9cdb3e2c8Sopenharmony_ciuse std::slice;
10cdb3e2c8Sopenharmony_ci
11cdb3e2c8Sopenharmony_ciuse getrandom::getrandom;
12cdb3e2c8Sopenharmony_ci
13cdb3e2c8Sopenharmony_cipub(crate) const SMALL_LENGTH: usize = 16;
14cdb3e2c8Sopenharmony_ci
15cdb3e2c8Sopenharmony_cipub(crate) const ITERATIONS: usize = 1024;
16cdb3e2c8Sopenharmony_ci
17cdb3e2c8Sopenharmony_cipub(crate) fn random_os_string(
18cdb3e2c8Sopenharmony_ci    buffer_length: usize,
19cdb3e2c8Sopenharmony_ci) -> Result<OsString, getrandom::Error> {
20cdb3e2c8Sopenharmony_ci    let mut buffer = vec![0; buffer_length];
21cdb3e2c8Sopenharmony_ci    #[cfg(unix)]
22cdb3e2c8Sopenharmony_ci    {
23cdb3e2c8Sopenharmony_ci        getrandom(&mut buffer)?;
24cdb3e2c8Sopenharmony_ci        Ok(OsStringExt::from_vec(buffer))
25cdb3e2c8Sopenharmony_ci    }
26cdb3e2c8Sopenharmony_ci    #[cfg(windows)]
27cdb3e2c8Sopenharmony_ci    {
28cdb3e2c8Sopenharmony_ci        fn as_mut_bytes(buffer: &mut [u16]) -> &mut [u8] {
29cdb3e2c8Sopenharmony_ci            // SAFETY: [u16] can always be transmuted to two [u8] bytes.
30cdb3e2c8Sopenharmony_ci            unsafe {
31cdb3e2c8Sopenharmony_ci                slice::from_raw_parts_mut(
32cdb3e2c8Sopenharmony_ci                    buffer.as_mut_ptr().cast(),
33cdb3e2c8Sopenharmony_ci                    buffer.len() * 2,
34cdb3e2c8Sopenharmony_ci                )
35cdb3e2c8Sopenharmony_ci            }
36cdb3e2c8Sopenharmony_ci        }
37cdb3e2c8Sopenharmony_ci
38cdb3e2c8Sopenharmony_ci        getrandom(as_mut_bytes(&mut buffer))?;
39cdb3e2c8Sopenharmony_ci        Ok(OsStringExt::from_wide(&buffer))
40cdb3e2c8Sopenharmony_ci    }
41cdb3e2c8Sopenharmony_ci}
42