Skip to content

Commit ac0bf75

Browse files
committed
Use cfg-if to switch init_file implementation
1 parent 2a638fd commit ac0bf75

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

src/use_file.rs

+28-24
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ use crate::Error;
1212

1313
#[cfg(target_os = "redox")]
1414
const FILE_PATH: &str = "rand:\0";
15-
#[cfg(any(target_os = "android", target_os = "linux", target_os = "netbsd"))]
16-
const FILE_PATH: &str = "/dev/urandom\0";
1715
#[cfg(any(
1816
target_os = "dragonfly",
1917
target_os = "emscripten",
@@ -40,32 +38,38 @@ pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> {
4038
Ok(())
4139
}
4240

43-
fn init_file() -> Option<libc::c_int> {
44-
if FILE_PATH == "/dev/urandom\0" {
45-
// Poll /dev/random to make sure it is ok to read from /dev/urandom.
46-
let mut pfd = libc::pollfd {
47-
fd: unsafe { open_readonly("/dev/random\0")? },
48-
events: libc::POLLIN,
49-
revents: 0,
50-
};
41+
cfg_if! {
42+
if #[cfg(any(target_os = "android", target_os = "linux", target_os = "netbsd"))] {
43+
fn init_file() -> Option<libc::c_int> {
44+
// Poll /dev/random to make sure it is ok to read from /dev/urandom.
45+
let mut pfd = libc::pollfd {
46+
fd: unsafe { open_readonly("/dev/random\0")? },
47+
events: libc::POLLIN,
48+
revents: 0,
49+
};
5150

52-
let mut res = -1;
53-
while res <= 0 {
54-
// A negative timeout means an infinite timeout.
55-
res = unsafe { libc::poll(&mut pfd, 1, -1) };
56-
if res < 0 {
57-
match last_os_error().raw_os_error() {
58-
Some(libc::EINTR) | Some(libc::EAGAIN) => {}
59-
_ => break,
51+
let mut res = -1;
52+
while res <= 0 {
53+
// A negative timeout means an infinite timeout.
54+
res = unsafe { libc::poll(&mut pfd, 1, -1) };
55+
if res < 0 {
56+
match last_os_error().raw_os_error() {
57+
Some(libc::EINTR) | Some(libc::EAGAIN) => {}
58+
_ => break,
59+
}
6060
}
6161
}
62-
}
6362

64-
unsafe { libc::close(pfd.fd) };
65-
if res != 1 {
66-
// We either hard failed, or poll() returned the wrong pfd.
67-
return None;
63+
unsafe { libc::close(pfd.fd) };
64+
if res != 1 {
65+
// We either hard failed, or poll() returned the wrong pfd.
66+
return None;
67+
}
68+
unsafe { open_readonly("/dev/urandom\0") }
69+
}
70+
} else {
71+
fn init_file() -> Option<libc::c_int> {
72+
unsafe { open_readonly(FILE_PATH) }
6873
}
6974
}
70-
unsafe { open_readonly(FILE_PATH) }
7175
}

0 commit comments

Comments
 (0)