summaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
Diffstat (limited to 'archival')
-rw-r--r--archival/bzip2.c32
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");
}