Commit 7b8c96612f

Euan Torano <euantorano@gmail.com>
2019-08-05 18:21:12
Fix #2993 - use getrandom on freebsd
1 parent 8aa87ec
Changed files (2)
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;
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,