summaryrefslogtreecommitdiff
path: root/lib/libarchive/archive_write_set_compression_bzip2.c
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@FreeBSD.org>2004-11-05 05:26:30 +0000
committerTim Kientzle <kientzle@FreeBSD.org>2004-11-05 05:26:30 +0000
commit3ede53f3e110b32ada789816c8ef2684c58e3783 (patch)
treebbc8fe472af0e8dbd66e73826de4bcb674aab1ff /lib/libarchive/archive_write_set_compression_bzip2.c
parent9fb9f102864aa1304fc99f558ad7c467f0ee1713 (diff)
Notes
Diffstat (limited to 'lib/libarchive/archive_write_set_compression_bzip2.c')
-rw-r--r--lib/libarchive/archive_write_set_compression_bzip2.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/lib/libarchive/archive_write_set_compression_bzip2.c b/lib/libarchive/archive_write_set_compression_bzip2.c
index c7cee5e6d580..901ce8c69fc0 100644
--- a/lib/libarchive/archive_write_set_compression_bzip2.c
+++ b/lib/libarchive/archive_write_set_compression_bzip2.c
@@ -32,6 +32,7 @@
__FBSDID("$FreeBSD$");
#include <errno.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bzlib.h>
@@ -153,15 +154,17 @@ archive_compressor_bzip2_init(struct archive *a)
/*
* Write data to the compressed stream.
+ *
+ * Returns ARCHIVE_OK if all data written, error otherwise.
*/
-static ssize_t
+static int
archive_compressor_bzip2_write(struct archive *a, const void *buff,
size_t length)
{
struct private_data *state;
state = a->compression_data;
- if (!a->client_writer) {
+ if (a->client_writer == NULL) {
archive_set_error(a, ARCHIVE_ERRNO_PROGRAMMER,
"No write callback is registered? "
"This is probably an internal programming error.");
@@ -175,9 +178,9 @@ archive_compressor_bzip2_write(struct archive *a, const void *buff,
SET_NEXT_IN(state, buff);
state->stream.avail_in = length;
if (drive_compressor(a, state, 0))
- return (-1);
+ return (ARCHIVE_FATAL);
a->file_position += length;
- return (length);
+ return (ARCHIVE_OK);
}
@@ -191,6 +194,7 @@ archive_compressor_bzip2_finish(struct archive *a)
int ret;
struct private_data *state;
ssize_t target_block_length;
+ ssize_t bytes_written;
unsigned tocopy;
state = a->compression_data;
@@ -246,12 +250,16 @@ archive_compressor_bzip2_finish(struct archive *a)
}
/* Write the last block */
- ret = (a->client_writer)(a, a->client_data, state->compressed,
- block_length);
+ bytes_written = (a->client_writer)(a, a->client_data,
+ state->compressed, block_length);
- a->raw_position += ret;
- if (ret != 0)
- goto cleanup;
+ /* TODO: Handle short write of final block. */
+ if (bytes_written <= 0)
+ ret = ARCHIVE_FATAL;
+ else {
+ a->raw_position += ret;
+ ret = ARCHIVE_OK;
+ }
/* Cleanup: shut down compressor, release memory, etc. */
cleanup:
@@ -284,27 +292,28 @@ cleanup:
static int
drive_compressor(struct archive *a, struct private_data *state, int finishing)
{
- size_t ret;
+ ssize_t bytes_written;
+ int ret;
for (;;) {
if (state->stream.avail_out == 0) {
- ret = (a->client_writer)(a, a->client_data,
+ bytes_written = (a->client_writer)(a, a->client_data,
state->compressed, state->compressed_buffer_size);
- if (ret <= 0) {
+ if (bytes_written <= 0) {
/* TODO: Handle this write failure */
return (ARCHIVE_FATAL);
- } else if (ret < state->compressed_buffer_size) {
+ } else if ((size_t)bytes_written < state->compressed_buffer_size) {
/* Short write: Move remainder to
* front and keep filling */
memmove(state->compressed,
- state->compressed + ret,
- state->compressed_buffer_size - ret);
+ state->compressed + bytes_written,
+ state->compressed_buffer_size - bytes_written);
}
- a->raw_position += ret;
+ a->raw_position += bytes_written;
state->stream.next_out = state->compressed +
- state->compressed_buffer_size - ret;
- state->stream.avail_out = ret;
+ state->compressed_buffer_size - bytes_written;
+ state->stream.avail_out = bytes_written;
}
ret = BZ2_bzCompress(&(state->stream),