authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-17 00:09:25-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-29 06:20:50-07:00
loge87ceb76c242cf991f85c9aa6619f5faf4059af3
tree10ad0dc4c5f56c74d5a387cfab9c311c41274873
parentcf6fa219fd05b9f2c01e85557bcd140e72802459

std.Io.net.Server: refine AcceptError set


3 files changed, 60 insertions(+), 76 deletions(-)

lib/std/Io/Threaded.zig+39-37
...@@ -898,7 +898,7 @@ fn dirMakePosix(userdata: ?*anyopaque, dir: Io.Dir, sub_path: []const u8, mode:...@@ -898,7 +898,7 @@ fn dirMakePosix(userdata: ?*anyopaque, dir: Io.Dir, sub_path: []const u8, mode:
898 .CANCELED => return error.Canceled,898 .CANCELED => return error.Canceled,
899899
900 .ACCES => return error.AccessDenied,900 .ACCES => return error.AccessDenied,
901 .BADF => |err| return errnoBug(err),901 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
902 .PERM => return error.PermissionDenied,902 .PERM => return error.PermissionDenied,
903 .DQUOT => return error.DiskQuota,903 .DQUOT => return error.DiskQuota,
904 .EXIST => return error.PathAlreadyExists,904 .EXIST => return error.PathAlreadyExists,
...@@ -930,7 +930,7 @@ fn dirMakeWasi(userdata: ?*anyopaque, dir: Io.Dir, sub_path: []const u8, mode: I...@@ -930,7 +930,7 @@ fn dirMakeWasi(userdata: ?*anyopaque, dir: Io.Dir, sub_path: []const u8, mode: I
930 .CANCELED => return error.Canceled,930 .CANCELED => return error.Canceled,
931931
932 .ACCES => return error.AccessDenied,932 .ACCES => return error.AccessDenied,
933 .BADF => |err| return errnoBug(err),933 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
934 .PERM => return error.PermissionDenied,934 .PERM => return error.PermissionDenied,
935 .DQUOT => return error.DiskQuota,935 .DQUOT => return error.DiskQuota,
936 .EXIST => return error.PathAlreadyExists,936 .EXIST => return error.PathAlreadyExists,
...@@ -989,7 +989,7 @@ fn dirStatPathLinux(...@@ -989,7 +989,7 @@ fn dirStatPathLinux(
989 .CANCELED => return error.Canceled,989 .CANCELED => return error.Canceled,
990990
991 .ACCES => return error.AccessDenied,991 .ACCES => return error.AccessDenied,
992 .BADF => |err| return errnoBug(err),992 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
993 .FAULT => |err| return errnoBug(err),993 .FAULT => |err| return errnoBug(err),
994 .INVAL => |err| return errnoBug(err),994 .INVAL => |err| return errnoBug(err),
995 .LOOP => return error.SymLinkLoop,995 .LOOP => return error.SymLinkLoop,
...@@ -1024,7 +1024,7 @@ fn dirStatPathPosix(...@@ -1024,7 +1024,7 @@ fn dirStatPathPosix(
1024 .CANCELED => return error.Canceled,1024 .CANCELED => return error.Canceled,
10251025
1026 .INVAL => |err| return errnoBug(err),1026 .INVAL => |err| return errnoBug(err),
1027 .BADF => |err| return errnoBug(err), // Always a race condition.1027 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1028 .NOMEM => return error.SystemResources,1028 .NOMEM => return error.SystemResources,
1029 .ACCES => return error.AccessDenied,1029 .ACCES => return error.AccessDenied,
1030 .PERM => return error.PermissionDenied,1030 .PERM => return error.PermissionDenied,
...@@ -1060,7 +1060,7 @@ fn dirStatPathWasi(...@@ -1060,7 +1060,7 @@ fn dirStatPathWasi(
1060 .CANCELED => return error.Canceled,1060 .CANCELED => return error.Canceled,
10611061
1062 .INVAL => |err| return errnoBug(err),1062 .INVAL => |err| return errnoBug(err),
1063 .BADF => |err| return errnoBug(err), // Always a race condition.1063 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1064 .NOMEM => return error.SystemResources,1064 .NOMEM => return error.SystemResources,
1065 .ACCES => return error.AccessDenied,1065 .ACCES => return error.AccessDenied,
1066 .FAULT => |err| return errnoBug(err),1066 .FAULT => |err| return errnoBug(err),
...@@ -1088,7 +1088,7 @@ fn fileStatPosix(userdata: ?*anyopaque, file: Io.File) Io.File.StatError!Io.File...@@ -1088,7 +1088,7 @@ fn fileStatPosix(userdata: ?*anyopaque, file: Io.File) Io.File.StatError!Io.File
1088 .CANCELED => return error.Canceled,1088 .CANCELED => return error.Canceled,
10891089
1090 .INVAL => |err| return errnoBug(err),1090 .INVAL => |err| return errnoBug(err),
1091 .BADF => |err| return errnoBug(err),1091 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1092 .NOMEM => return error.SystemResources,1092 .NOMEM => return error.SystemResources,
1093 .ACCES => return error.AccessDenied,1093 .ACCES => return error.AccessDenied,
1094 else => |err| return posix.unexpectedErrno(err),1094 else => |err| return posix.unexpectedErrno(err),
...@@ -1115,7 +1115,7 @@ fn fileStatLinux(userdata: ?*anyopaque, file: Io.File) Io.File.StatError!Io.File...@@ -1115,7 +1115,7 @@ fn fileStatLinux(userdata: ?*anyopaque, file: Io.File) Io.File.StatError!Io.File
1115 .CANCELED => return error.Canceled,1115 .CANCELED => return error.Canceled,
11161116
1117 .ACCES => |err| return errnoBug(err),1117 .ACCES => |err| return errnoBug(err),
1118 .BADF => |err| return errnoBug(err),1118 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1119 .FAULT => |err| return errnoBug(err),1119 .FAULT => |err| return errnoBug(err),
1120 .INVAL => |err| return errnoBug(err),1120 .INVAL => |err| return errnoBug(err),
1121 .LOOP => |err| return errnoBug(err),1121 .LOOP => |err| return errnoBug(err),
...@@ -1147,7 +1147,7 @@ fn fileStatWasi(userdata: ?*anyopaque, file: Io.File) Io.File.StatError!Io.File....@@ -1147,7 +1147,7 @@ fn fileStatWasi(userdata: ?*anyopaque, file: Io.File) Io.File.StatError!Io.File.
1147 .CANCELED => return error.Canceled,1147 .CANCELED => return error.Canceled,
11481148
1149 .INVAL => |err| return errnoBug(err),1149 .INVAL => |err| return errnoBug(err),
1150 .BADF => |err| return errnoBug(err),1150 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1151 .NOMEM => return error.SystemResources,1151 .NOMEM => return error.SystemResources,
1152 .ACCES => return error.AccessDenied,1152 .ACCES => return error.AccessDenied,
1153 .NOTCAPABLE => return error.AccessDenied,1153 .NOTCAPABLE => return error.AccessDenied,
...@@ -1220,7 +1220,7 @@ fn dirAccessWasi(...@@ -1220,7 +1220,7 @@ fn dirAccessWasi(
1220 .CANCELED => return error.Canceled,1220 .CANCELED => return error.Canceled,
12211221
1222 .INVAL => |err| return errnoBug(err),1222 .INVAL => |err| return errnoBug(err),
1223 .BADF => |err| return errnoBug(err), // Always a race condition.1223 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1224 .NOMEM => return error.SystemResources,1224 .NOMEM => return error.SystemResources,
1225 .ACCES => return error.AccessDenied,1225 .ACCES => return error.AccessDenied,
1226 .FAULT => |err| return errnoBug(err),1226 .FAULT => |err| return errnoBug(err),
...@@ -1305,7 +1305,7 @@ fn dirCreateFilePosix(...@@ -1305,7 +1305,7 @@ fn dirCreateFilePosix(
13051305
1306 .FAULT => |err| return errnoBug(err),1306 .FAULT => |err| return errnoBug(err),
1307 .INVAL => return error.BadPathName,1307 .INVAL => return error.BadPathName,
1308 .BADF => |err| return errnoBug(err),1308 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1309 .ACCES => return error.AccessDenied,1309 .ACCES => return error.AccessDenied,
1310 .FBIG => return error.FileTooBig,1310 .FBIG => return error.FileTooBig,
1311 .OVERFLOW => return error.FileTooBig,1311 .OVERFLOW => return error.FileTooBig,
...@@ -1347,7 +1347,7 @@ fn dirCreateFilePosix(...@@ -1347,7 +1347,7 @@ fn dirCreateFilePosix(
1347 .INTR => continue,1347 .INTR => continue,
1348 .CANCELED => return error.Canceled,1348 .CANCELED => return error.Canceled,
13491349
1350 .BADF => |err| return errnoBug(err),1350 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1351 .INVAL => |err| return errnoBug(err), // invalid parameters1351 .INVAL => |err| return errnoBug(err), // invalid parameters
1352 .NOLCK => return error.SystemResources,1352 .NOLCK => return error.SystemResources,
1353 .AGAIN => return error.WouldBlock,1353 .AGAIN => return error.WouldBlock,
...@@ -1427,7 +1427,7 @@ fn dirCreateFileWasi(...@@ -1427,7 +1427,7 @@ fn dirCreateFileWasi(
1427 .FAULT => |err| return errnoBug(err),1427 .FAULT => |err| return errnoBug(err),
1428 // Provides INVAL with a linux host on a bad path name, but NOENT on Windows1428 // Provides INVAL with a linux host on a bad path name, but NOENT on Windows
1429 .INVAL => return error.BadPathName,1429 .INVAL => return error.BadPathName,
1430 .BADF => |err| return errnoBug(err),1430 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1431 .ACCES => return error.AccessDenied,1431 .ACCES => return error.AccessDenied,
1432 .FBIG => return error.FileTooBig,1432 .FBIG => return error.FileTooBig,
1433 .OVERFLOW => return error.FileTooBig,1433 .OVERFLOW => return error.FileTooBig,
...@@ -1506,7 +1506,7 @@ fn dirOpenFile(...@@ -1506,7 +1506,7 @@ fn dirOpenFile(
15061506
1507 .FAULT => |err| return errnoBug(err),1507 .FAULT => |err| return errnoBug(err),
1508 .INVAL => return error.BadPathName,1508 .INVAL => return error.BadPathName,
1509 .BADF => |err| return errnoBug(err),1509 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1510 .ACCES => return error.AccessDenied,1510 .ACCES => return error.AccessDenied,
1511 .FBIG => return error.FileTooBig,1511 .FBIG => return error.FileTooBig,
1512 .OVERFLOW => return error.FileTooBig,1512 .OVERFLOW => return error.FileTooBig,
...@@ -1548,7 +1548,7 @@ fn dirOpenFile(...@@ -1548,7 +1548,7 @@ fn dirOpenFile(
1548 .INTR => continue,1548 .INTR => continue,
1549 .CANCELED => return error.Canceled,1549 .CANCELED => return error.Canceled,
15501550
1551 .BADF => |err| return errnoBug(err),1551 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1552 .INVAL => |err| return errnoBug(err), // invalid parameters1552 .INVAL => |err| return errnoBug(err), // invalid parameters
1553 .NOLCK => return error.SystemResources,1553 .NOLCK => return error.SystemResources,
1554 .AGAIN => return error.WouldBlock,1554 .AGAIN => return error.WouldBlock,
...@@ -1653,7 +1653,7 @@ fn fileReadStreaming(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File...@@ -1653,7 +1653,7 @@ fn fileReadStreaming(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File
16531653
1654 .INVAL => |err| return errnoBug(err),1654 .INVAL => |err| return errnoBug(err),
1655 .FAULT => |err| return errnoBug(err),1655 .FAULT => |err| return errnoBug(err),
1656 .BADF => |err| return errnoBug(err),1656 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1657 .IO => return error.InputOutput,1657 .IO => return error.InputOutput,
1658 .ISDIR => return error.IsDir,1658 .ISDIR => return error.IsDir,
1659 .NOBUFS => return error.SystemResources,1659 .NOBUFS => return error.SystemResources,
...@@ -1678,7 +1678,7 @@ fn fileReadStreaming(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File...@@ -1678,7 +1678,7 @@ fn fileReadStreaming(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File
1678 .FAULT => |err| return errnoBug(err),1678 .FAULT => |err| return errnoBug(err),
1679 .SRCH => return error.ProcessNotFound,1679 .SRCH => return error.ProcessNotFound,
1680 .AGAIN => return error.WouldBlock,1680 .AGAIN => return error.WouldBlock,
1681 .BADF => return error.NotOpenForReading, // can be a race condition1681 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1682 .IO => return error.InputOutput,1682 .IO => return error.InputOutput,
1683 .ISDIR => return error.IsDir,1683 .ISDIR => return error.IsDir,
1684 .NOBUFS => return error.SystemResources,1684 .NOBUFS => return error.SystemResources,
...@@ -1779,7 +1779,7 @@ fn fileReadPositional(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset...@@ -1779,7 +1779,7 @@ fn fileReadPositional(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset
1779 .INVAL => |err| return errnoBug(err),1779 .INVAL => |err| return errnoBug(err),
1780 .FAULT => |err| return errnoBug(err),1780 .FAULT => |err| return errnoBug(err),
1781 .AGAIN => |err| return errnoBug(err),1781 .AGAIN => |err| return errnoBug(err),
1782 .BADF => return error.NotOpenForReading, // can be a race condition1782 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1783 .IO => return error.InputOutput,1783 .IO => return error.InputOutput,
1784 .ISDIR => return error.IsDir,1784 .ISDIR => return error.IsDir,
1785 .NOBUFS => return error.SystemResources,1785 .NOBUFS => return error.SystemResources,
...@@ -1807,7 +1807,7 @@ fn fileReadPositional(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset...@@ -1807,7 +1807,7 @@ fn fileReadPositional(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset
1807 .FAULT => |err| return errnoBug(err),1807 .FAULT => |err| return errnoBug(err),
1808 .SRCH => return error.ProcessNotFound,1808 .SRCH => return error.ProcessNotFound,
1809 .AGAIN => return error.WouldBlock,1809 .AGAIN => return error.WouldBlock,
1810 .BADF => return error.NotOpenForReading, // can be a race condition1810 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1811 .IO => return error.InputOutput,1811 .IO => return error.InputOutput,
1812 .ISDIR => return error.IsDir,1812 .ISDIR => return error.IsDir,
1813 .NOBUFS => return error.SystemResources,1813 .NOBUFS => return error.SystemResources,
...@@ -1844,7 +1844,7 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr...@@ -1844,7 +1844,7 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr
1844 .INTR => continue,1844 .INTR => continue,
1845 .CANCELED => return error.Canceled,1845 .CANCELED => return error.Canceled,
18461846
1847 .BADF => |err| return errnoBug(err), // Always a race condition.1847 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1848 .INVAL => return error.Unseekable,1848 .INVAL => return error.Unseekable,
1849 .OVERFLOW => return error.Unseekable,1849 .OVERFLOW => return error.Unseekable,
1850 .SPIPE => return error.Unseekable,1850 .SPIPE => return error.Unseekable,
...@@ -1866,7 +1866,7 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr...@@ -1866,7 +1866,7 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr
1866 .INTR => continue,1866 .INTR => continue,
1867 .CANCELED => return error.Canceled,1867 .CANCELED => return error.Canceled,
18681868
1869 .BADF => |err| return errnoBug(err), // Always a race condition.1869 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1870 .INVAL => return error.Unseekable,1870 .INVAL => return error.Unseekable,
1871 .OVERFLOW => return error.Unseekable,1871 .OVERFLOW => return error.Unseekable,
1872 .SPIPE => return error.Unseekable,1872 .SPIPE => return error.Unseekable,
...@@ -1885,7 +1885,7 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr...@@ -1885,7 +1885,7 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr
1885 .INTR => continue,1885 .INTR => continue,
1886 .CANCELED => return error.Canceled,1886 .CANCELED => return error.Canceled,
18871887
1888 .BADF => |err| return errnoBug(err), // Always a race condition.1888 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1889 .INVAL => return error.Unseekable,1889 .INVAL => return error.Unseekable,
1890 .OVERFLOW => return error.Unseekable,1890 .OVERFLOW => return error.Unseekable,
1891 .SPIPE => return error.Unseekable,1891 .SPIPE => return error.Unseekable,
...@@ -2111,7 +2111,7 @@ fn netListenIpPosix(...@@ -2111,7 +2111,7 @@ fn netListenIpPosix(
2111 switch (posix.errno(posix.system.listen(socket_fd, options.kernel_backlog))) {2111 switch (posix.errno(posix.system.listen(socket_fd, options.kernel_backlog))) {
2112 .SUCCESS => break,2112 .SUCCESS => break,
2113 .ADDRINUSE => return error.AddressInUse,2113 .ADDRINUSE => return error.AddressInUse,
2114 .BADF => |err| return errnoBug(err),2114 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2115 else => |err| return posix.unexpectedErrno(err),2115 else => |err| return posix.unexpectedErrno(err),
2116 }2116 }
2117 }2117 }
...@@ -2150,7 +2150,7 @@ fn netListenUnix(...@@ -2150,7 +2150,7 @@ fn netListenUnix(
2150 switch (posix.errno(posix.system.listen(socket_fd, options.kernel_backlog))) {2150 switch (posix.errno(posix.system.listen(socket_fd, options.kernel_backlog))) {
2151 .SUCCESS => break,2151 .SUCCESS => break,
2152 .ADDRINUSE => return error.AddressInUse,2152 .ADDRINUSE => return error.AddressInUse,
2153 .BADF => |err| return errnoBug(err),2153 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2154 else => |err| return posix.unexpectedErrno(err),2154 else => |err| return posix.unexpectedErrno(err),
2155 }2155 }
2156 }2156 }
...@@ -2178,7 +2178,7 @@ fn posixBindUnix(t: *Threaded, fd: posix.socket_t, addr: *const posix.sockaddr,...@@ -2178,7 +2178,7 @@ fn posixBindUnix(t: *Threaded, fd: posix.socket_t, addr: *const posix.sockaddr,
2178 .ROFS => return error.ReadOnlyFileSystem,2178 .ROFS => return error.ReadOnlyFileSystem,
2179 .PERM => return error.PermissionDenied,2179 .PERM => return error.PermissionDenied,
21802180
2181 .BADF => |err| return errnoBug(err), // always a race condition if this error is returned2181 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2182 .INVAL => |err| return errnoBug(err), // invalid parameters2182 .INVAL => |err| return errnoBug(err), // invalid parameters
2183 .NOTSOCK => |err| return errnoBug(err), // invalid `sockfd`2183 .NOTSOCK => |err| return errnoBug(err), // invalid `sockfd`
2184 .FAULT => |err| return errnoBug(err), // invalid `addr` pointer2184 .FAULT => |err| return errnoBug(err), // invalid `addr` pointer
...@@ -2197,7 +2197,7 @@ fn posixBind(t: *Threaded, socket_fd: posix.socket_t, addr: *const posix.sockadd...@@ -2197,7 +2197,7 @@ fn posixBind(t: *Threaded, socket_fd: posix.socket_t, addr: *const posix.sockadd
2197 .CANCELED => return error.Canceled,2197 .CANCELED => return error.Canceled,
21982198
2199 .ADDRINUSE => return error.AddressInUse,2199 .ADDRINUSE => return error.AddressInUse,
2200 .BADF => |err| return errnoBug(err), // always a race condition if this error is returned2200 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2201 .INVAL => |err| return errnoBug(err), // invalid parameters2201 .INVAL => |err| return errnoBug(err), // invalid parameters
2202 .NOTSOCK => |err| return errnoBug(err), // invalid `sockfd`2202 .NOTSOCK => |err| return errnoBug(err), // invalid `sockfd`
2203 .AFNOSUPPORT => return error.AddressFamilyUnsupported,2203 .AFNOSUPPORT => return error.AddressFamilyUnsupported,
...@@ -2221,7 +2221,7 @@ fn posixConnect(t: *Threaded, socket_fd: posix.socket_t, addr: *const posix.sock...@@ -2221,7 +2221,7 @@ fn posixConnect(t: *Threaded, socket_fd: posix.socket_t, addr: *const posix.sock
2221 .AFNOSUPPORT => return error.AddressFamilyUnsupported,2221 .AFNOSUPPORT => return error.AddressFamilyUnsupported,
2222 .AGAIN, .INPROGRESS => return error.WouldBlock,2222 .AGAIN, .INPROGRESS => return error.WouldBlock,
2223 .ALREADY => return error.ConnectionPending,2223 .ALREADY => return error.ConnectionPending,
2224 .BADF => |err| return errnoBug(err),2224 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2225 .CONNREFUSED => return error.ConnectionRefused,2225 .CONNREFUSED => return error.ConnectionRefused,
2226 .CONNRESET => return error.ConnectionResetByPeer,2226 .CONNRESET => return error.ConnectionResetByPeer,
2227 .FAULT => |err| return errnoBug(err),2227 .FAULT => |err| return errnoBug(err),
...@@ -2260,7 +2260,7 @@ fn posixConnectUnix(t: *Threaded, fd: posix.socket_t, addr: *const posix.sockadd...@@ -2260,7 +2260,7 @@ fn posixConnectUnix(t: *Threaded, fd: posix.socket_t, addr: *const posix.sockadd
2260 .ROFS => return error.ReadOnlyFileSystem,2260 .ROFS => return error.ReadOnlyFileSystem,
2261 .PERM => return error.PermissionDenied,2261 .PERM => return error.PermissionDenied,
22622262
2263 .BADF => |err| return errnoBug(err),2263 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2264 .CONNABORTED => |err| return errnoBug(err),2264 .CONNABORTED => |err| return errnoBug(err),
2265 .FAULT => |err| return errnoBug(err),2265 .FAULT => |err| return errnoBug(err),
2266 .ISCONN => |err| return errnoBug(err),2266 .ISCONN => |err| return errnoBug(err),
...@@ -2279,7 +2279,7 @@ fn posixGetSockName(t: *Threaded, socket_fd: posix.fd_t, addr: *posix.sockaddr,...@@ -2279,7 +2279,7 @@ fn posixGetSockName(t: *Threaded, socket_fd: posix.fd_t, addr: *posix.sockaddr,
2279 .INTR => continue,2279 .INTR => continue,
2280 .CANCELED => return error.Canceled,2280 .CANCELED => return error.Canceled,
22812281
2282 .BADF => |err| return errnoBug(err), // always a race condition2282 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2283 .FAULT => |err| return errnoBug(err),2283 .FAULT => |err| return errnoBug(err),
2284 .INVAL => |err| return errnoBug(err), // invalid parameters2284 .INVAL => |err| return errnoBug(err), // invalid parameters
2285 .NOTSOCK => |err| return errnoBug(err), // always a race condition2285 .NOTSOCK => |err| return errnoBug(err), // always a race condition
...@@ -2298,7 +2298,7 @@ fn setSocketOption(t: *Threaded, fd: posix.fd_t, level: i32, opt_name: u32, opti...@@ -2298,7 +2298,7 @@ fn setSocketOption(t: *Threaded, fd: posix.fd_t, level: i32, opt_name: u32, opti
2298 .INTR => continue,2298 .INTR => continue,
2299 .CANCELED => return error.Canceled,2299 .CANCELED => return error.Canceled,
23002300
2301 .BADF => |err| return errnoBug(err), // always a race condition2301 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2302 .NOTSOCK => |err| return errnoBug(err), // always a race condition2302 .NOTSOCK => |err| return errnoBug(err), // always a race condition
2303 .INVAL => |err| return errnoBug(err),2303 .INVAL => |err| return errnoBug(err),
2304 .FAULT => |err| return errnoBug(err),2304 .FAULT => |err| return errnoBug(err),
...@@ -2430,6 +2430,7 @@ fn openSocketPosix(...@@ -2430,6 +2430,7 @@ fn openSocketPosix(
2430}2430}
24312431
2432fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: net.Socket.Handle) net.Server.AcceptError!net.Stream {2432fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: net.Socket.Handle) net.Server.AcceptError!net.Stream {
2433 if (!have_networking) return error.NetworkDown;
2433 const t: *Threaded = @ptrCast(@alignCast(userdata));2434 const t: *Threaded = @ptrCast(@alignCast(userdata));
2434 var storage: PosixAddress = undefined;2435 var storage: PosixAddress = undefined;
2435 var addr_len: posix.socklen_t = @sizeOf(PosixAddress);2436 var addr_len: posix.socklen_t = @sizeOf(PosixAddress);
...@@ -2456,11 +2457,12 @@ fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: net.Socket.Handle) net.Serve...@@ -2456,11 +2457,12 @@ fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: net.Socket.Handle) net.Serve
2456 },2457 },
2457 .INTR => continue,2458 .INTR => continue,
2458 .CANCELED => return error.Canceled,2459 .CANCELED => return error.Canceled,
2460
2459 .AGAIN => |err| return errnoBug(err),2461 .AGAIN => |err| return errnoBug(err),
2460 .BADF => |err| return errnoBug(err), // always a race condition2462 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2461 .CONNABORTED => return error.ConnectionAborted,2463 .CONNABORTED => return error.ConnectionAborted,
2462 .FAULT => |err| return errnoBug(err),2464 .FAULT => |err| return errnoBug(err),
2463 .INVAL => return error.SocketNotListening,2465 .INVAL => |err| return errnoBug(err),
2464 .NOTSOCK => |err| return errnoBug(err),2466 .NOTSOCK => |err| return errnoBug(err),
2465 .MFILE => return error.ProcessFdQuotaExceeded,2467 .MFILE => return error.ProcessFdQuotaExceeded,
2466 .NFILE => return error.SystemFdQuotaExceeded,2468 .NFILE => return error.SystemFdQuotaExceeded,
...@@ -2504,7 +2506,7 @@ fn netReadPosix(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net....@@ -2504,7 +2506,7 @@ fn netReadPosix(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.
2504 .INVAL => |err| return errnoBug(err),2506 .INVAL => |err| return errnoBug(err),
2505 .FAULT => |err| return errnoBug(err),2507 .FAULT => |err| return errnoBug(err),
2506 .AGAIN => |err| return errnoBug(err),2508 .AGAIN => |err| return errnoBug(err),
2507 .BADF => |err| return errnoBug(err),2509 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2508 .NOBUFS => return error.SystemResources,2510 .NOBUFS => return error.SystemResources,
2509 .NOMEM => return error.SystemResources,2511 .NOMEM => return error.SystemResources,
2510 .NOTCONN => return error.SocketUnconnected,2512 .NOTCONN => return error.SocketUnconnected,
...@@ -2526,7 +2528,7 @@ fn netReadPosix(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net....@@ -2526,7 +2528,7 @@ fn netReadPosix(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.
2526 .INVAL => |err| return errnoBug(err),2528 .INVAL => |err| return errnoBug(err),
2527 .FAULT => |err| return errnoBug(err),2529 .FAULT => |err| return errnoBug(err),
2528 .AGAIN => |err| return errnoBug(err),2530 .AGAIN => |err| return errnoBug(err),
2529 .BADF => |err| return errnoBug(err), // Always a race condition.2531 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2530 .NOBUFS => return error.SystemResources,2532 .NOBUFS => return error.SystemResources,
2531 .NOMEM => return error.SystemResources,2533 .NOMEM => return error.SystemResources,
2532 .NOTCONN => return error.SocketUnconnected,2534 .NOTCONN => return error.SocketUnconnected,
...@@ -2625,7 +2627,7 @@ fn netSendOne(...@@ -2625,7 +2627,7 @@ fn netSendOne(
26252627
2626 .ACCES => return error.AccessDenied,2628 .ACCES => return error.AccessDenied,
2627 .ALREADY => return error.FastOpenAlreadyInProgress,2629 .ALREADY => return error.FastOpenAlreadyInProgress,
2628 .BADF => |err| return errnoBug(err),2630 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2629 .CONNRESET => return error.ConnectionResetByPeer,2631 .CONNRESET => return error.ConnectionResetByPeer,
2630 .DESTADDRREQ => |err| return errnoBug(err),2632 .DESTADDRREQ => |err| return errnoBug(err),
2631 .FAULT => |err| return errnoBug(err),2633 .FAULT => |err| return errnoBug(err),
...@@ -2694,7 +2696,7 @@ fn netSendMany(...@@ -2694,7 +2696,7 @@ fn netSendMany(
26942696
2695 .AGAIN => |err| return errnoBug(err),2697 .AGAIN => |err| return errnoBug(err),
2696 .ALREADY => return error.FastOpenAlreadyInProgress,2698 .ALREADY => return error.FastOpenAlreadyInProgress,
2697 .BADF => |err| return errnoBug(err), // Always a race condition.2699 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2698 .CONNRESET => return error.ConnectionResetByPeer,2700 .CONNRESET => return error.ConnectionResetByPeer,
2699 .DESTADDRREQ => |err| return errnoBug(err), // The socket is not connection-mode, and no peer address is set.2701 .DESTADDRREQ => |err| return errnoBug(err), // The socket is not connection-mode, and no peer address is set.
2700 .FAULT => |err| return errnoBug(err), // An invalid user space address was specified for an argument.2702 .FAULT => |err| return errnoBug(err), // An invalid user space address was specified for an argument.
...@@ -2905,7 +2907,7 @@ fn netWritePosix(...@@ -2905,7 +2907,7 @@ fn netWritePosix(
2905 .ACCES => |err| return errnoBug(err),2907 .ACCES => |err| return errnoBug(err),
2906 .AGAIN => |err| return errnoBug(err),2908 .AGAIN => |err| return errnoBug(err),
2907 .ALREADY => return error.FastOpenAlreadyInProgress,2909 .ALREADY => return error.FastOpenAlreadyInProgress,
2908 .BADF => |err| return errnoBug(err), // always a race condition2910 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2909 .CONNRESET => return error.ConnectionResetByPeer,2911 .CONNRESET => return error.ConnectionResetByPeer,
2910 .DESTADDRREQ => |err| return errnoBug(err), // The socket is not connection-mode, and no peer address is set.2912 .DESTADDRREQ => |err| return errnoBug(err), // The socket is not connection-mode, and no peer address is set.
2911 .FAULT => |err| return errnoBug(err), // An invalid user space address was specified for an argument.2913 .FAULT => |err| return errnoBug(err), // An invalid user space address was specified for an argument.
...@@ -2979,7 +2981,7 @@ fn netInterfaceNameResolve(...@@ -2979,7 +2981,7 @@ fn netInterfaceNameResolve(
2979 .INVAL => |err| return errnoBug(err), // Bad parameters.2981 .INVAL => |err| return errnoBug(err), // Bad parameters.
2980 .NOTTY => |err| return errnoBug(err),2982 .NOTTY => |err| return errnoBug(err),
2981 .NXIO => |err| return errnoBug(err),2983 .NXIO => |err| return errnoBug(err),
2982 .BADF => |err| return errnoBug(err), // Always a race condition.2984 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
2983 .FAULT => |err| return errnoBug(err), // Bad pointer parameter.2985 .FAULT => |err| return errnoBug(err), // Bad pointer parameter.
2984 .IO => |err| return errnoBug(err), // sock_fd is not a file descriptor2986 .IO => |err| return errnoBug(err), // sock_fd is not a file descriptor
2985 .NODEV => return error.InterfaceNotFound,2987 .NODEV => return error.InterfaceNotFound,
lib/std/Io/net.zig+20-1
...@@ -1312,7 +1312,26 @@ pub const Server = struct {...@@ -1312,7 +1312,26 @@ pub const Server = struct {
1312 s.* = undefined;1312 s.* = undefined;
1313 }1313 }
13141314
1315 pub const AcceptError = std.posix.AcceptError || Io.Cancelable;1315 pub const AcceptError = error{
1316 /// The per-process limit on the number of open file descriptors has been reached.
1317 ProcessFdQuotaExceeded,
1318 /// The system-wide limit on the total number of open files has been reached.
1319 SystemFdQuotaExceeded,
1320 /// Not enough free memory. This often means that the memory allocation is limited
1321 /// by the socket buffer limits, not by the system memory.
1322 SystemResources,
1323 /// The network subsystem has failed.
1324 NetworkDown,
1325 /// No connection is already queued and ready to be accepted, and
1326 /// the socket is configured as non-blocking.
1327 WouldBlock,
1328 /// An incoming connection was indicated, but was subsequently terminated by the
1329 /// remote peer prior to accepting the call.
1330 ConnectionAborted,
1331 /// Firewall rules forbid connection.
1332 BlockedByFirewall,
1333 ProtocolFailure,
1334 } || Io.UnexpectedError || Io.Cancelable;
13161335
1317 /// Blocks until a client connects to the server.1336 /// Blocks until a client connects to the server.
1318 pub fn accept(s: *Server, io: Io) AcceptError!Stream {1337 pub fn accept(s: *Server, io: Io) AcceptError!Stream {
lib/std/posix.zig+1-38
...@@ -3622,44 +3622,7 @@ pub fn listen(sock: socket_t, backlog: u31) ListenError!void {...@@ -3622,44 +3622,7 @@ pub fn listen(sock: socket_t, backlog: u31) ListenError!void {
3622 }3622 }
3623}3623}
36243624
3625pub const AcceptError = error{3625pub const AcceptError = std.Io.net.Server.AcceptError;
3626 ConnectionAborted,
3627
3628 /// The file descriptor sockfd does not refer to a socket.
3629 FileDescriptorNotASocket,
3630
3631 /// The per-process limit on the number of open file descriptors has been reached.
3632 ProcessFdQuotaExceeded,
3633
3634 /// The system-wide limit on the total number of open files has been reached.
3635 SystemFdQuotaExceeded,
3636
3637 /// Not enough free memory. This often means that the memory allocation is limited
3638 /// by the socket buffer limits, not by the system memory.
3639 SystemResources,
3640
3641 /// Socket is not listening for new connections.
3642 SocketNotListening,
3643
3644 ProtocolFailure,
3645
3646 /// Firewall rules forbid connection.
3647 BlockedByFirewall,
3648
3649 /// This error occurs when no global event loop is configured,
3650 /// and accepting from the socket would block.
3651 WouldBlock,
3652
3653 /// An incoming connection was indicated, but was subsequently terminated by the
3654 /// remote peer prior to accepting the call.
3655 ConnectionResetByPeer,
3656
3657 /// The network subsystem has failed.
3658 NetworkDown,
3659
3660 /// The referenced socket is not a type that supports connection-oriented service.
3661 OperationNotSupported,
3662} || UnexpectedError;
36633626
3664/// Accept a connection on a socket.3627/// Accept a connection on a socket.
3665/// If `sockfd` is opened in non blocking mode, the function will3628/// If `sockfd` is opened in non blocking mode, the function will