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