authorgravatar for vesim809@pm.meMaciej 'vesim' Kuliński <vesim809@pm.me> 2025-09-14 17:26:55+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-09 12:08:17-07:00
log6682ff2e85dc528ad2552b23fd540423b0c456bb
treeea1ed1b3ff0559f4b04750a3340b573c1dc51b4d
parentf661ab6c36c0366331451986a29ee14ac05fd8eb

std: std.fs.File fix sendFile with buffered data

fixes #25196 Co-authored-by: Andrew Kelley <andrew@ziglang.org>

2 files changed, 36 insertions(+), 1 deletions(-)

lib/std/fs/File.zig+1-1
......@@ -1783,7 +1783,7 @@ pub const Writer = struct {
17831783 ) std.Io.Writer.FileError!usize {
17841784 const reader_buffered = file_reader.interface.buffered();
17851785 if (reader_buffered.len >= @intFromEnum(limit))
1786 return sendFileBuffered(io_w, file_reader, reader_buffered);
1786 return sendFileBuffered(io_w, file_reader, limit.slice(reader_buffered));
17871787 const writer_buffered = io_w.buffered();
17881788 const file_limit = @intFromEnum(limit) - reader_buffered.len;
17891789 const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w));
lib/std/fs/test.zig+35
......@@ -1515,6 +1515,41 @@ test "sendfile" {
15151515 try testing.expectEqualStrings("header1\nsecond header\nine1\nsecontrailer1\nsecond trailer\n", written_buf[0..amt]);
15161516}
15171517
1518test "sendfile with buffered data" {
1519 var tmp = tmpDir(.{});
1520 defer tmp.cleanup();
1521
1522 try tmp.dir.makePath("os_test_tmp");
1523
1524 var dir = try tmp.dir.openDir("os_test_tmp", .{});
1525 defer dir.close();
1526
1527 var src_file = try dir.createFile("sendfile1.txt", .{ .read = true });
1528 defer src_file.close();
1529
1530 try src_file.writeAll("AAAABBBB");
1531
1532 var dest_file = try dir.createFile("sendfile2.txt", .{ .read = true });
1533 defer dest_file.close();
1534
1535 var src_buffer: [32]u8 = undefined;
1536 var file_reader = src_file.reader(&src_buffer);
1537
1538 try file_reader.seekTo(0);
1539 try file_reader.interface.fill(8);
1540
1541 var fallback_buffer: [32]u8 = undefined;
1542 var file_writer = dest_file.writer(&fallback_buffer);
1543
1544 try std.testing.expectEqual(4, try file_writer.interface.sendFileAll(&file_reader, .limited(4)));
1545
1546 var written_buf: [8]u8 = undefined;
1547 const amt = try dest_file.preadAll(&written_buf, 0);
1548
1549 try std.testing.expectEqual(4, amt);
1550 try std.testing.expectEqualSlices(u8, "AAAA", written_buf[0..amt]);
1551}
1552
15181553test "copyRangeAll" {
15191554 var tmp = tmpDir(.{});
15201555 defer tmp.cleanup();