Reduce duplication in std::sys::unix::rand.
There were a bunch of more-of-less the same few lines for doing a fill_bytes+transmute, and I didn't want to copy-paste it yet again.
This commit is contained in:
@@ -10,14 +10,28 @@
|
|||||||
|
|
||||||
pub use self::imp::OsRng;
|
pub use self::imp::OsRng;
|
||||||
|
|
||||||
|
use mem;
|
||||||
|
|
||||||
|
fn next_u32(mut fill_buf: &mut FnMut(&mut [u8])) -> u32 {
|
||||||
|
let mut buf: [u8; 4] = [0; 4];
|
||||||
|
fill_buf(&mut buf);
|
||||||
|
unsafe { mem::transmute::<[u8; 4], u32>(buf) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_u64(mut fill_buf: &mut FnMut(&mut [u8])) -> u64 {
|
||||||
|
let mut buf: [u8; 8] = [0; 8];
|
||||||
|
fill_buf(&mut buf);
|
||||||
|
unsafe { mem::transmute::<[u8; 8], u64>(buf) }
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(all(unix, not(target_os = "ios"), not(target_os = "openbsd")))]
|
#[cfg(all(unix, not(target_os = "ios"), not(target_os = "openbsd")))]
|
||||||
mod imp {
|
mod imp {
|
||||||
use self::OsRngInner::*;
|
use self::OsRngInner::*;
|
||||||
|
use super::{next_u32, next_u64};
|
||||||
|
|
||||||
use fs::File;
|
use fs::File;
|
||||||
use io;
|
use io;
|
||||||
use libc;
|
use libc;
|
||||||
use mem;
|
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use rand::reader::ReaderRng;
|
use rand::reader::ReaderRng;
|
||||||
use sys::os::errno;
|
use sys::os::errno;
|
||||||
@@ -87,18 +101,6 @@ mod imp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn getrandom_next_u32() -> u32 {
|
|
||||||
let mut buf: [u8; 4] = [0; 4];
|
|
||||||
getrandom_fill_bytes(&mut buf);
|
|
||||||
unsafe { mem::transmute::<[u8; 4], u32>(buf) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn getrandom_next_u64() -> u64 {
|
|
||||||
let mut buf: [u8; 8] = [0; 8];
|
|
||||||
getrandom_fill_bytes(&mut buf);
|
|
||||||
unsafe { mem::transmute::<[u8; 8], u64>(buf) }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(all(target_os = "linux",
|
#[cfg(all(target_os = "linux",
|
||||||
any(target_arch = "x86_64",
|
any(target_arch = "x86_64",
|
||||||
target_arch = "x86",
|
target_arch = "x86",
|
||||||
@@ -163,13 +165,13 @@ mod imp {
|
|||||||
impl Rng for OsRng {
|
impl Rng for OsRng {
|
||||||
fn next_u32(&mut self) -> u32 {
|
fn next_u32(&mut self) -> u32 {
|
||||||
match self.inner {
|
match self.inner {
|
||||||
OsGetrandomRng => getrandom_next_u32(),
|
OsGetrandomRng => next_u32(&mut getrandom_fill_bytes),
|
||||||
OsReaderRng(ref mut rng) => rng.next_u32(),
|
OsReaderRng(ref mut rng) => rng.next_u32(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn next_u64(&mut self) -> u64 {
|
fn next_u64(&mut self) -> u64 {
|
||||||
match self.inner {
|
match self.inner {
|
||||||
OsGetrandomRng => getrandom_next_u64(),
|
OsGetrandomRng => next_u64(&mut getrandom_fill_bytes),
|
||||||
OsReaderRng(ref mut rng) => rng.next_u64(),
|
OsReaderRng(ref mut rng) => rng.next_u64(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,9 +186,10 @@ mod imp {
|
|||||||
|
|
||||||
#[cfg(target_os = "openbsd")]
|
#[cfg(target_os = "openbsd")]
|
||||||
mod imp {
|
mod imp {
|
||||||
|
use super::{next_u32, next_u64};
|
||||||
|
|
||||||
use io;
|
use io;
|
||||||
use libc;
|
use libc;
|
||||||
use mem;
|
|
||||||
use sys::os::errno;
|
use sys::os::errno;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
@@ -205,14 +208,10 @@ mod imp {
|
|||||||
|
|
||||||
impl Rng for OsRng {
|
impl Rng for OsRng {
|
||||||
fn next_u32(&mut self) -> u32 {
|
fn next_u32(&mut self) -> u32 {
|
||||||
let mut v = [0; 4];
|
next_u32(&mut |v| self.fill_bytes(v))
|
||||||
self.fill_bytes(&mut v);
|
|
||||||
unsafe { mem::transmute(v) }
|
|
||||||
}
|
}
|
||||||
fn next_u64(&mut self) -> u64 {
|
fn next_u64(&mut self) -> u64 {
|
||||||
let mut v = [0; 8];
|
next_u64(&mut |v| self.fill_bytes(v))
|
||||||
self.fill_bytes(&mut v);
|
|
||||||
unsafe { mem::transmute(v) }
|
|
||||||
}
|
}
|
||||||
fn fill_bytes(&mut self, v: &mut [u8]) {
|
fn fill_bytes(&mut self, v: &mut [u8]) {
|
||||||
// getentropy(2) permits a maximum buffer size of 256 bytes
|
// getentropy(2) permits a maximum buffer size of 256 bytes
|
||||||
@@ -230,8 +229,9 @@ mod imp {
|
|||||||
|
|
||||||
#[cfg(target_os = "ios")]
|
#[cfg(target_os = "ios")]
|
||||||
mod imp {
|
mod imp {
|
||||||
|
use super::{next_u32, next_u64};
|
||||||
|
|
||||||
use io;
|
use io;
|
||||||
use mem;
|
|
||||||
use ptr;
|
use ptr;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use libc::{c_int, size_t};
|
use libc::{c_int, size_t};
|
||||||
@@ -265,14 +265,10 @@ mod imp {
|
|||||||
|
|
||||||
impl Rng for OsRng {
|
impl Rng for OsRng {
|
||||||
fn next_u32(&mut self) -> u32 {
|
fn next_u32(&mut self) -> u32 {
|
||||||
let mut v = [0; 4];
|
next_u32(&mut |v| self.fill_bytes(v))
|
||||||
self.fill_bytes(&mut v);
|
|
||||||
unsafe { mem::transmute(v) }
|
|
||||||
}
|
}
|
||||||
fn next_u64(&mut self) -> u64 {
|
fn next_u64(&mut self) -> u64 {
|
||||||
let mut v = [0; 8];
|
next_u64(&mut |v| self.fill_bytes(v))
|
||||||
self.fill_bytes(&mut v);
|
|
||||||
unsafe { mem::transmute(v) }
|
|
||||||
}
|
}
|
||||||
fn fill_bytes(&mut self, v: &mut [u8]) {
|
fn fill_bytes(&mut self, v: &mut [u8]) {
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
|
|||||||
Reference in New Issue
Block a user