authorgravatar for loweg@bgdn.ccAmilia MacIntyre <loweg@bgdn.cc> 2026-07-24 14:22:54-04:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-07 16:32:50+02:00
logd5bd19d471198c0175f2f8875b262b9e13756c25
treec38521cb3727f0d2789d2bbd7be802ceace985a7
parentfafbc70ac58e056373eed8f2f21ff348f1e3a78a

std.Io: handle EACCES in calls to `bind`


4 files changed, 7 insertions(+), 0 deletions(-)

lib/std/Io/Kqueue.zig+1
...@@ -1422,6 +1422,7 @@ fn posixBind(...@@ -1422,6 +1422,7 @@ fn posixBind(
1422 .INTR => continue,1422 .INTR => continue,
1423 .CANCELED => return error.Canceled,1423 .CANCELED => return error.Canceled,
14241424
1425 .ACCES => return error.AccessDenied,
1425 .ADDRINUSE => return error.AddressInUse,1426 .ADDRINUSE => return error.AddressInUse,
1426 .BADF => |err| return errnoBug(err), // File descriptor used after closed.1427 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
1427 .INVAL => |err| return errnoBug(err), // invalid parameters1428 .INVAL => |err| return errnoBug(err), // invalid parameters
lib/std/Io/Threaded.zig+1
...@@ -12086,6 +12086,7 @@ fn posixBind(...@@ -12086,6 +12086,7 @@ fn posixBind(
12086 else => |e| {12086 else => |e| {
12087 syscall.finish();12087 syscall.finish();
12088 switch (e) {12088 switch (e) {
12089 .ACCES => return error.AccessDenied,
12089 .ADDRINUSE => return error.AddressInUse,12090 .ADDRINUSE => return error.AddressInUse,
12090 .BADF => |err| return errnoBug(err), // File descriptor used after closed.12091 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
12091 .INVAL => |err| return errnoBug(err), // invalid parameters12092 .INVAL => |err| return errnoBug(err), // invalid parameters
lib/std/Io/Uring.zig+1
...@@ -5298,6 +5298,7 @@ fn bind(...@@ -5298,6 +5298,7 @@ fn bind(
5298 switch (cancel_region.errno()) {5298 switch (cancel_region.errno()) {
5299 .SUCCESS => return,5299 .SUCCESS => return,
5300 .INTR, .CANCELED => {},5300 .INTR, .CANCELED => {},
5301 .ACCES => return error.AccessDenied,
5301 .ADDRINUSE => return error.AddressInUse,5302 .ADDRINUSE => return error.AddressInUse,
5302 .BADF => |err| return errnoBug(err), // File descriptor used after closed.5303 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
5303 .INVAL => |err| return errnoBug(err), // invalid parameters5304 .INVAL => |err| return errnoBug(err), // invalid parameters
lib/std/Io/net.zig+4
...@@ -198,6 +198,8 @@ pub const IpAddress = union(enum) {...@@ -198,6 +198,8 @@ pub const IpAddress = union(enum) {
198 }198 }
199199
200 pub const ListenError = error{200 pub const ListenError = error{
201 /// The address is protected and the current user does not have permission to bind it.
202 AccessDenied,
201 /// The address is already taken. Can occur when bound port is 0 but203 /// The address is already taken. Can occur when bound port is 0 but
202 /// all ephemeral ports are already in use.204 /// all ephemeral ports are already in use.
203 AddressInUse,205 AddressInUse,
...@@ -254,6 +256,8 @@ pub const IpAddress = union(enum) {...@@ -254,6 +256,8 @@ pub const IpAddress = union(enum) {
254 }256 }
255257
256 pub const BindError = error{258 pub const BindError = error{
259 /// The address is protected and the current user does not have permission to bind it.
260 AccessDenied,
257 /// The address is already taken. Can occur when bound port is 0 but261 /// The address is already taken. Can occur when bound port is 0 but
258 /// all ephemeral ports are already in use.262 /// all ephemeral ports are already in use.
259 AddressInUse,263 AddressInUse,