authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-02-05 13:21:08-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-02-05 13:21:08-05:00
log917e6fe3707a82f76c48e484735b86937831451f
treeb99c3886970bd5f9ff6f2597f746039ae40fe0a4
parent40e4e42a669a5312cf9400a5e96d6288b44be286

handle linux returning EINVAL for large writes

See #743

1 files changed, 10 insertions(+), 4 deletions(-)

std/os/index.zig+10-4
......@@ -225,9 +225,15 @@ error BrokenPipe;
225225
226226/// Calls POSIX write, and keeps trying if it gets interrupted.
227227pub fn posixWrite(fd: i32, bytes: []const u8) %void {
228 while (true) {
229 const write_ret = posix.write(fd, bytes.ptr, bytes.len);
230 const write_err = posix.getErrno(write_ret);
228 // Linux can return EINVAL when write amount is > 0x7ffff000
229 // See https://github.com/zig-lang/zig/pull/743#issuecomment-363165856
230 const max_bytes_len = 0x7ffff000;
231
232 var index: usize = 0;
233 while (index < bytes.len) {
234 const amt_to_write = math.min(bytes.len - index, usize(max_bytes_len));
235 const rc = posix.write(fd, &bytes[index], amt_to_write);
236 const write_err = posix.getErrno(rc);
231237 if (write_err > 0) {
232238 return switch (write_err) {
233239 posix.EINTR => continue,
......@@ -244,7 +250,7 @@ pub fn posixWrite(fd: i32, bytes: []const u8) %void {
244250 else => unexpectedErrorPosix(write_err),
245251 };
246252 }
247 return;
253 index += rc;
248254 }
249255}
250256