summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/archive_write_set_compression_gzip.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libarchive/archive_write_set_compression_gzip.c')
-rw-r--r--lib/libarchive/archive_write_set_compression_gzip.c74
1 files changed, 39 insertions, 35 deletions
diff --git a/lib/libarchive/archive_write_set_compression_gzip.c b/lib/libarchive/archive_write_set_compression_gzip.c
index 09f43f6..38742f3 100644
--- a/lib/libarchive/archive_write_set_compression_gzip.c
+++ b/lib/libarchive/archive_write_set_compression_gzip.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include "archive.h"
#include "archive_private.h"
+#include "archive_write_private.h"
struct private_data {
z_stream stream;
@@ -63,11 +64,11 @@ struct private_data {
#define SET_NEXT_IN(st,src) \
(st)->stream.next_in = (Bytef *)(uintptr_t)(const void *)(src)
-static int archive_compressor_gzip_finish(struct archive *);
-static int archive_compressor_gzip_init(struct archive *);
-static int archive_compressor_gzip_write(struct archive *, const void *,
- size_t);
-static int drive_compressor(struct archive *, struct private_data *,
+static int archive_compressor_gzip_finish(struct archive_write *);
+static int archive_compressor_gzip_init(struct archive_write *);
+static int archive_compressor_gzip_write(struct archive_write *,
+ const void *, size_t);
+static int drive_compressor(struct archive_write *, struct private_data *,
int finishing);
@@ -75,12 +76,14 @@ static int drive_compressor(struct archive *, struct private_data *,
* Allocate, initialize and return a archive object.
*/
int
-archive_write_set_compression_gzip(struct archive *a)
+archive_write_set_compression_gzip(struct archive *_a)
{
- __archive_check_magic(a, ARCHIVE_WRITE_MAGIC, ARCHIVE_STATE_NEW, "archive_write_set_compression_gzip");
+ struct archive_write *a = (struct archive_write *)_a;
+ __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC,
+ ARCHIVE_STATE_NEW, "archive_write_set_compression_gzip");
a->compression_init = &archive_compressor_gzip_init;
- a->compression_code = ARCHIVE_COMPRESSION_GZIP;
- a->compression_name = "gzip";
+ a->archive.compression_code = ARCHIVE_COMPRESSION_GZIP;
+ a->archive.compression_name = "gzip";
return (ARCHIVE_OK);
}
@@ -88,24 +91,24 @@ archive_write_set_compression_gzip(struct archive *a)
* Setup callback.
*/
static int
-archive_compressor_gzip_init(struct archive *a)
+archive_compressor_gzip_init(struct archive_write *a)
{
int ret;
struct private_data *state;
time_t t;
- a->compression_code = ARCHIVE_COMPRESSION_GZIP;
- a->compression_name = "gzip";
+ a->archive.compression_code = ARCHIVE_COMPRESSION_GZIP;
+ a->archive.compression_name = "gzip";
if (a->client_opener != NULL) {
- ret = (a->client_opener)(a, a->client_data);
+ ret = (a->client_opener)(&a->archive, a->client_data);
if (ret != ARCHIVE_OK)
return (ret);
}
state = (struct private_data *)malloc(sizeof(*state));
if (state == NULL) {
- archive_set_error(a, ENOMEM,
+ archive_set_error(&a->archive, ENOMEM,
"Can't allocate data for compression");
return (ARCHIVE_FATAL);
}
@@ -116,7 +119,7 @@ archive_compressor_gzip_init(struct archive *a)
state->crc = crc32(0L, NULL, 0);
if (state->compressed == NULL) {
- archive_set_error(a, ENOMEM,
+ archive_set_error(&a->archive, ENOMEM,
"Can't allocate data for compression buffer");
free(state);
return (ARCHIVE_FATAL);
@@ -157,7 +160,7 @@ archive_compressor_gzip_init(struct archive *a)
}
/* Library setup failed: clean up. */
- archive_set_error(a, ARCHIVE_ERRNO_MISC, "Internal error "
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Internal error "
"initializing compression library");
free(state->compressed);
free(state);
@@ -165,16 +168,16 @@ archive_compressor_gzip_init(struct archive *a)
/* Override the error message if we know what really went wrong. */
switch (ret) {
case Z_STREAM_ERROR:
- archive_set_error(a, ARCHIVE_ERRNO_MISC,
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Internal error initializing "
"compression library: invalid setup parameter");
break;
case Z_MEM_ERROR:
- archive_set_error(a, ENOMEM, "Internal error initializing "
+ archive_set_error(&a->archive, ENOMEM, "Internal error initializing "
"compression library");
break;
case Z_VERSION_ERROR:
- archive_set_error(a, ARCHIVE_ERRNO_MISC,
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Internal error initializing "
"compression library: invalid library version");
break;
@@ -187,7 +190,7 @@ archive_compressor_gzip_init(struct archive *a)
* Write data to the compressed stream.
*/
static int
-archive_compressor_gzip_write(struct archive *a, const void *buff,
+archive_compressor_gzip_write(struct archive_write *a, const void *buff,
size_t length)
{
struct private_data *state;
@@ -195,7 +198,7 @@ archive_compressor_gzip_write(struct archive *a, const void *buff,
state = (struct private_data *)a->compression_data;
if (a->client_writer == NULL) {
- archive_set_error(a, ARCHIVE_ERRNO_PROGRAMMER,
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
"No write callback is registered? "
"This is probably an internal programming error.");
return (ARCHIVE_FATAL);
@@ -211,7 +214,7 @@ archive_compressor_gzip_write(struct archive *a, const void *buff,
if ((ret = drive_compressor(a, state, 0)) != ARCHIVE_OK)
return (ret);
- a->file_position += length;
+ a->archive.file_position += length;
return (ARCHIVE_OK);
}
@@ -220,7 +223,7 @@ archive_compressor_gzip_write(struct archive *a, const void *buff,
* Finish the compression...
*/
static int
-archive_compressor_gzip_finish(struct archive *a)
+archive_compressor_gzip_finish(struct archive_write *a)
{
ssize_t block_length, target_block_length, bytes_written;
int ret;
@@ -231,7 +234,7 @@ archive_compressor_gzip_finish(struct archive *a)
state = (struct private_data *)a->compression_data;
ret = 0;
if (a->client_writer == NULL) {
- archive_set_error(a, ARCHIVE_ERRNO_PROGRAMMER,
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
"No write callback is registered? "
"This is probably an internal programming error.");
ret = ARCHIVE_FATAL;
@@ -280,13 +283,13 @@ archive_compressor_gzip_finish(struct archive *a)
/* If it overflowed, flush and start a new block. */
if (tocopy < 8) {
- bytes_written = (a->client_writer)(a, a->client_data,
+ bytes_written = (a->client_writer)(&a->archive, a->client_data,
state->compressed, state->compressed_buffer_size);
if (bytes_written <= 0) {
ret = ARCHIVE_FATAL;
goto cleanup;
}
- a->raw_position += bytes_written;
+ a->archive.raw_position += bytes_written;
state->stream.next_out = state->compressed;
state->stream.avail_out = state->compressed_buffer_size;
memcpy(state->stream.next_out, trailer + tocopy, 8-tocopy);
@@ -317,13 +320,13 @@ archive_compressor_gzip_finish(struct archive *a)
}
/* Write the last block */
- bytes_written = (a->client_writer)(a, a->client_data,
+ bytes_written = (a->client_writer)(&a->archive, a->client_data,
state->compressed, block_length);
if (bytes_written <= 0) {
ret = ARCHIVE_FATAL;
goto cleanup;
}
- a->raw_position += bytes_written;
+ a->archive.raw_position += bytes_written;
/* Cleanup: shut down compressor, release memory, etc. */
cleanup:
@@ -331,7 +334,7 @@ cleanup:
case Z_OK:
break;
default:
- archive_set_error(a, ARCHIVE_ERRNO_MISC,
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Failed to clean up compressor");
ret = ARCHIVE_FATAL;
}
@@ -340,7 +343,7 @@ cleanup:
/* Close the output */
if (a->client_closer != NULL)
- (a->client_closer)(a, a->client_data);
+ (a->client_closer)(&a->archive, a->client_data);
return (ret);
}
@@ -353,15 +356,16 @@ cleanup:
* false) and the end-of-archive case (finishing == true).
*/
static int
-drive_compressor(struct archive *a, struct private_data *state, int finishing)
+drive_compressor(struct archive_write *a, struct private_data *state, int finishing)
{
ssize_t bytes_written;
int ret;
for (;;) {
if (state->stream.avail_out == 0) {
- bytes_written = (a->client_writer)(a, a->client_data,
- state->compressed, state->compressed_buffer_size);
+ bytes_written = (a->client_writer)(&a->archive,
+ a->client_data, state->compressed,
+ state->compressed_buffer_size);
if (bytes_written <= 0) {
/* TODO: Handle this write failure */
return (ARCHIVE_FATAL);
@@ -372,7 +376,7 @@ drive_compressor(struct archive *a, struct private_data *state, int finishing)
state->compressed + bytes_written,
state->compressed_buffer_size - bytes_written);
}
- a->raw_position += bytes_written;
+ a->archive.raw_position += bytes_written;
state->stream.next_out
= state->compressed +
state->compressed_buffer_size - bytes_written;
@@ -396,7 +400,7 @@ drive_compressor(struct archive *a, struct private_data *state, int finishing)
return (ARCHIVE_OK);
default:
/* Any other return value indicates an error. */
- archive_set_error(a, ARCHIVE_ERRNO_MISC,
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"GZip compression failed");
return (ARCHIVE_FATAL);
}
OpenPOWER on IntegriCloud