Skip to content

Commit ef6aab2

Browse files
committed
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.
1 parent 1576de0 commit ef6aab2

File tree

1 file changed

+25
-29
lines changed

1 file changed

+25
-29
lines changed

src/libstd/sys/unix/rand.rs

+25-29
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,28 @@
1010

1111
pub use self::imp::OsRng;
1212

13+
use mem;
14+
15+
fn next_u32(mut fill_buf: &mut FnMut(&mut [u8])) -> u32 {
16+
let mut buf: [u8; 4] = [0; 4];
17+
fill_buf(&mut buf);
18+
unsafe { mem::transmute::<[u8; 4], u32>(buf) }
19+
}
20+
21+
fn next_u64(mut fill_buf: &mut FnMut(&mut [u8])) -> u64 {
22+
let mut buf: [u8; 8] = [0; 8];
23+
fill_buf(&mut buf);
24+
unsafe { mem::transmute::<[u8; 8], u64>(buf) }
25+
}
26+
1327
#[cfg(all(unix, not(target_os = "ios"), not(target_os = "openbsd")))]
1428
mod imp {
1529
use self::OsRngInner::*;
30+
use super::{next_u32, next_u64};
1631

1732
use fs::File;
1833
use io;
1934
use libc;
20-
use mem;
2135
use rand::Rng;
2236
use rand::reader::ReaderRng;
2337
use sys::os::errno;
@@ -87,18 +101,6 @@ mod imp {
87101
}
88102
}
89103

90-
fn getrandom_next_u32() -> u32 {
91-
let mut buf: [u8; 4] = [0; 4];
92-
getrandom_fill_bytes(&mut buf);
93-
unsafe { mem::transmute::<[u8; 4], u32>(buf) }
94-
}
95-
96-
fn getrandom_next_u64() -> u64 {
97-
let mut buf: [u8; 8] = [0; 8];
98-
getrandom_fill_bytes(&mut buf);
99-
unsafe { mem::transmute::<[u8; 8], u64>(buf) }
100-
}
101-
102104
#[cfg(all(target_os = "linux",
103105
any(target_arch = "x86_64",
104106
target_arch = "x86",
@@ -163,13 +165,13 @@ mod imp {
163165
impl Rng for OsRng {
164166
fn next_u32(&mut self) -> u32 {
165167
match self.inner {
166-
OsGetrandomRng => getrandom_next_u32(),
168+
OsGetrandomRng => next_u32(&mut getrandom_fill_bytes),
167169
OsReaderRng(ref mut rng) => rng.next_u32(),
168170
}
169171
}
170172
fn next_u64(&mut self) -> u64 {
171173
match self.inner {
172-
OsGetrandomRng => getrandom_next_u64(),
174+
OsGetrandomRng => next_u64(&mut getrandom_fill_bytes),
173175
OsReaderRng(ref mut rng) => rng.next_u64(),
174176
}
175177
}
@@ -184,9 +186,10 @@ mod imp {
184186

185187
#[cfg(target_os = "openbsd")]
186188
mod imp {
189+
use super::{next_u32, next_u64};
190+
187191
use io;
188192
use libc;
189-
use mem;
190193
use sys::os::errno;
191194
use rand::Rng;
192195

@@ -205,14 +208,10 @@ mod imp {
205208

206209
impl Rng for OsRng {
207210
fn next_u32(&mut self) -> u32 {
208-
let mut v = [0; 4];
209-
self.fill_bytes(&mut v);
210-
unsafe { mem::transmute(v) }
211+
next_u32(&mut |v| self.fill_bytes(v))
211212
}
212213
fn next_u64(&mut self) -> u64 {
213-
let mut v = [0; 8];
214-
self.fill_bytes(&mut v);
215-
unsafe { mem::transmute(v) }
214+
next_u64(&mut |v| self.fill_bytes(v))
216215
}
217216
fn fill_bytes(&mut self, v: &mut [u8]) {
218217
// getentropy(2) permits a maximum buffer size of 256 bytes
@@ -230,8 +229,9 @@ mod imp {
230229

231230
#[cfg(target_os = "ios")]
232231
mod imp {
232+
use super::{next_u32, next_u64};
233+
233234
use io;
234-
use mem;
235235
use ptr;
236236
use rand::Rng;
237237
use libc::{c_int, size_t};
@@ -265,14 +265,10 @@ mod imp {
265265

266266
impl Rng for OsRng {
267267
fn next_u32(&mut self) -> u32 {
268-
let mut v = [0; 4];
269-
self.fill_bytes(&mut v);
270-
unsafe { mem::transmute(v) }
268+
next_u32(&mut |v| self.fill_bytes(v))
271269
}
272270
fn next_u64(&mut self) -> u64 {
273-
let mut v = [0; 8];
274-
self.fill_bytes(&mut v);
275-
unsafe { mem::transmute(v) }
271+
next_u64(&mut |v| self.fill_bytes(v))
276272
}
277273
fn fill_bytes(&mut self, v: &mut [u8]) {
278274
let ret = unsafe {

0 commit comments

Comments
 (0)