--- customize/urandom.ml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/customize/urandom.ml b/customize/urandom.ml index fd8cc8e8f..ff5d028d4 100644 --- a/customize/urandom.ml +++ b/customize/urandom.ml @@ -26,13 +26,12 @@ open Unix -let open_urandom_fd () = openfile "/dev/urandom" [O_RDONLY; O_CLOEXEC] 0 +open Std_utils let read_byte fd = let b = Bytes.make 1 ' ' in fun () -> if read fd b 0 1 = 0 then ( - close fd; raise End_of_file ); Char.code (Bytes.unsafe_get b 0) @@ -40,11 +39,12 @@ let read_byte fd = let urandom_bytes n = assert (n > 0); let ret = Bytes.make n ' ' in - let fd = open_urandom_fd () in - for i = 0 to n-1 do - Bytes.unsafe_set ret i (Char.chr (read_byte fd ())) - done; - close fd; + with_openfile "/dev/urandom" [O_RDONLY; O_CLOEXEC] 0 ( + fun fd -> + for i = 0 to n-1 do + Bytes.unsafe_set ret i (Char.chr (read_byte fd ())) + done + ); Bytes.to_string ret (* Return a random number uniformly distributed in [0, upper_bound) @@ -61,9 +61,11 @@ let urandom_uniform n chars = assert (nr_chars > 0); let ret = Bytes.make n ' ' in - let fd = open_urandom_fd () in - for i = 0 to n-1 do - Bytes.unsafe_set ret i (chars.[uniform_random (read_byte fd) nr_chars]) - done; - close fd; + with_openfile "/dev/urandom" [O_RDONLY; O_CLOEXEC] 0 ( + fun fd -> + for i = 0 to n-1 do + Bytes.unsafe_set ret i + (chars.[uniform_random (read_byte fd) nr_chars]) + done + ); Bytes.to_string ret -- 2.13.2