| ... | @@ -439,11 +439,13 @@ pub fn pread(fd: fd_t, buf: []u8, offset: u64) PReadError!usize { | ... | @@ -439,11 +439,13 @@ pub fn pread(fd: fd_t, buf: []u8, offset: u64) PReadError!usize { |
| 439 | } | 439 | } |
| 440 | | 440 | |
| 441 | pub const TruncateError = error{ | 441 | pub const TruncateError = error{ |
| 442 | /// The file descriptor is not open for writing. | 442 | FileTooBig, |
| 443 | NotFile, | 443 | InputOutput, |
| | 444 | CannotTruncate, |
| | 445 | FileBusy, |
| 444 | } || UnexpectedError; | 446 | } || UnexpectedError; |
| 445 | | 447 | |
| 446 | pub fn truncate(fd: fd_t, length: u64) TruncateError!void { | 448 | pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void { |
| 447 | if (std.Target.current.os.tag == .windows) { | 449 | if (std.Target.current.os.tag == .windows) { |
| 448 | try windows.SetFilePointerEx_BEGIN(fd, length); | 450 | try windows.SetFilePointerEx_BEGIN(fd, length); |
| 449 | | 451 | |
| ... | @@ -454,18 +456,22 @@ pub fn truncate(fd: fd_t, length: u64) TruncateError!void { | ... | @@ -454,18 +456,22 @@ pub fn truncate(fd: fd_t, length: u64) TruncateError!void { |
| 454 | } | 456 | } |
| 455 | | 457 | |
| 456 | while (true) { | 458 | while (true) { |
| 457 | const rc = if (builtin.link_libc) blk: { | 459 | const rc = if (builtin.link_libc) |
| 458 | if (std.Target.current.os.tag == .linux) | 460 | if (std.Target.current.os.tag == .linux) |
| 459 | break :blk system.ftruncate64(fd, @bitCast(off_t, length)) | 461 | system.ftruncate64(fd, @bitCast(off_t, length)) |
| 460 | else | 462 | else |
| 461 | break :blk system.ftruncate(fd, @bitCast(off_t, length)); | 463 | system.ftruncate(fd, @bitCast(off_t, length)) |
| 462 | } else | 464 | else |
| 463 | system.ftruncate(fd, length); | 465 | system.ftruncate(fd, length); |
| 464 | | 466 | |
| 465 | switch (errno(rc)) { | 467 | switch (errno(rc)) { |
| 466 | 0 => return, | 468 | 0 => return, |
| 467 | EINTR => continue, | 469 | EINTR => continue, |
| 468 | EBADF, EINVAL => return error.NotFile, | 470 | EFBIG => return error.FileTooBig, |
| | 471 | EIO => return error.InputOutput, |
| | 472 | EPERM => return error.CannotTruncate, |
| | 473 | ETXTBSY => return error.FileBusy, |
| | 474 | EBADF, EINVAL => unreachable, |
| 469 | else => |err| return unexpectedErrno(err), | 475 | else => |err| return unexpectedErrno(err), |
| 470 | } | 476 | } |
| 471 | } | 477 | } |