aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@FreeBSD.org>2007-02-14 08:16:08 +0000
committerTim Kientzle <kientzle@FreeBSD.org>2007-02-14 08:16:08 +0000
commiteffb1b7fcba84c9a651018587f398965ab460f7d (patch)
treef116053195ae3958e83f9d7a9ed5839466a36be5
parent0411582e87e1f934ccad00d89017fa53e0b48139 (diff)
Notes
-rw-r--r--usr.bin/tar/write.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c
index 09016ddc76a5..d7fbcfb8b15f 100644
--- a/usr.bin/tar/write.c
+++ b/usr.bin/tar/write.c
@@ -851,11 +851,19 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a, int fd)
bytes_read = read(fd, buff, sizeof(buff));
while (bytes_read > 0) {
bytes_written = archive_write_data(a, buff, bytes_read);
- if (bytes_written <= 0) {
+ if (bytes_written < 0) {
/* Write failed; this is bad */
bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a));
return (-1);
}
+ if (bytes_written < bytes_read) {
+ /* Write was truncated; warn but continue. */
+ bsdtar_warnc(bsdtar, 0,
+ "Truncated write; file may have grown while being archived.");
+ /* Make bsdtar return a final error because of this. */
+ bsdtar->return_value = 1;
+ return (0);
+ }
bytes_read = read(fd, buff, sizeof(buff));
}
return 0;