summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/archive_write_disk.c
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2007-09-21 04:52:43 +0000
committerkientzle <kientzle@FreeBSD.org>2007-09-21 04:52:43 +0000
commit22dc0ec6a9f3f21ca6f415759b905217ed587aff (patch)
tree9a6acbcc524ee1351ee95a0c02082c99d2d75858 /lib/libarchive/archive_write_disk.c
parent66d80bdf9359351cec7c1c27da2d4b221d62e82a (diff)
downloadFreeBSD-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.c13
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
OpenPOWER on IntegriCloud