about summary refs log tree commit diff
path: root/src/libstd/sys
diff options
context:
space:
mode:
authorJeremy Soller <jackpot51@gmail.com>2016-11-10 20:37:34 -0700
committerJeremy Soller <jackpot51@gmail.com>2016-11-10 20:37:34 -0700
commit0bb9a959074bb7f027cf05a240a0044116fa0ab0 (patch)
tree69fca65cd12f30f97f8bcfd403b39577f2ce3c57 /src/libstd/sys
parent25e1a4a0084a56807d7a1e4ca676e078c085b3aa (diff)
parent1473007618e6ab85a994f86348acdaf125b7914f (diff)
downloadrust-0bb9a959074bb7f027cf05a240a0044116fa0ab0.tar.gz
rust-0bb9a959074bb7f027cf05a240a0044116fa0ab0.zip
Merge branch 'master' into redox
Diffstat (limited to 'src/libstd/sys')
-rw-r--r--src/libstd/sys/mod.rs2
-rw-r--r--src/libstd/sys/unix/rand.rs28
2 files changed, 21 insertions, 9 deletions
diff --git a/src/libstd/sys/mod.rs b/src/libstd/sys/mod.rs
index a237d8a067e..e4b0d980c92 100644
--- a/src/libstd/sys/mod.rs
+++ b/src/libstd/sys/mod.rs
@@ -23,7 +23,7 @@
 //! integration code in `std::sys_common`. See that module's
 //! documentation for details.
 //!
-//! In the future it would be desirable for the indepedent
+//! In the future it would be desirable for the independent
 //! implementations of this module to be extracted to their own crates
 //! that `std` can link to, thus enabling their implementation
 //! out-of-tree via crate replacement. Though due to the complex
diff --git a/src/libstd/sys/unix/rand.rs b/src/libstd/sys/unix/rand.rs
index 3aebb8c18ec..9b1cf6ffd0e 100644
--- a/src/libstd/sys/unix/rand.rs
+++ b/src/libstd/sys/unix/rand.rs
@@ -350,11 +350,19 @@ mod imp {
 
     #[link(name = "magenta")]
     extern {
-        fn mx_cprng_draw(buffer: *mut u8, len: usize) -> isize;
+        fn mx_cprng_draw(buffer: *mut u8, len: usize, actual: *mut usize) -> i32;
     }
 
-    fn getrandom(buf: &mut [u8]) -> isize {
-        unsafe { mx_cprng_draw(buf.as_mut_ptr(), buf.len()) }
+    fn getrandom(buf: &mut [u8]) -> Result<usize, i32> {
+        unsafe {
+            let mut actual = 0;
+            let status = mx_cprng_draw(buf.as_mut_ptr(), buf.len(), &mut actual);
+            if status == 0 {
+                Ok(actual)
+            } else {
+                Err(status)
+            }
+        }
     }
 
     pub struct OsRng {
@@ -381,12 +389,16 @@ mod imp {
             let mut buf = v;
             while !buf.is_empty() {
                 let ret = getrandom(buf);
-                if ret < 0 {
-                    panic!("kernel mx_cprng_draw call failed! (returned {}, buf.len() {})",
-                        ret, buf.len());
+                match ret {
+                    Err(err) => {
+                        panic!("kernel mx_cprng_draw call failed! (returned {}, buf.len() {})",
+                            err, buf.len())
+                    }
+                    Ok(actual) => {
+                        let move_buf = buf;
+                        buf = &mut move_buf[(actual as usize)..];
+                    }
                 }
-                let move_buf = buf;
-                buf = &mut move_buf[(ret as usize)..];
             }
         }
     }