diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig index 6e365a8fd5..2d347eb0cd 100644 --- a/lib/std/fs/File.zig +++ b/lib/std/fs/File.zig @@ -1737,7 +1737,8 @@ pub fn writer_writeFile( const smaller_len = if (len_int == 0) max_count else @min(len_int, max_count); var off: std.os.linux.off_t = undefined; const off_ptr: ?*std.os.linux.off_t = if (in_offset.toInt()) |offset| b: { - off = std.math.cast(std.os.linux.off_t, offset) orelse return error.Overflow; + off = std.math.cast(std.os.linux.off_t, offset) orelse + return writer_writeSplat(context, headers_and_trailers, 1); break :b &off; } else null; if (true) @panic("TODO"); @@ -1747,7 +1748,13 @@ pub fn writer_writeFile( error.Unexpected => break :sf, else => |e| return e, }; - if (in_offset.toInt()) |offset| assert(n == off - offset); + if (in_offset.toInt()) |offset| { + assert(n == off - offset); + } else if (n == 0 and len_int == 0) { + // The caller wouldn't be able to tell that the file transfer is + // done and would incorrectly repeat the same call. + return writer_writeSplat(context, headers_and_trailers, 1); + } return n; } var iovecs_buffer: [max_buffers_len]std.posix.iovec_const = undefined; diff --git a/lib/std/io/BufferedWriter.zig b/lib/std/io/BufferedWriter.zig index 96d9ff66b0..1e4c7bea79 100644 --- a/lib/std/io/BufferedWriter.zig +++ b/lib/std/io/BufferedWriter.zig @@ -69,7 +69,8 @@ pub fn reset(bw: *BufferedWriter) void { pub fn flush(bw: *BufferedWriter) anyerror!void { const list = &bw.buffer; const send_buffer = list.items; - try bw.unbuffered_writer.writeAll(send_buffer); + var index: usize = 0; + while (index < send_buffer.len) index += try bw.unbuffered_writer.writev(&.{send_buffer[index..]}); list.items.len = 0; } diff --git a/lib/std/io/Writer.zig b/lib/std/io/Writer.zig index 762c6d3a17..7783c9af59 100644 --- a/lib/std/io/Writer.zig +++ b/lib/std/io/Writer.zig @@ -149,6 +149,9 @@ fn null_writeFile( ) anyerror!usize { _ = context; var n: usize = 0; + if (offset == .none) { + @panic("TODO seek the file forwards"); + } if (len == .entire_file) { const headers = headers_and_trailers[0..headers_len]; for (headers) |bytes| n += bytes.len; diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 1d492c146b..414a9289b3 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -6359,7 +6359,7 @@ pub const SendFileError = PReadError || WriteError || SendError; pub fn sendfile( out_fd: fd_t, in_fd: fd_t, - in_offset: ?u64, + in_offset: u64, in_len: u64, headers: []const iovec_const, trailers: []const iovec_const, @@ -6390,9 +6390,8 @@ pub fn sendfile( const sendfile_sym = if (lfs64_abi) system.sendfile64 else system.sendfile; while (true) { - var offset: off_t = if (in_offset) |o| o else undefined; - const offset_pointer: ?*off_t = if (in_offset) &offset else null; - const rc = sendfile_sym(out_fd, in_fd, offset_pointer, adjusted_count); + var offset: off_t = @bitCast(in_offset); + const rc = sendfile_sym(out_fd, in_fd, &offset, adjusted_count); switch (errno(rc)) { .SUCCESS => { const amt: usize = @bitCast(rc); diff --git a/test/standalone/simple/hello_world/hello.zig b/test/standalone/simple/hello_world/hello.zig index eabb226eb2..3b2b910687 100644 --- a/test/standalone/simple/hello_world/hello.zig +++ b/test/standalone/simple/hello_world/hello.zig @@ -1,5 +1,5 @@ const std = @import("std"); pub fn main() !void { - try std.io.getStdOut().writeAll("Hello, World!\n"); + try std.fs.File.stdout().writeAll("Hello, World!\n"); }