summaryrefslogtreecommitdiff
path: root/libarchive/archive_write_add_filter_bzip2.c
diff options
context:
space:
mode:
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>2012-10-16 09:40:50 +0900
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>2012-10-16 10:00:53 +0900
commit1eb3a54b842446a1b2e65b665020519ef4d2a7ff (patch)
tree5f5f1e845b05ce265e8d9626fe48ea2f6bdb3a25 /libarchive/archive_write_add_filter_bzip2.c
parent510e597e7fff1d112e20e88ecf7b5f2ca890c2e9 (diff)
downloadlibarchive-1eb3a54b842446a1b2e65b665020519ef4d2a7ff.tar.gz
Fix build and test failure without libbz2.
Diffstat (limited to 'libarchive/archive_write_add_filter_bzip2.c')
-rw-r--r--libarchive/archive_write_add_filter_bzip2.c93
1 files changed, 56 insertions, 37 deletions
diff --git a/libarchive/archive_write_add_filter_bzip2.c b/libarchive/archive_write_add_filter_bzip2.c
index e63c574c..88da803a 100644
--- a/libarchive/archive_write_add_filter_bzip2.c
+++ b/libarchive/archive_write_add_filter_bzip2.c
@@ -76,6 +76,49 @@ static int archive_compressor_bzip2_write(struct archive_write_filter *,
const void *, size_t);
/*
+ * Add a bzip2 compression filter to this write handle.
+ */
+int
+archive_write_add_filter_bzip2(struct archive *_a)
+{
+ struct archive_write *a = (struct archive_write *)_a;
+ struct archive_write_filter *f = __archive_write_allocate_filter(_a);
+ struct private_data *data;
+
+ archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC,
+ ARCHIVE_STATE_NEW, "archive_write_add_filter_bzip2");
+
+ data = calloc(1, sizeof(*data));
+ if (data == NULL) {
+ archive_set_error(&a->archive, ENOMEM, "Out of memory");
+ return (ARCHIVE_FATAL);
+ }
+ data->compression_level = 9; /* default */
+
+ f->data = data;
+ f->options = &archive_compressor_bzip2_options;
+ f->close = &archive_compressor_bzip2_close;
+ f->free = &archive_compressor_bzip2_free;
+ f->open = &archive_compressor_bzip2_open;
+ f->code = ARCHIVE_FILTER_BZIP2;
+ f->name = "bzip2";
+#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
+ return (ARCHIVE_OK);
+#else
+ data->pdata = __archive_write_program_allocate();
+ if (data->pdata == NULL) {
+ free(data);
+ archive_set_error(&a->archive, ENOMEM, "Out of memory");
+ return (ARCHIVE_FATAL);
+ }
+ data->compression_level = 0;
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
+ "Using external bzip2 program");
+ return (ARCHIVE_WARN);
+#endif
+}
+
+/*
* Set write options.
*/
static int
@@ -116,36 +159,6 @@ static int drive_compressor(struct archive_write_filter *,
struct private_data *, int finishing);
/*
- * Add a bzip2 compression filter to this write handle.
- */
-int
-archive_write_add_filter_bzip2(struct archive *_a)
-{
- struct archive_write *a = (struct archive_write *)_a;
- struct archive_write_filter *f = __archive_write_allocate_filter(_a);
- struct private_data *data;
-
- archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC,
- ARCHIVE_STATE_NEW, "archive_write_add_filter_bzip2");
-
- data = calloc(1, sizeof(*data));
- if (data == NULL) {
- archive_set_error(&a->archive, ENOMEM, "Out of memory");
- return (ARCHIVE_FATAL);
- }
- data->compression_level = 9; /* default */
-
- f->data = data;
- f->options = &archive_compressor_bzip2_options;
- f->close = &archive_compressor_bzip2_close;
- f->free = &archive_compressor_bzip2_free;
- f->open = &archive_compressor_bzip2_open;
- f->code = ARCHIVE_FILTER_BZIP2;
- f->name = "bzip2";
- return (ARCHIVE_OK);
-}
-
-/*
* Setup callback.
*/
static int
@@ -357,15 +370,11 @@ archive_compressor_bzip2_open(struct archive_write_filter *f)
archive_strcat(&as, " -");
archive_strappend_char(&as, '0' + data->compression_level);
}
- r = __archive_write_program_set_cmd(data->pdata, as.s);
- archive_string_free(&as);
- if (r != ARCHIVE_OK) {
- archive_set_error(f->archive, ENOMEM, "Can't allocate memory");
- return (ARCHIVE_FATAL);
- }
f->write = archive_compressor_bzip2_write;
- return __archive_write_program_open(f, data->pdata);
+ r = __archive_write_program_open(f, data->pdata, as.s);
+ archive_string_free(&as);
+ return (r);
}
static int
@@ -385,4 +394,14 @@ archive_compressor_bzip2_close(struct archive_write_filter *f)
return __archive_write_program_close(f, data->pdata);
}
+static int
+archive_compressor_bzip2_free(struct archive_write_filter *f)
+{
+ struct private_data *data = (struct private_data *)f->data;
+
+ __archive_write_program_free(data->pdata);
+ free(data);
+ return (ARCHIVE_OK);
+}
+
#endif /* HAVE_BZLIB_H && BZ_CONFIG_ERROR */