]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Refactor archive_write_close_filter logic
authorJoerg Sonnenberger <joerg@bec.de>
Sat, 19 Oct 2019 15:09:11 +0000 (17:09 +0200)
committerJoerg Sonnenberger <joerg@bec.de>
Wed, 27 Nov 2019 20:34:32 +0000 (21:34 +0100)
12 files changed:
libarchive/archive_write.c
libarchive/archive_write_add_filter_b64encode.c
libarchive/archive_write_add_filter_bzip2.c
libarchive/archive_write_add_filter_compress.c
libarchive/archive_write_add_filter_gzip.c
libarchive/archive_write_add_filter_lz4.c
libarchive/archive_write_add_filter_lzop.c
libarchive/archive_write_add_filter_program.c
libarchive/archive_write_add_filter_uuencode.c
libarchive/archive_write_add_filter_xz.c
libarchive/archive_write_add_filter_zstd.c
libarchive/archive_write_private.h

index e8daf530d2606fb96689c983aa69aeed2d427129..9fa46bf5e3f841b9df62fccb3589f878b3334860 100644 (file)
@@ -254,13 +254,19 @@ __archive_write_open_filter(struct archive_write_filter *f)
  * 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
@@ -479,7 +485,7 @@ archive_write_open(struct archive *_a, void *client_data,
 
        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);
        }
 
@@ -521,7 +527,7 @@ _archive_write_close(struct archive *_a)
        }
 
        /* 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;
 
index b46b19a0c74d10983b8e667c23288738bb4a64c0..fe4ae247b0575c69deebcb86dd0026c52c084dd2 100644 (file)
@@ -266,7 +266,6 @@ static int
 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)
@@ -274,12 +273,8 @@ archive_filter_b64encode_close(struct archive_write_filter *f)
        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
index 68ed9579b0277fbeb2735d914cee32418abc2e43..13f88e986c21ea97659b482e2fb01c570bcb7e12 100644 (file)
@@ -262,7 +262,7 @@ 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);
@@ -281,9 +281,7 @@ archive_compressor_bzip2_close(struct archive_write_filter *f)
                    "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
index 11e879323b7534f84ccb5fee1159615590a4e8e8..285dfc2deef9c64cd35ae4151aab38452ea75595 100644 (file)
@@ -426,22 +426,18 @@ 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);
 }
 
index e4b3435e42068ff951f05045a277c648baca8c7c..5deb17e24f432beb6e17e529176651e53b13765c 100644 (file)
@@ -307,7 +307,7 @@ archive_compressor_gzip_close(struct archive_write_filter *f)
 {
        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);
@@ -338,8 +338,7 @@ archive_compressor_gzip_close(struct archive_write_filter *f)
                    "Failed to clean up compressor");
                ret = ARCHIVE_FATAL;
        }
-       r1 = __archive_write_close_filter(f->next_filter);
-       return (r1 < ret ? r1 : ret);
+       return ret;
 }
 
 /*
index 15fd494a41973d705f7d6967fa32f88a2175ac16..9d73bb657fa2fa2fe25caa6e46a240a6fbd53900 100644 (file)
@@ -366,9 +366,7 @@ archive_filter_lz4_close(struct archive_write_filter *f)
                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
index ad705c4a068720aeee480fb4ae5cd534a9fec976..6a2dd86c57c8018438d5bf741dbc600b7d3ebaca 100644 (file)
@@ -439,10 +439,7 @@ archive_write_lzop_close(struct archive_write_filter *f)
        }
        /* 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
index 660f693f29d0f67b19e02d460e994bafe5e47f4a..74588d3a5ea072a946119cf84de28efd295f7fdb 100644 (file)
@@ -353,11 +353,11 @@ int
 __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);
@@ -409,7 +409,6 @@ cleanup:
                    "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;
 }
 
index 23d9c150d17fc8a11dea961a61e48f1512a1aac7..92fab6bbf5d4a7938dd5c7d08a7b3ece98162bc5 100644 (file)
@@ -257,7 +257,6 @@ static int
 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)
@@ -265,12 +264,8 @@ archive_filter_uuencode_close(struct archive_write_filter *f)
        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
index 0f7c8cfc31a5daf9d16f21d08f108086b5e610e6..557cc77e4077a5980663667ff7d1a9dceb4ca40b 100644 (file)
@@ -448,7 +448,7 @@ 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) {
@@ -466,8 +466,7 @@ archive_compressor_xz_close(struct archive_write_filter *f)
                }
        }
        lzma_end(&(data->stream));
-       r1 = __archive_write_close_filter(f->next_filter);
-       return (r1 < ret ? r1 : ret);
+       return ret;
 }
 
 static int
index 671fc6affbaa31aaa0952e9af40e0105ff0867cf..f7a0f2394a3fde7086a99a36723e673896ad2a6a 100644 (file)
@@ -241,11 +241,7 @@ archive_compressor_zstd_close(struct archive_write_filter *f)
        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);
 }
 
 /*
index 0dfd1b1bca918f1934d8c8f7cccc6eb5a16a495f..234893e39f014b9fef1e83128b7ff43e68b7af31 100644 (file)
@@ -67,7 +67,7 @@ int __archive_write_output(struct archive_write *, const void *, size_t);
 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;