aboutsummaryrefslogtreecommitdiff
path: root/ctr-std/src/sys
diff options
context:
space:
mode:
authorRonald Kinard <[email protected]>2017-03-12 13:22:57 -0500
committerGitHub <[email protected]>2017-03-12 13:22:57 -0500
commit2b547ce605c4a812fc31d3ffdcf28df2246f5dc0 (patch)
treeb473518c4a7c99a51443abce9a86ba9fac04c8c3 /ctr-std/src/sys
parentMerge pull request #28 from FenrirWolf/fs (diff)
parentAdd HashMap and HashSet (diff)
downloadctru-rs-2b547ce605c4a812fc31d3ffdcf28df2246f5dc0.tar.xz
ctru-rs-2b547ce605c4a812fc31d3ffdcf28df2246f5dc0.zip
Merge pull request #27 from FenrirWolf/hashmap
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() }
+ }
+}