aboutsummaryrefslogtreecommitdiff
path: root/ctr-std/src/sys
diff options
context:
space:
mode:
authorFenrir <[email protected]>2017-03-07 21:00:18 -0700
committerFenrir <[email protected]>2017-03-11 22:32:55 -0700
commit78754eb2903b68ad58c69befe9cc3420425facac (patch)
treeb473518c4a7c99a51443abce9a86ba9fac04c8c3 /ctr-std/src/sys
parentMerge pull request #28 from FenrirWolf/fs (diff)
downloadctru-rs-78754eb2903b68ad58c69befe9cc3420425facac.tar.xz
ctru-rs-78754eb2903b68ad58c69befe9cc3420425facac.zip
Add HashMap and HashSet
Diffstat (limited to 'ctr-std/src/sys')
-rw-r--r--ctr-std/src/sys/unix/mod.rs1
-rw-r--r--ctr-std/src/sys/unix/rand.rs54
2 files changed, 55 insertions, 0 deletions
diff --git a/ctr-std/src/sys/unix/mod.rs b/ctr-std/src/sys/unix/mod.rs
index 5e44d34..4ac7a22 100644
--- a/ctr-std/src/sys/unix/mod.rs
+++ b/ctr-std/src/sys/unix/mod.rs
@@ -26,6 +26,7 @@ pub mod os_str;
pub mod path;
pub mod rwlock;
pub mod thread;
+pub mod rand;
pub mod thread_local;
pub mod time;
diff --git a/ctr-std/src/sys/unix/rand.rs b/ctr-std/src/sys/unix/rand.rs
new file mode 100644
index 0000000..7fdc166
--- /dev/null
+++ b/ctr-std/src/sys/unix/rand.rs
@@ -0,0 +1,54 @@
+// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use io::{self, Error, ErrorKind};
+use mem;
+use rand::Rng;
+
+use libctru::services::sslc::{sslcInit, sslcExit, sslcGenerateRandomData};
+
+pub struct OsRng(());
+
+impl OsRng {
+ pub fn new() -> io::Result<OsRng> {
+ unsafe {
+ let r = sslcInit(0);
+ if r < 0 {
+ Err(Error::new(ErrorKind::Other, "Unable to initialize the RNG"))
+ } else {
+ Ok(OsRng(()))
+ }
+ }
+ }
+}
+
+impl Rng for OsRng {
+ fn next_u32(&mut self) -> u32 {
+ let mut v = [0; 4];
+ self.fill_bytes(&mut v);
+ unsafe { mem::transmute(v) }
+ }
+
+ fn next_u64(&mut self) -> u64 {
+ let mut v = [0; 8];
+ self.fill_bytes(&mut v);
+ unsafe { mem::transmute(v) }
+ }
+
+ fn fill_bytes(&mut self, v: &mut [u8]) {
+ unsafe { sslcGenerateRandomData(v.as_ptr() as _, v.len() as u32); }
+ }
+}
+
+impl Drop for OsRng {
+ fn drop(&mut self) {
+ unsafe { sslcExit() }
+ }
+}