authorgravatar for git@l4.pmluna <git@l4.pm> 2020-12-22 18:47:11-03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-12-22 16:47:11-05:00
log6a75cfd0f6d45de3b4d1ad74eaec892dc1cd6e30
treeafdcfa48b211d5ea9ebde4b09f9868f403c72765
parent43dbe86226fe89c6364fa0261297f1a9d8eb2a58
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

cast sendto to SendError inside send (#7481)

* cast sendto to SendError inside send * remove WouldBlock from SendToError * add missing ENOTCONN mapping * remove SystemResources duplicate * move NetworkUnreachable to SendError * add NetworkSubsystemFailed to SendError * Use zig's implicit error set casting Co-authored-by: Andrew Kelley <andrew@ziglang.org>

2 files changed, 22 insertions(+), 10 deletions(-)

lib/std/fs/file.zig+2
......@@ -698,6 +698,8 @@ pub const File = struct {
698698 error.FastOpenAlreadyInProgress,
699699 error.MessageTooBig,
700700 error.FileDescriptorNotASocket,
701 error.NetworkUnreachable,
702 error.NetworkSubsystemFailed,
701703 => return self.writeFileAllUnseekable(in_file, args),
702704
703705 else => |e| return e,
lib/std/os.zig+20-10
......@@ -4774,6 +4774,12 @@ pub const SendError = error{
47744774 BrokenPipe,
47754775
47764776 FileDescriptorNotASocket,
4777
4778 /// Network is unreachable.
4779 NetworkUnreachable,
4780
4781 /// The local network interface used to reach the destination is down.
4782 NetworkSubsystemFailed,
47774783} || UnexpectedError;
47784784
47794785pub const SendToError = SendError || error{
......@@ -4790,15 +4796,8 @@ pub const SendToError = SendError || error{
47904796 FileNotFound,
47914797 NotDir,
47924798
4793 /// Network is unreachable.
4794 NetworkUnreachable,
4795
4796 /// Insufficient memory was available to fulfill the request.
4797 SystemResources,
4798
47994799 /// The socket is not connected (connection-oriented sockets only).
48004800 SocketNotConnected,
4801 WouldBlock,
48024801 AddressNotAvailable,
48034802};
48044803
......@@ -4853,7 +4852,7 @@ pub fn sendto(
48534852 .WSAEHOSTUNREACH => return error.NetworkUnreachable,
48544853 // TODO: WSAEINPROGRESS, WSAEINTR
48554854 .WSAEINVAL => unreachable,
4856 .WSAENETDOWN => return error.NetworkUnreachable,
4855 .WSAENETDOWN => return error.NetworkSubsystemFailed,
48574856 .WSAENETRESET => return error.ConnectionResetByPeer,
48584857 .WSAENETUNREACH => return error.NetworkUnreachable,
48594858 .WSAENOTCONN => return error.SocketNotConnected,
......@@ -4882,7 +4881,6 @@ pub fn sendto(
48824881 EMSGSIZE => return error.MessageTooBig,
48834882 ENOBUFS => return error.SystemResources,
48844883 ENOMEM => return error.SystemResources,
4885 ENOTCONN => unreachable, // The socket is not connected, and no target has been given.
48864884 ENOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket.
48874885 EOPNOTSUPP => unreachable, // Some bit in the flags argument is inappropriate for the socket type.
48884886 EPIPE => return error.BrokenPipe,
......@@ -4892,6 +4890,9 @@ pub fn sendto(
48924890 ENOENT => return error.FileNotFound,
48934891 ENOTDIR => return error.NotDir,
48944892 EHOSTUNREACH => return error.NetworkUnreachable,
4893 ENETUNREACH => return error.NetworkUnreachable,
4894 ENOTCONN => return error.SocketNotConnected,
4895 ENETDOWN => return error.NetworkSubsystemFailed,
48954896 else => |err| return unexpectedErrno(err),
48964897 }
48974898 }
......@@ -4923,7 +4924,16 @@ pub fn send(
49234924 buf: []const u8,
49244925 flags: u32,
49254926) SendError!usize {
4926 return sendto(sockfd, buf, flags, null, 0);
4927 return sendto(sockfd, buf, flags, null, 0) catch |err| switch (err) {
4928 error.AddressFamilyNotSupported => unreachable,
4929 error.SymLinkLoop => unreachable,
4930 error.NameTooLong => unreachable,
4931 error.FileNotFound => unreachable,
4932 error.NotDir => unreachable,
4933 error.NetworkUnreachable => unreachable,
4934 error.AddressNotAvailable => unreachable,
4935 else => |e| return e,
4936 };
49274937}
49284938
49294939pub const SendFileError = PReadError || WriteError || SendError;