| ... | ... | @@ -1624,7 +1624,6 @@ pub const Writer = struct { |
| 1624 | 1624 | const pattern = data[data.len - 1]; |
| 1625 | 1625 | if (pattern.len == 0 or splat == 0) return 0; |
| 1626 | 1626 | const n = windows.WriteFile(handle, pattern, null) catch |err| { |
| 1627 | | std.debug.print("windows write file failed3: {t}\n", .{err}); |
| 1628 | 1627 | w.err = err; |
| 1629 | 1628 | return error.WriteFailed; |
| 1630 | 1629 | }; |
| ... | ... | @@ -1735,6 +1734,16 @@ pub const Writer = struct { |
| 1735 | 1734 | const out_fd = w.file.handle; |
| 1736 | 1735 | const in_fd = file_reader.file.handle; |
| 1737 | 1736 | |
| 1737 | if (file_reader.size) |size| { |
| 1738 | if (size - file_reader.pos == 0) { |
| 1739 | if (reader_buffered.len != 0) { |
| 1740 | return sendFileBuffered(io_w, file_reader, reader_buffered); |
| 1741 | } else { |
| 1742 | return error.EndOfStream; |
| 1743 | } |
| 1744 | } |
| 1745 | } |
| 1746 | |
| 1738 | 1747 | if (native_os == .freebsd and w.mode == .streaming) sf: { |
| 1739 | 1748 | // Try using sendfile on FreeBSD. |
| 1740 | 1749 | if (w.sendfile_err != null) break :sf; |
| ... | ... | @@ -1780,6 +1789,10 @@ pub const Writer = struct { |
| 1780 | 1789 | .NOBUFS => w.sendfile_err = error.SystemResources, |
| 1781 | 1790 | else => |err| w.sendfile_err = posix.unexpectedErrno(err), |
| 1782 | 1791 | } |
| 1792 | if (sbytes == 0) { |
| 1793 | file_reader.size = file_reader.pos; |
| 1794 | return error.EndOfStream; |
| 1795 | } |
| 1783 | 1796 | const consumed = io_w.consume(@bitCast(sbytes)); |
| 1784 | 1797 | file_reader.seekTo(file_reader.pos + consumed) catch return error.ReadFailed; |
| 1785 | 1798 | return consumed; |
| ... | ... | @@ -1810,9 +1823,9 @@ pub const Writer = struct { |
| 1810 | 1823 | break :b &hdtr_data; |
| 1811 | 1824 | }; |
| 1812 | 1825 | const max_count = maxInt(i32); // Avoid EINVAL. |
| 1813 | | var sbytes: std.c.off_t = @min(file_limit, max_count); |
| 1826 | var len: std.c.off_t = @min(file_limit, max_count); |
| 1814 | 1827 | const flags = 0; |
| 1815 | | switch (posix.errno(std.c.sendfile(in_fd, out_fd, offset, &sbytes, hdtr, flags))) { |
| 1828 | switch (posix.errno(std.c.sendfile(in_fd, out_fd, offset, &len, hdtr, flags))) { |
| 1816 | 1829 | .SUCCESS, .INTR => {}, |
| 1817 | 1830 | .OPNOTSUPP, .NOTSOCK, .NOSYS => w.sendfile_err = error.UnsupportedOperation, |
| 1818 | 1831 | .BADF => if (builtin.mode == .Debug) @panic("race condition") else { |
| ... | ... | @@ -1825,14 +1838,18 @@ pub const Writer = struct { |
| 1825 | 1838 | w.sendfile_err = error.Unexpected; |
| 1826 | 1839 | }, |
| 1827 | 1840 | .NOTCONN => w.sendfile_err = error.BrokenPipe, |
| 1828 | | .AGAIN => if (sbytes == 0) { |
| 1841 | .AGAIN => if (len == 0) { |
| 1829 | 1842 | w.sendfile_err = error.WouldBlock; |
| 1830 | 1843 | }, |
| 1831 | 1844 | .IO => w.sendfile_err = error.InputOutput, |
| 1832 | 1845 | .PIPE => w.sendfile_err = error.BrokenPipe, |
| 1833 | 1846 | else => |err| w.sendfile_err = posix.unexpectedErrno(err), |
| 1834 | 1847 | } |
| 1835 | | const consumed = io_w.consume(@bitCast(sbytes)); |
| 1848 | if (len == 0) { |
| 1849 | file_reader.size = file_reader.pos; |
| 1850 | return error.EndOfStream; |
| 1851 | } |
| 1852 | const consumed = io_w.consume(@bitCast(len)); |
| 1836 | 1853 | file_reader.seekTo(file_reader.pos + consumed) catch return error.ReadFailed; |
| 1837 | 1854 | return consumed; |
| 1838 | 1855 | } |