diff options
-rw-r--r-- | archival/bzip2.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/archival/bzip2.c b/archival/bzip2.c index d6fd929..c3969a9 100644 --- a/archival/bzip2.c +++ b/archival/bzip2.c @@ -83,15 +83,13 @@ /* No point in being shy and having very small buffer here. * bzip2 internal buffers are much bigger anyway, hundreds of kbytes. * If iobuf is several pages long, malloc() may use mmap, - * making iobuf is page aligned and thus (maybe) have one memcpy less + * making iobuf page aligned and thus (maybe) have one memcpy less * if kernel is clever enough. */ enum { IOBUF_SIZE = 8 * 1024 }; -static uint8_t level; - /* NB: compressStream() has to return -1 on errors, not die. * bbunpack() will correctly clean up in this case * (delete incomplete .bz2 file) @@ -143,6 +141,7 @@ static IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_state_t *xstate UNUSED_PARAM) { IF_DESKTOP(long long) int total; + unsigned opt, level; ssize_t count; bz_stream bzs; /* it's small */ #define strm (&bzs) @@ -151,6 +150,16 @@ IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_state_t *xstate U #define wbuf (iobuf + IOBUF_SIZE) iobuf = xmalloc(2 * IOBUF_SIZE); + + opt = option_mask32 >> (sizeof("cfkvq" IF_FEATURE_BZIP2_DECOMPRESS("dt") "zs") - 1); + opt |= 0x100; /* if nothing else, assume -9 */ + level = 0; + for (;;) { + level++; + if (opt & 1) break; + opt >>= 1; + } + BZ2_bzCompressInit(strm, level); while (1) { @@ -197,25 +206,18 @@ int bzip2_main(int argc UNUSED_PARAM, char **argv) opt = getopt32(argv, "^" /* Must match bbunzip's constants OPT_STDOUT, OPT_FORCE! */ - "cfkv" IF_FEATURE_BZIP2_DECOMPRESS("dt") "123456789qzs" + "cfkvq" IF_FEATURE_BZIP2_DECOMPRESS("dt") "zs123456789" "\0" "s2" /* -s means -2 (compatibility) */ ); #if ENABLE_FEATURE_BZIP2_DECOMPRESS /* bunzip2_main may not be visible... */ - if (opt & 0x30) // -d and/or -t + if (opt & (3 << 5)) /* -d and/or -t */ return bunzip2_main(argc, argv); - opt >>= 6; #else - opt >>= 4; + /* clear "decompress" and "test" bits (or bbunpack() can get confused) */ + /* in !BZIP2_DECOMPRESS config, these bits are -zs and are unused */ + option_mask32 = opt & ~(3 << 5); #endif - opt = (uint8_t)opt; /* isolate bits for -1..-8 */ - opt |= 0x100; /* if nothing else, assume -9 */ - level = 1; - while (!(opt & 1)) { - level++; - opt >>= 1; - } argv += optind; - option_mask32 &= 0xf; /* ignore all except -cfkv */ return bbunpack(argv, compressStream, append_ext, "bz2"); } |