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 {...@@ -2029,7 +2029,10 @@ pub const Writer = struct {
2029 switch (w.mode) {2029 switch (w.mode) {
2030 .positional,2030 .positional,
2031 .positional_reading,2031 .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
2034 .streaming,2037 .streaming,
2035 .streaming_reading,2038 .streaming_reading,
lib/std/posix.zig+3-2
...@@ -1052,6 +1052,7 @@ pub const TruncateError = error{...@@ -1052,6 +1052,7 @@ pub const TruncateError = error{
1052 FileBusy,1052 FileBusy,
1053 AccessDenied,1053 AccessDenied,
1054 PermissionDenied,1054 PermissionDenied,
1055 NonResizable,
1055} || UnexpectedError;1056} || UnexpectedError;
10561057
1057/// Length must be positive when treated as an i64.1058/// Length must be positive when treated as an i64.
...@@ -1091,7 +1092,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {...@@ -1091,7 +1092,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {
1091 .PERM => return error.PermissionDenied,1092 .PERM => return error.PermissionDenied,
1092 .TXTBSY => return error.FileBusy,1093 .TXTBSY => return error.FileBusy,
1093 .BADF => unreachable, // Handle not open for writing1094 .BADF => unreachable, // Handle not open for writing
1094 .INVAL => unreachable, // Handle not open for writing, negative length, or non-resizable handle1095 .INVAL => return error.NonResizable,
1095 .NOTCAPABLE => return error.AccessDenied,1096 .NOTCAPABLE => return error.AccessDenied,
1096 else => |err| return unexpectedErrno(err),1097 else => |err| return unexpectedErrno(err),
1097 }1098 }
...@@ -1107,7 +1108,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {...@@ -1107,7 +1108,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void {
1107 .PERM => return error.PermissionDenied,1108 .PERM => return error.PermissionDenied,
1108 .TXTBSY => return error.FileBusy,1109 .TXTBSY => return error.FileBusy,
1109 .BADF => unreachable, // Handle not open for writing1110 .BADF => unreachable, // Handle not open for writing
1110 .INVAL => unreachable, // Handle not open for writing, negative length, or non-resizable handle1111 .INVAL => return error.NonResizable, // This is returned for /dev/null for example.
1111 else => |err| return unexpectedErrno(err),1112 else => |err| return unexpectedErrno(err),
1112 }1113 }
1113 }1114 }