diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/fs/file.zig | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/lib/std/fs/file.zig b/lib/std/fs/file.zig index 8d4f5df2e8..e0795f4c1c 100644 --- a/lib/std/fs/file.zig +++ b/lib/std/fs/file.zig @@ -615,7 +615,7 @@ pub const File = struct { } } - pub fn pwritev(self: File, iovecs: []os.iovec_const, offset: usize) PWriteError!usize { + pub fn pwritev(self: File, iovecs: []os.iovec_const, offset: u64) PWriteError!usize { if (is_windows) { // TODO improve this to use WriteFileScatter if (iovecs.len == 0) return @as(usize, 0); @@ -632,11 +632,11 @@ pub const File = struct { /// The `iovecs` parameter is mutable because this function needs to mutate the fields in /// order to handle partial writes from the underlying OS layer. - pub fn pwritevAll(self: File, iovecs: []os.iovec_const, offset: usize) PWriteError!void { + pub fn pwritevAll(self: File, iovecs: []os.iovec_const, offset: u64) PWriteError!void { if (iovecs.len == 0) return; var i: usize = 0; - var off: usize = 0; + var off: u64 = 0; while (true) { var amt = try self.pwritev(iovecs[i..], offset + off); off += amt; @@ -652,24 +652,25 @@ pub const File = struct { pub const CopyRangeError = os.CopyFileRangeError; - pub fn copyRange(in: File, in_offset: u64, out: File, out_offset: u64, len: usize) CopyRangeError!usize { - return os.copy_file_range(in.handle, in_offset, out.handle, out_offset, len, 0); + pub fn copyRange(in: File, in_offset: u64, out: File, out_offset: u64, len: u64) CopyRangeError!usize { + const adjusted_len = math.cast(usize, len) catch math.maxInt(usize); + return os.copy_file_range(in.handle, in_offset, out.handle, out_offset, adjusted_len, 0); } /// Returns the number of bytes copied. If the number read is smaller than `buffer.len`, it /// means the in file reached the end. Reaching the end of a file is not an error condition. - pub fn copyRangeAll(in: File, in_offset: u64, out: File, out_offset: u64, len: usize) CopyRangeError!usize { - var total_bytes_copied: usize = 0; + pub fn copyRangeAll(in: File, in_offset: u64, out: File, out_offset: u64, len: u64) CopyRangeError!usize { + var total_bytes_copied: u64 = 0; var in_off = in_offset; var out_off = out_offset; while (total_bytes_copied < len) { - const amt_copied = try copyRange(in, in_off, out, out_off, len - total_bytes_copied); - if (amt_copied == 0) return total_bytes_copied; + const amt_copied = try copyRange(in, in_off, out, out_off, len); + if (amt_copied == 0) return @intCast(usize, total_bytes_copied); total_bytes_copied += amt_copied; in_off += amt_copied; out_off += amt_copied; } - return total_bytes_copied; + return @intCast(usize, total_bytes_copied); } pub const WriteFileOptions = struct { |
