aboutsummaryrefslogtreecommitdiff
path: root/std/os.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-07-08 14:26:40 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-07-08 14:42:28 -0400
commitfc9e28ea37e0110836d6958c39ffe78ea6cad0f3 (patch)
tree0245c64ed4119fa2054cbed785abc9a90695391e /std/os.zig
parent4953e84902df3467b6d7491532e48bf33b5e56b9 (diff)
downloadzig-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.zig10
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),
}
}
}