* Close a filter.
*/
int
-__archive_write_close_filter(struct archive_write_filter *f)
+__archive_write_close_filter(struct archive_write *a)
{
- if (f->close != NULL)
- return (f->close)(f);
- if (f->next_filter != NULL)
- return (__archive_write_close_filter(f->next_filter));
- return (ARCHIVE_OK);
+ struct archive_write_filter *f;
+ int ret, ret1;
+ ret = ARCHIVE_OK;
+ for (f = a->filter_first; f != NULL; f = f->next_filter) {
+ if (f->close != NULL) {
+ ret1 = (f->close)(f);
+ if (ret1 < ret)
+ ret = ret1;
+ }
+ }
+ return (ret);
}
int
ret = __archive_write_open_filter(a->filter_first);
if (ret < ARCHIVE_WARN) {
- r1 = __archive_write_close_filter(a->filter_first);
+ r1 = __archive_write_close_filter(a);
return (r1 < ret ? r1 : ret);
}
}
/* Finish the compression and close the stream. */
- r1 = __archive_write_close_filter(a->filter_first);
+ r1 = __archive_write_close_filter(a);
if (r1 < r)
r = r1;
archive_filter_b64encode_close(struct archive_write_filter *f)
{
struct private_b64encode *state = (struct private_b64encode *)f->data;
- int ret, ret2;
/* Flush remaining bytes. */
if (state->hold_len != 0)
archive_string_sprintf(&state->encoded_buff, "====\n");
/* Write the last block */
archive_write_set_bytes_in_last_block(f->archive, 1);
- ret = __archive_write_filter(f->next_filter,
+ return __archive_write_filter(f->next_filter,
state->encoded_buff.s, archive_strlen(&state->encoded_buff));
- ret2 = __archive_write_close_filter(f->next_filter);
- if (ret > ret2)
- ret = ret2;
- return (ret);
}
static int
archive_compressor_bzip2_close(struct archive_write_filter *f)
{
struct private_data *data = (struct private_data *)f->data;
- int ret, r1;
+ int ret;
/* Finish compression cycle. */
ret = drive_compressor(f, data, 1);
"Failed to clean up compressor");
ret = ARCHIVE_FATAL;
}
-
- r1 = __archive_write_close_filter(f->next_filter);
- return (r1 < ret ? r1 : ret);
+ return ret;
}
static int
archive_compressor_compress_close(struct archive_write_filter *f)
{
struct private_data *state = (struct private_data *)f->data;
- int ret, ret2;
+ int ret;
ret = output_code(f, state->cur_code);
if (ret != ARCHIVE_OK)
- goto cleanup;
+ return ret;
ret = output_flush(f);
if (ret != ARCHIVE_OK)
- goto cleanup;
+ return ret;
/* Write the last block */
ret = __archive_write_filter(f->next_filter,
state->compressed, state->compressed_offset);
-cleanup:
- ret2 = __archive_write_close_filter(f->next_filter);
- if (ret > ret2)
- ret = ret2;
return (ret);
}
{
unsigned char trailer[8];
struct private_data *data = (struct private_data *)f->data;
- int ret, r1;
+ int ret;
/* Finish compression cycle */
ret = drive_compressor(f, data, 1);
"Failed to clean up compressor");
ret = ARCHIVE_FATAL;
}
- r1 = __archive_write_close_filter(f->next_filter);
- return (r1 < ret ? r1 : ret);
+ return ret;
}
/*
ret = __archive_write_filter(f->next_filter,
data->out_buffer, data->out - data->out_buffer);
}
-
- r1 = __archive_write_close_filter(f->next_filter);
- return (r1 < ret ? r1 : ret);
+ return ret;
}
static int
}
/* Write a zero uncompressed size as the end mark of the series of
* compressed block. */
- r = __archive_write_filter(f->next_filter, &endmark, sizeof(endmark));
- if (r != ARCHIVE_OK)
- return (r);
- return (__archive_write_close_filter(f->next_filter));
+ return __archive_write_filter(f->next_filter, &endmark, sizeof(endmark));
}
#else
__archive_write_program_close(struct archive_write_filter *f,
struct archive_write_program_data *data)
{
- int ret, r1, status;
+ int ret, status;
ssize_t bytes_read;
if (data->child == 0)
- return __archive_write_close_filter(f->next_filter);
+ return ARCHIVE_OK;
ret = 0;
close(data->child_stdin);
"Error closing program: %s", data->program_name);
ret = ARCHIVE_FATAL;
}
- r1 = __archive_write_close_filter(f->next_filter);
- return (r1 < ret ? r1 : ret);
+ return ret;
}
archive_filter_uuencode_close(struct archive_write_filter *f)
{
struct private_uuencode *state = (struct private_uuencode *)f->data;
- int ret, ret2;
/* Flush remaining bytes. */
if (state->hold_len != 0)
archive_string_sprintf(&state->encoded_buff, "`\nend\n");
/* Write the last block */
archive_write_set_bytes_in_last_block(f->archive, 1);
- ret = __archive_write_filter(f->next_filter,
+ return __archive_write_filter(f->next_filter,
state->encoded_buff.s, archive_strlen(&state->encoded_buff));
- ret2 = __archive_write_close_filter(f->next_filter);
- if (ret > ret2)
- ret = ret2;
- return (ret);
}
static int
archive_compressor_xz_close(struct archive_write_filter *f)
{
struct private_data *data = (struct private_data *)f->data;
- int ret, r1;
+ int ret;
ret = drive_compressor(f, data, 1);
if (ret == ARCHIVE_OK) {
}
}
lzma_end(&(data->stream));
- r1 = __archive_write_close_filter(f->next_filter);
- return (r1 < ret ? r1 : ret);
+ return ret;
}
static int
int r1, r2;
/* Finish zstd frame */
- r1 = drive_compressor(f, data, 1, NULL, 0);
-
- r2 = __archive_write_close_filter(f->next_filter);
-
- return r1 < r2 ? r1 : r2;
+ return drive_compressor(f, data, 1, NULL, 0);
}
/*
int __archive_write_nulls(struct archive_write *, size_t);
int __archive_write_filter(struct archive_write_filter *, const void *, size_t);
int __archive_write_open_filter(struct archive_write_filter *);
-int __archive_write_close_filter(struct archive_write_filter *);
+int __archive_write_close_filter(struct archive_write *);
struct archive_write {
struct archive archive;