1010
1111pub 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" ) ) ) ]
1428mod 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" ) ]
186188mod 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" ) ]
232231mod 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