authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-25 14:14:40-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-25 14:15:33-07:00
log733b2082565a86daac6f2b22a1a27f0b60621b4e
treefc42c2ab6477bf021ee79e37dcc8707eb22ea185
parent8752d80c8444249ff6b62e40f918bf53b4bad2b8

std.posix.ftruncate: handle NonResizable properly


2 files changed, 7 insertions(+), 3 deletions(-)

lib/std/fs/File.zig+4-1
......@@ -2029,7 +2029,10 @@ pub const Writer = struct {
20292029 switch (w.mode) {
20302030 .positional,
20312031 .positional_reading,
2032 => try w.file.setEndPos(w.pos),
2032 => w.file.setEndPos(w.pos) catch |err| switch (err) {
2033 error.NonResizable => return,
2034 else => |e| return e,
2035 },
20332036
20342037 .streaming,
20352038 .streaming_reading,
lib/std/posix.zig+3-2
......@@ -1052,6 +1052,7 @@ pub const TruncateError = error{
10521052 FileBusy,
10531053 AccessDenied,
10541054 PermissionDenied,
1055 NonResizable,
10551056} || UnexpectedError;
10561057
10571058/// Length must be positive when treated as an i64.
......@@ -1091,7 +1092,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {
10911092 .PERM => return error.PermissionDenied,
10921093 .TXTBSY => return error.FileBusy,
10931094 .BADF => unreachable, // Handle not open for writing
1094 .INVAL => unreachable, // Handle not open for writing, negative length, or non-resizable handle
1095 .INVAL => return error.NonResizable,
10951096 .NOTCAPABLE => return error.AccessDenied,
10961097 else => |err| return unexpectedErrno(err),
10971098 }
......@@ -1107,7 +1108,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {
11071108 .PERM => return error.PermissionDenied,
11081109 .TXTBSY => return error.FileBusy,
11091110 .BADF => unreachable, // Handle not open for writing
1110 .INVAL => unreachable, // Handle not open for writing, negative length, or non-resizable handle
1111 .INVAL => return error.NonResizable, // This is returned for /dev/null for example.
11111112 else => |err| return unexpectedErrno(err),
11121113 }
11131114 }