| ... | ... | @@ -666,18 +666,22 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { |
| 666 | 666 | return getRandomBytesDevURandom(buffer); |
| 667 | 667 | } |
| 668 | 668 | |
| 669 | | fn getRandomBytesDevURandom(buf: []u8) !void { |
| 669 | fn getRandomBytesDevURandom(buf: []u8) GetRandomError!void { |
| 670 | 670 | const fd = try openZ("/dev/urandom", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0); |
| 671 | 671 | defer close(fd); |
| 672 | 672 | |
| 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 | }; |
| 674 | 677 | if (!S.ISCHR(st.mode)) { |
| 675 | 678 | return error.NoDevice; |
| 676 | 679 | } |
| 677 | 680 | |
| 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 | } |
| 681 | 685 | } |
| 682 | 686 | |
| 683 | 687 | /// Causes abnormal process termination. |