Skip to content

Commit e5a55f6

Browse files
vesim987andrewrk
andcommitted
std: std.fs.File fix sendFile with buffered data
fixes #25196 Co-authored-by: Andrew Kelley <[email protected]>
1 parent bf58b4e commit e5a55f6

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

lib/std/fs/File.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1732,7 +1732,7 @@ pub const Writer = struct {
17321732
) std.Io.Writer.FileError!usize {
17331733
const reader_buffered = file_reader.interface.buffered();
17341734
if (reader_buffered.len >= @intFromEnum(limit))
1735-
return sendFileBuffered(io_w, file_reader, reader_buffered);
1735+
return sendFileBuffered(io_w, file_reader, limit.slice(reader_buffered));
17361736
const writer_buffered = io_w.buffered();
17371737
const file_limit = @intFromEnum(limit) - reader_buffered.len;
17381738
const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w));

lib/std/fs/test.zig

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,6 +1525,41 @@ test "sendfile" {
15251525
try testing.expectEqualStrings("header1\nsecond header\nine1\nsecontrailer1\nsecond trailer\n", written_buf[0..amt]);
15261526
}
15271527

1528+
test "sendfile with buffered data" {
1529+
var tmp = tmpDir(.{});
1530+
defer tmp.cleanup();
1531+
1532+
try tmp.dir.makePath("os_test_tmp");
1533+
1534+
var dir = try tmp.dir.openDir("os_test_tmp", .{});
1535+
defer dir.close();
1536+
1537+
var src_file = try dir.createFile("sendfile1.txt", .{ .read = true });
1538+
defer src_file.close();
1539+
1540+
try src_file.writeAll("AAAABBBB");
1541+
1542+
var dest_file = try dir.createFile("sendfile2.txt", .{ .read = true });
1543+
defer dest_file.close();
1544+
1545+
var src_buffer: [32]u8 = undefined;
1546+
var file_reader = src_file.reader(&src_buffer);
1547+
1548+
try file_reader.seekTo(0);
1549+
try file_reader.interface.fill(8);
1550+
1551+
var fallback_buffer: [32]u8 = undefined;
1552+
var file_writer = dest_file.writer(&fallback_buffer);
1553+
1554+
try std.testing.expectEqual(4, try file_writer.interface.sendFileAll(&file_reader, .limited(4)));
1555+
1556+
var written_buf: [8]u8 = undefined;
1557+
const amt = try dest_file.preadAll(&written_buf, 0);
1558+
1559+
try std.testing.expectEqual(4, amt);
1560+
try std.testing.expectEqualSlices(u8, "AAAA", written_buf[0..amt]);
1561+
}
1562+
15281563
test "copyRangeAll" {
15291564
var tmp = tmpDir(.{});
15301565
defer tmp.cleanup();

0 commit comments

Comments
 (0)