diff options
author | kientzle <kientzle@FreeBSD.org> | 2007-09-21 04:52:43 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2007-09-21 04:52:43 +0000 |
commit | 22dc0ec6a9f3f21ca6f415759b905217ed587aff (patch) | |
tree | 9a6acbcc524ee1351ee95a0c02082c99d2d75858 /lib/libarchive/archive_write_disk.c | |
parent | 66d80bdf9359351cec7c1c27da2d4b221d62e82a (diff) | |
download | FreeBSD-src-22dc0ec6a9f3f21ca6f415759b905217ed587aff.zip FreeBSD-src-22dc0ec6a9f3f21ca6f415759b905217ed587aff.tar.gz |
Fix the archive_write_data() function so it always returns
number of bytes written, even when used to write files to
disk. Extend the test suite to verify the correct return
values for archive_write_data() and archive_write_data_block().
Thanks to: Bruce Mah, for stepping in promptly to back out the
earlier broken version of this fix
Thanks to: Colin Percival, for pointing out the correct fix
MFC after: 5 days
Approved by: re (ksmith)
Pointy hat: \me
Diffstat (limited to 'lib/libarchive/archive_write_disk.c')
-rw-r--r-- | lib/libarchive/archive_write_disk.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/libarchive/archive_write_disk.c b/lib/libarchive/archive_write_disk.c index f5fb3aa..435522c 100644 --- a/lib/libarchive/archive_write_disk.c +++ b/lib/libarchive/archive_write_disk.c @@ -448,8 +448,10 @@ _archive_write_data_block(struct archive *_a, __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, ARCHIVE_STATE_DATA, "archive_write_disk_block"); - if (a->fd < 0) - return (ARCHIVE_OK); + if (a->fd < 0) { + archive_set_error(&a->archive, 0, "File not open"); + return (ARCHIVE_WARN); + } archive_clear_error(&a->archive); /* Seek if necessary to the specified offset. */ @@ -478,12 +480,17 @@ static ssize_t _archive_write_data(struct archive *_a, const void *buff, size_t size) { struct archive_write_disk *a = (struct archive_write_disk *)_a; + int r; + __archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, ARCHIVE_STATE_DATA, "archive_write_data"); if (a->fd < 0) return (ARCHIVE_OK); - return (_archive_write_data_block(_a, buff, size, a->offset)); + r = _archive_write_data_block(_a, buff, size, a->offset); + if (r < ARCHIVE_OK) + return (r); + return (size); } static int |