diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-07-08 14:26:40 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-07-08 14:42:28 -0400 |
| commit | fc9e28ea37e0110836d6958c39ffe78ea6cad0f3 (patch) | |
| tree | 0245c64ed4119fa2054cbed785abc9a90695391e /std/os.zig | |
| parent | 4953e84902df3467b6d7491532e48bf33b5e56b9 (diff) | |
| download | zig-fc9e28ea37e0110836d6958c39ffe78ea6cad0f3.tar.gz zig-fc9e28ea37e0110836d6958c39ffe78ea6cad0f3.zip | |
std.os.getrandom does a libc version check
closes #397
Diffstat (limited to 'std/os.zig')
| -rw-r--r-- | std/os.zig | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/std/os.zig b/std/os.zig index e9e9c89b4c..1971b51df4 100644 --- a/std/os.zig +++ b/std/os.zig @@ -105,14 +105,18 @@ pub fn getrandom(buf: []u8) GetRandomError!void { } if (linux.is_the_target) { while (true) { - // Bypass libc because it's missing on even relatively new versions. - switch (linux.getErrno(linux.getrandom(buf.ptr, buf.len, 0))) { + const err = if (std.c.versionCheck(builtin.Version{ .major = 2, .minor = 25, .patch = 0 }).ok) blk: { + break :blk errno(std.c.getrandom(buf.ptr, buf.len, 0)); + } else blk: { + break :blk linux.getErrno(linux.getrandom(buf.ptr, buf.len, 0)); + }; + switch (err) { 0 => return, EINVAL => unreachable, EFAULT => unreachable, EINTR => continue, ENOSYS => return getRandomBytesDevURandom(buf), - else => |err| return unexpectedErrno(err), + else => return unexpectedErrno(err), } } } |
