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