authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-19 22:31:52-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-29 06:20:50-07:00
log894cb5a1fc51e457065d2ec8820863a00e7d96e4
tree94cf6a7a430867e60e47dad01463b58d69fb600d
parent97bde94e360cc95206edca478a9dbbc5a0e75264

std.posix: untangle getRandomBytesDevURandom from Io.Reader


1 files changed, 9 insertions(+), 5 deletions(-)

lib/std/posix.zig+9-5
......@@ -666,18 +666,22 @@ pub fn getrandom(buffer: []u8) GetRandomError!void {
666666 return getRandomBytesDevURandom(buffer);
667667}
668668
669fn getRandomBytesDevURandom(buf: []u8) !void {
669fn getRandomBytesDevURandom(buf: []u8) GetRandomError!void {
670670 const fd = try openZ("/dev/urandom", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0);
671671 defer close(fd);
672672
673 const st = try fstat(fd);
673 const st = fstat(fd) catch |err| switch (err) {
674 error.Streaming => return error.NoDevice,
675 else => |e| return e,
676 };
674677 if (!S.ISCHR(st.mode)) {
675678 return error.NoDevice;
676679 }
677680
678 const file: fs.File = .{ .handle = fd };
679 var file_reader = file.readerStreaming(&.{});
680 file_reader.interface.readSliceAll(buf) catch return error.Unexpected;
681 var i: usize = 0;
682 while (i < buf.len) {
683 i += read(fd, buf[i..]) catch return error.Unexpected;
684 }
681685}
682686
683687/// Causes abnormal process termination.