| 541 | } |
| 542 | |
| 543 | static bool posix_complete_write(int fd, const char *record, size_t record_length, |
| 544 | off_t original_size) { |
| 545 | size_t written = 0; |
| 546 | while (written < record_length) { |
| 547 | ssize_t count = write(fd, record + written, record_length - written); |
| 548 | if (count > 0) { |
| 549 | written += (size_t)count; |
| 550 | } else if (count < 0 && errno == EINTR) { |
| 551 | continue; |
| 552 | } else { |
| 553 | (void)ftruncate(fd, original_size); |
| 554 | return false; |
| 555 | } |
| 556 | } |
| 557 | while (fsync(fd) != 0) { |
| 558 | if (errno != EINTR) { |
| 559 | (void)ftruncate(fd, original_size); |
| 560 | return false; |
| 561 | } |
| 562 | } |
| 563 | return true; |
| 564 | } |
| 565 | |
| 566 | static bool posix_sync(int fd) { |
| 567 | for (;;) { |