From 7b8c96612f1326525c655abe7f7bb0472cbddee1 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Mon, 5 Aug 2019 17:21:12 +0100 Subject: [PATCH] Fix #2993 - use getrandom on freebsd --- std/c/freebsd.zig | 1 + std/os.zig | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index bcc60e65ed..3d5736d37b 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -6,3 +6,4 @@ pub const _errno = __error; pub extern "c" fn getdents(fd: c_int, buf_ptr: [*]u8, nbytes: usize) usize; pub extern "c" fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) c_int; +pub extern "c" fn getrandom(buf_ptr: [*]u8, buf_len: usize, flags: c_uint) c_int; diff --git a/std/os.zig b/std/os.zig index c2010bf6a9..805f7f1645 100644 --- a/std/os.zig +++ b/std/os.zig @@ -120,6 +120,19 @@ pub fn getrandom(buf: []u8) GetRandomError!void { } } } + if (freebsd.is_the_target) { + while (true) { + const err = std.c.getErrno(std.c.getrandom(buf.ptr, buf.len, 0)); + + switch (err) { + 0 => return, + EINVAL => unreachable, + EFAULT => unreachable, + EINTR => continue, + else => return unexpectedErrno(err), + } + } + } if (wasi.is_the_target) { switch (wasi.random_get(buf.ptr, buf.len)) { 0 => return,