summaryrefslogtreecommitdiffstats
path: root/usr.bin/ar/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/ar/write.c')
-rw-r--r--usr.bin/ar/write.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/usr.bin/ar/write.c b/usr.bin/ar/write.c
index 96f4199..49f539b 100644
--- a/usr.bin/ar/write.c
+++ b/usr.bin/ar/write.c
@@ -586,10 +586,17 @@ prefault_buffer(const char *buf, size_t s)
static void
write_data(struct bsdar *bsdar, struct archive *a, const void *buf, size_t s)
{
+ ssize_t written;
+
prefault_buffer(buf, s);
- if (archive_write_data(a, buf, s) != (ssize_t)s)
- bsdar_errc(bsdar, EX_SOFTWARE, 0, "%s",
- archive_error_string(a));
+ while (s > 0) {
+ written = archive_write_data(a, buf, s);
+ if (written < 0)
+ bsdar_errc(bsdar, EX_SOFTWARE, 0, "%s",
+ archive_error_string(a));
+ buf = (const char *)buf + written;
+ s -= written;
+ }
}
/*
OpenPOWER on IntegriCloud