diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 4473faf328..d7bfc0d03c 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -666,18 +666,22 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { return getRandomBytesDevURandom(buffer); } -fn getRandomBytesDevURandom(buf: []u8) !void { +fn getRandomBytesDevURandom(buf: []u8) GetRandomError!void { const fd = try openZ("/dev/urandom", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0); defer close(fd); - const st = try fstat(fd); + const st = fstat(fd) catch |err| switch (err) { + error.Streaming => return error.NoDevice, + else => |e| return e, + }; if (!S.ISCHR(st.mode)) { return error.NoDevice; } - const file: fs.File = .{ .handle = fd }; - var file_reader = file.readerStreaming(&.{}); - file_reader.interface.readSliceAll(buf) catch return error.Unexpected; + var i: usize = 0; + while (i < buf.len) { + i += read(fd, buf[i..]) catch return error.Unexpected; + } } /// Causes abnormal process termination.