| author | |
| committer | |
| log | 1501734747afb60c6b28adb0da1e49ff46a31f17 |
| tree | f704e636b67bd1af144017a08a40356ae8f71862 |
| parent | 5d22c588e27e264e16c15fb1639335465e6139e2 |
5 files changed, 23 insertions(+), 14 deletions(-)
lib/std/fs/File.zig+2-1| ... | @@ -1737,9 +1737,10 @@ pub fn writer_writeFile( | ... | @@ -1737,9 +1737,10 @@ pub fn writer_writeFile( |
| 1737 | const smaller_len = if (len_int == 0) max_count else @min(len_int, max_count); | 1737 | const smaller_len = if (len_int == 0) max_count else @min(len_int, max_count); |
| 1738 | var off: std.os.linux.off_t = undefined; | 1738 | var off: std.os.linux.off_t = undefined; |
| 1739 | const off_ptr: ?*std.os.linux.off_t = if (in_offset.toInt()) |offset| b: { | 1739 | const off_ptr: ?*std.os.linux.off_t = if (in_offset.toInt()) |offset| b: { |
| 1740 | off = try std.math.cast(std.os.linux.off_t, offset); | 1740 | off = std.math.cast(std.os.linux.off_t, offset) orelse return error.Overflow; |
| 1741 | break :b &off; | 1741 | break :b &off; |
| 1742 | } else null; | 1742 | } else null; |
| 1743 | if (true) @panic("TODO"); | ||
| 1743 | const n = std.os.linux.wrapped.sendfile(out_fd, in_fd, off_ptr, smaller_len) catch |err| switch (err) { | 1744 | const n = std.os.linux.wrapped.sendfile(out_fd, in_fd, off_ptr, smaller_len) catch |err| switch (err) { |
| 1744 | error.UnsupportedOperation => break :sf, | 1745 | error.UnsupportedOperation => break :sf, |
| 1745 | error.Unseekable => break :sf, | 1746 | error.Unseekable => break :sf, |
lib/std/io/BufferedReader.zig+11-8| ... | @@ -34,7 +34,7 @@ const eof_reader: std.io.Reader.VTable = .{ | ... | @@ -34,7 +34,7 @@ const eof_reader: std.io.Reader.VTable = .{ |
| 34 | .streamReadVec = eof_streamReadVec, | 34 | .streamReadVec = eof_streamReadVec, |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) anyerror!Reader.Status { | 37 | fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) anyerror!usize { |
| 38 | _ = context; | 38 | _ = context; |
| 39 | _ = data; | 39 | _ = data; |
| 40 | _ = splat; | 40 | _ = splat; |
| ... | @@ -44,11 +44,11 @@ fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) | ... | @@ -44,11 +44,11 @@ fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) |
| 44 | fn eof_writeFile( | 44 | fn eof_writeFile( |
| 45 | context: ?*anyopaque, | 45 | context: ?*anyopaque, |
| 46 | file: std.fs.File, | 46 | file: std.fs.File, |
| 47 | offset: u64, | 47 | offset: std.io.Writer.Offset, |
| 48 | len: Reader.FileLen, | 48 | len: std.io.Writer.FileLen, |
| 49 | headers_and_trailers: []const []const u8, | 49 | headers_and_trailers: []const []const u8, |
| 50 | headers_len: usize, | 50 | headers_len: usize, |
| 51 | ) anyerror!Reader.Status { | 51 | ) anyerror!usize { |
| 52 | _ = context; | 52 | _ = context; |
| 53 | _ = file; | 53 | _ = file; |
| 54 | _ = offset; | 54 | _ = offset; |
| ... | @@ -73,14 +73,14 @@ fn eof_posReadVec(ctx: ?*anyopaque, data: []const []u8, offset: u64) anyerror!Re | ... | @@ -73,14 +73,14 @@ fn eof_posReadVec(ctx: ?*anyopaque, data: []const []u8, offset: u64) anyerror!Re |
| 73 | return error.EndOfStream; | 73 | return error.EndOfStream; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | fn eof_streamRead(ctx: ?*anyopaque, bw: *std.io.BufferedWriter, limit: Reader.Limit) Reader.Status { | 76 | fn eof_streamRead(ctx: ?*anyopaque, bw: *std.io.BufferedWriter, limit: Reader.Limit) anyerror!Reader.Status { |
| 77 | _ = ctx; | 77 | _ = ctx; |
| 78 | _ = bw; | 78 | _ = bw; |
| 79 | _ = limit; | 79 | _ = limit; |
| 80 | return error.EndOfStream; | 80 | return error.EndOfStream; |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | fn eof_streamReadVec(ctx: ?*anyopaque, data: []const []u8) Reader.Status { | 83 | fn eof_streamReadVec(ctx: ?*anyopaque, data: []const []u8) anyerror!Reader.Status { |
| 84 | _ = ctx; | 84 | _ = ctx; |
| 85 | _ = data; | 85 | _ = data; |
| 86 | return error.EndOfStream; | 86 | return error.EndOfStream; |
| ... | @@ -91,13 +91,16 @@ pub fn initFixed(br: *BufferedReader, buffer: []const u8) void { | ... | @@ -91,13 +91,16 @@ pub fn initFixed(br: *BufferedReader, buffer: []const u8) void { |
| 91 | br.* = .{ | 91 | br.* = .{ |
| 92 | .seek = 0, | 92 | .seek = 0, |
| 93 | .storage = .{ | 93 | .storage = .{ |
| 94 | .buffer = .initBuffer(@constCast(buffer)), | 94 | .buffer = .fromOwnedSlice(@constCast(buffer)), |
| 95 | .unbuffered_writer = .{ | 95 | .unbuffered_writer = .{ |
| 96 | .context = undefined, | 96 | .context = undefined, |
| 97 | .vtable = &eof_writer, | 97 | .vtable = &eof_writer, |
| 98 | }, | 98 | }, |
| 99 | }, | 99 | }, |
| 100 | .unbuffered_reader = &.{ .context = undefined, .vtable = &eof_reader }, | 100 | .unbuffered_reader = .{ |
| 101 | .context = undefined, | ||
| 102 | .vtable = &eof_reader, | ||
| 103 | }, | ||
| 101 | }; | 104 | }; |
| 102 | } | 105 | } |
| 103 | 106 |
lib/std/io/BufferedWriter.zig+1-1| ... | @@ -50,7 +50,7 @@ pub fn initFixed(bw: *BufferedWriter, buffer: []u8) void { | ... | @@ -50,7 +50,7 @@ pub fn initFixed(bw: *BufferedWriter, buffer: []u8) void { |
| 50 | .context = bw, | 50 | .context = bw, |
| 51 | .vtable = &fixed_vtable, | 51 | .vtable = &fixed_vtable, |
| 52 | }, | 52 | }, |
| 53 | .buffer = buffer, | 53 | .buffer = .initBuffer(buffer), |
| 54 | }; | 54 | }; |
| 55 | } | 55 | } |
| 56 | 56 |
lib/std/io/Reader.zig+5| ... | @@ -85,6 +85,11 @@ pub fn posReadAll(r: Reader, w: *std.io.BufferedWriter, start_offset: u64) anyer | ... | @@ -85,6 +85,11 @@ pub fn posReadAll(r: Reader, w: *std.io.BufferedWriter, start_offset: u64) anyer |
| 85 | } | 85 | } |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | /// Returns total number of bytes written to `w`. | ||
| 89 | pub fn streamRead(r: Reader, w: *std.io.BufferedWriter, limit: Limit) anyerror!Status { | ||
| 90 | return r.vtable.streamRead.?(r.context, w, limit); | ||
| 91 | } | ||
| 92 | |||
| 88 | /// Returns total number of bytes written to `w`. | 93 | /// Returns total number of bytes written to `w`. |
| 89 | pub fn streamReadAll(r: Reader, w: *std.io.BufferedWriter) anyerror!usize { | 94 | pub fn streamReadAll(r: Reader, w: *std.io.BufferedWriter) anyerror!usize { |
| 90 | const vtable_streamRead = r.vtable.streamRead.?; | 95 | const vtable_streamRead = r.vtable.streamRead.?; |
lib/std/io/Writer.zig+4-4| ... | @@ -96,7 +96,7 @@ pub fn writeFile( | ... | @@ -96,7 +96,7 @@ pub fn writeFile( |
| 96 | pub fn unimplemented_writeFile( | 96 | pub fn unimplemented_writeFile( |
| 97 | context: ?*anyopaque, | 97 | context: ?*anyopaque, |
| 98 | file: std.fs.File, | 98 | file: std.fs.File, |
| 99 | offset: u64, | 99 | offset: Offset, |
| 100 | len: FileLen, | 100 | len: FileLen, |
| 101 | headers_and_trailers: []const []const u8, | 101 | headers_and_trailers: []const []const u8, |
| 102 | headers_len: usize, | 102 | headers_len: usize, |
| ... | @@ -136,7 +136,7 @@ fn null_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) | ... | @@ -136,7 +136,7 @@ fn null_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) |
| 136 | const pattern = data[headers.len..]; | 136 | const pattern = data[headers.len..]; |
| 137 | var written: usize = pattern.len * splat; | 137 | var written: usize = pattern.len * splat; |
| 138 | for (headers) |bytes| written += bytes.len; | 138 | for (headers) |bytes| written += bytes.len; |
| 139 | return .{ .len = written }; | 139 | return written; |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | fn null_writeFile( | 142 | fn null_writeFile( |
| ... | @@ -156,12 +156,12 @@ fn null_writeFile( | ... | @@ -156,12 +156,12 @@ fn null_writeFile( |
| 156 | const stat = try file.stat(); | 156 | const stat = try file.stat(); |
| 157 | n += stat.size - off; | 157 | n += stat.size - off; |
| 158 | for (headers_and_trailers[headers_len..]) |bytes| n += bytes.len; | 158 | for (headers_and_trailers[headers_len..]) |bytes| n += bytes.len; |
| 159 | return .{ .len = n }; | 159 | return n; |
| 160 | } | 160 | } |
| 161 | @panic("TODO stream from file until eof, counting"); | 161 | @panic("TODO stream from file until eof, counting"); |
| 162 | } | 162 | } |
| 163 | for (headers_and_trailers) |bytes| n += bytes.len; | 163 | for (headers_and_trailers) |bytes| n += bytes.len; |
| 164 | return .{ .len = len.int() + n }; | 164 | return len.int() + n; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | test @"null" { | 167 | test @"null" { |