| ... | ... | @@ -144,25 +144,27 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { |
| 144 | 144 | std.c.versionCheck(builtin.Version{ .major = 2, .minor = 25, .patch = 0 }).ok; |
| 145 | 145 | |
| 146 | 146 | while (buf.len != 0) { |
| 147 | | var err: u16 = undefined; |
| 148 | | |
| 149 | | const num_read = if (use_c) blk: { |
| 147 | const res = if (use_c) blk: { |
| 150 | 148 | const rc = std.c.getrandom(buf.ptr, buf.len, 0); |
| 151 | | err = std.c.getErrno(rc); |
| 152 | | break :blk @bitCast(usize, rc); |
| 149 | break :blk .{ |
| 150 | .num_read = @bitCast(usize, rc), |
| 151 | .err = std.c.getErrno(rc), |
| 152 | }; |
| 153 | 153 | } else blk: { |
| 154 | 154 | const rc = linux.getrandom(buf.ptr, buf.len, 0); |
| 155 | | err = linux.getErrno(rc); |
| 156 | | break :blk rc; |
| 155 | break :blk .{ |
| 156 | .num_read = rc, |
| 157 | .err = linux.getErrno(rc), |
| 158 | }; |
| 157 | 159 | }; |
| 158 | 160 | |
| 159 | | switch (err) { |
| 160 | | 0 => buf = buf[num_read..], |
| 161 | switch (res.err) { |
| 162 | 0 => buf = buf[res.num_read..], |
| 161 | 163 | EINVAL => unreachable, |
| 162 | 164 | EFAULT => unreachable, |
| 163 | 165 | EINTR => continue, |
| 164 | 166 | ENOSYS => return getRandomBytesDevURandom(buf), |
| 165 | | else => return unexpectedErrno(err), |
| 167 | else => return unexpectedErrno(res.err), |
| 166 | 168 | } |
| 167 | 169 | } |
| 168 | 170 | return; |
| ... | ... | @@ -1500,7 +1502,7 @@ pub fn getcwd(out_buffer: []u8) GetCwdError![]u8 { |
| 1500 | 1502 | EINVAL => unreachable, |
| 1501 | 1503 | ENOENT => return error.CurrentWorkingDirectoryUnlinked, |
| 1502 | 1504 | ERANGE => return error.NameTooLong, |
| 1503 | | else => return unexpectedErrno(@intCast(usize, err)), |
| 1505 | else => return unexpectedErrno(err), |
| 1504 | 1506 | } |
| 1505 | 1507 | } |
| 1506 | 1508 | |
| ... | ... | @@ -3661,7 +3663,7 @@ pub fn mmap( |
| 3661 | 3663 | const err = if (builtin.link_libc) blk: { |
| 3662 | 3664 | const rc = std.c.mmap(ptr, length, prot, flags, fd, offset); |
| 3663 | 3665 | if (rc != std.c.MAP_FAILED) return @ptrCast([*]align(mem.page_size) u8, @alignCast(mem.page_size, rc))[0..length]; |
| 3664 | | break :blk @intCast(usize, system._errno().*); |
| 3666 | break :blk system._errno().*; |
| 3665 | 3667 | } else blk: { |
| 3666 | 3668 | const rc = system.mmap(ptr, length, prot, flags, fd, offset); |
| 3667 | 3669 | const err = errno(rc); |
| ... | ... | @@ -4321,7 +4323,7 @@ pub fn realpathZ(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealP |
| 4321 | 4323 | ENAMETOOLONG => return error.NameTooLong, |
| 4322 | 4324 | ELOOP => return error.SymLinkLoop, |
| 4323 | 4325 | EIO => return error.InputOutput, |
| 4324 | | else => |err| return unexpectedErrno(@intCast(usize, err)), |
| 4326 | else => |err| return unexpectedErrno(err), |
| 4325 | 4327 | }; |
| 4326 | 4328 | return mem.spanZ(result_path); |
| 4327 | 4329 | } |
| ... | ... | @@ -4622,7 +4624,11 @@ pub const UnexpectedError = error{ |
| 4622 | 4624 | |
| 4623 | 4625 | /// Call this when you made a syscall or something that sets errno |
| 4624 | 4626 | /// and you get an unexpected error. |
| 4625 | | pub fn unexpectedErrno(err: usize) UnexpectedError { |
| 4627 | pub fn unexpectedErrno(err: anytype) UnexpectedError { |
| 4628 | if (@typeInfo(@TypeOf(err)) != .Int) { |
| 4629 | @compileError("err is expected to be an integer"); |
| 4630 | } |
| 4631 | |
| 4626 | 4632 | if (unexpected_error_tracing) { |
| 4627 | 4633 | std.debug.warn("unexpected errno: {d}\n", .{err}); |
| 4628 | 4634 | std.debug.dumpCurrentStackTrace(null); |