diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-01 05:12:28 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-01 05:12:28 +0200 |
commit | 45f66167fe96de219aac91d842f3e64d857340f6 (patch) | |
tree | c141f2aa8213089258125b370a7427bf14937aaf | |
parent | 620e863ba24fe9e0126d1540e89a531264021a77 (diff) | |
download | busybox-w32-45f66167fe96de219aac91d842f3e64d857340f6.tar.gz busybox-w32-45f66167fe96de219aac91d842f3e64d857340f6.tar.bz2 busybox-w32-45f66167fe96de219aac91d842f3e64d857340f6.zip |
xz compression detection: avoid the need to seek
function old new delta
unpack_unxz 12 67 +55
unpack_xz_stream 2357 2373 +16
xmalloc_read 197 199 +2
setup_unzip_on_fd 118 99 -19
rpm2cpio_main 222 203 -19
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/2 up/down: 73/-38) Total: 35 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/bbunzip.c | 9 | ||||
-rw-r--r-- | archival/libunarchive/decompress_unxz.c | 4 | ||||
-rw-r--r-- | archival/rpm2cpio.c | 4 | ||||
-rw-r--r-- | include/unarchive.h | 23 | ||||
-rw-r--r-- | libbb/read_printf.c | 4 |
5 files changed, 30 insertions, 14 deletions
diff --git a/archival/bbunzip.c b/archival/bbunzip.c index b243afb2e..832a7bbf3 100644 --- a/archival/bbunzip.c +++ b/archival/bbunzip.c | |||
@@ -373,6 +373,15 @@ int unlzma_main(int argc UNUSED_PARAM, char **argv) | |||
373 | static | 373 | static |
374 | IF_DESKTOP(long long) int FAST_FUNC unpack_unxz(unpack_info_t *info UNUSED_PARAM) | 374 | IF_DESKTOP(long long) int FAST_FUNC unpack_unxz(unpack_info_t *info UNUSED_PARAM) |
375 | { | 375 | { |
376 | struct { | ||
377 | uint32_t v1; | ||
378 | uint16_t v2; | ||
379 | } magic; | ||
380 | xread(STDIN_FILENO, &magic, 6); | ||
381 | if (magic.v1 != XZ_MAGIC1a || magic.v2 != XZ_MAGIC2a) { | ||
382 | bb_error_msg("invalid magic"); | ||
383 | return -1; | ||
384 | } | ||
376 | return unpack_xz_stream(STDIN_FILENO, STDOUT_FILENO); | 385 | return unpack_xz_stream(STDIN_FILENO, STDOUT_FILENO); |
377 | } | 386 | } |
378 | int unxz_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 387 | int unxz_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
diff --git a/archival/libunarchive/decompress_unxz.c b/archival/libunarchive/decompress_unxz.c index 5d7513a2e..721acd907 100644 --- a/archival/libunarchive/decompress_unxz.c +++ b/archival/libunarchive/decompress_unxz.c | |||
@@ -56,9 +56,11 @@ unpack_xz_stream(int src_fd, int dst_fd) | |||
56 | if (!crc32_table) | 56 | if (!crc32_table) |
57 | crc32_table = crc32_filltable(NULL, /*endian:*/ 0); | 57 | crc32_table = crc32_filltable(NULL, /*endian:*/ 0); |
58 | 58 | ||
59 | membuf = xmalloc(2 * BUFSIZ); | ||
60 | memset(&iobuf, 0, sizeof(iobuf)); | 59 | memset(&iobuf, 0, sizeof(iobuf)); |
60 | /* Preload XZ file signature */ | ||
61 | membuf = (void*) strcpy(xmalloc(2 * BUFSIZ), HEADER_MAGIC); | ||
61 | iobuf.in = membuf; | 62 | iobuf.in = membuf; |
63 | iobuf.in_size = HEADER_MAGIC_SIZE; | ||
62 | iobuf.out = membuf + BUFSIZ; | 64 | iobuf.out = membuf + BUFSIZ; |
63 | iobuf.out_size = BUFSIZ; | 65 | iobuf.out_size = BUFSIZ; |
64 | 66 | ||
diff --git a/archival/rpm2cpio.c b/archival/rpm2cpio.c index 1f67fa887..b23d5afa9 100644 --- a/archival/rpm2cpio.c +++ b/archival/rpm2cpio.c | |||
@@ -92,8 +92,8 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv) | |||
92 | xread(rpm_fd, magic.b32, sizeof(magic.b32[0])); | 92 | xread(rpm_fd, magic.b32, sizeof(magic.b32[0])); |
93 | if (magic.b32[0] != XZ_MAGIC2) | 93 | if (magic.b32[0] != XZ_MAGIC2) |
94 | goto no_magic; | 94 | goto no_magic; |
95 | /* unpack_xz_stream wants fd at position 0 */ | 95 | /* unpack_xz_stream wants fd at position 6, no need to seek */ |
96 | xlseek(rpm_fd, -6, SEEK_CUR); | 96 | //xlseek(rpm_fd, -6, SEEK_CUR); |
97 | unpack = unpack_xz_stream; | 97 | unpack = unpack_xz_stream; |
98 | } else { | 98 | } else { |
99 | no_magic: | 99 | no_magic: |
diff --git a/include/unarchive.h b/include/unarchive.h index b4cf16082..3b8e1575a 100644 --- a/include/unarchive.h +++ b/include/unarchive.h | |||
@@ -7,16 +7,21 @@ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN | |||
7 | enum { | 7 | enum { |
8 | #if BB_BIG_ENDIAN | 8 | #if BB_BIG_ENDIAN |
9 | COMPRESS_MAGIC = 0x1f9d, | 9 | COMPRESS_MAGIC = 0x1f9d, |
10 | GZIP_MAGIC = 0x1f8b, | 10 | GZIP_MAGIC = 0x1f8b, |
11 | BZIP2_MAGIC = ('B'<<8) + 'Z', | 11 | BZIP2_MAGIC = 'B' * 256 + 'Z', |
12 | XZ_MAGIC1 = (0xfd<<8) + '7', | 12 | XZ_MAGIC1 = 0xfd * 256 + '7', |
13 | XZ_MAGIC2 = ((((('z'<<8) + 'X')<<8) + 'Z')<<8) + 0, | 13 | XZ_MAGIC2 = (('z' * 256 + 'X') * 256 + 'Z') * 256 + 0, |
14 | /* Different form: 32 bits, then 16 bits: */ | ||
15 | XZ_MAGIC1a = ((0xfd * 256 + '7') * 256 + 'z') * 256 + 'X', | ||
16 | XZ_MAGIC2a = 'Z' * 256 + 0, | ||
14 | #else | 17 | #else |
15 | COMPRESS_MAGIC = 0x9d1f, | 18 | COMPRESS_MAGIC = 0x9d1f, |
16 | GZIP_MAGIC = 0x8b1f, | 19 | GZIP_MAGIC = 0x8b1f, |
17 | BZIP2_MAGIC = ('Z'<<8) + 'B', | 20 | BZIP2_MAGIC = 'Z' * 256 + 'B', |
18 | XZ_MAGIC1 = ('7'<<8) + 0xfd, | 21 | XZ_MAGIC1 = '7' * 256 + 0xfd, |
19 | XZ_MAGIC2 = (((((0<<8) + 'Z')<<8) + 'X')<<8) + 'z', | 22 | XZ_MAGIC2 = ((0 * 256 + 'Z') * 256 + 'X') * 256 + 'z', |
23 | XZ_MAGIC1a = (('X' * 256 + 'z') * 256 + '7') * 256 + 0xfd, | ||
24 | XZ_MAGIC2a = 0 * 256 + 'Z', | ||
20 | #endif | 25 | #endif |
21 | }; | 26 | }; |
22 | 27 | ||
@@ -196,7 +201,7 @@ typedef struct inflate_unzip_result { | |||
196 | } inflate_unzip_result; | 201 | } inflate_unzip_result; |
197 | 202 | ||
198 | IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC; | 203 | IF_DESKTOP(long long) int inflate_unzip(inflate_unzip_result *res, off_t compr_size, int src_fd, int dst_fd) FAST_FUNC; |
199 | /* xz unpacker takes .xz stream from offset 0 */ | 204 | /* xz unpacker takes .xz stream from offset 6 */ |
200 | IF_DESKTOP(long long) int unpack_xz_stream(int src_fd, int dst_fd) FAST_FUNC; | 205 | IF_DESKTOP(long long) int unpack_xz_stream(int src_fd, int dst_fd) FAST_FUNC; |
201 | /* lzma unpacker takes .lzma stream from offset 0 */ | 206 | /* lzma unpacker takes .lzma stream from offset 0 */ |
202 | IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC; | 207 | IF_DESKTOP(long long) int unpack_lzma_stream(int src_fd, int dst_fd) FAST_FUNC; |
diff --git a/libbb/read_printf.c b/libbb/read_printf.c index 3aee075c6..6780b94ef 100644 --- a/libbb/read_printf.c +++ b/libbb/read_printf.c | |||
@@ -296,8 +296,8 @@ void FAST_FUNC setup_unzip_on_fd(int fd /*, int fail_if_not_detected*/) | |||
296 | if (magic.b32[0] == XZ_MAGIC2) { | 296 | if (magic.b32[0] == XZ_MAGIC2) { |
297 | # if BB_MMU | 297 | # if BB_MMU |
298 | xformer = unpack_xz_stream; | 298 | xformer = unpack_xz_stream; |
299 | /* unpack_xz_stream wants fd at position 0 */ | 299 | /* unpack_xz_stream wants fd at position 6, no need to seek */ |
300 | xlseek(fd, offset, SEEK_CUR); | 300 | //xlseek(fd, offset, SEEK_CUR); |
301 | # else | 301 | # else |
302 | xformer_prog = "unxz"; | 302 | xformer_prog = "unxz"; |
303 | # endif | 303 | # endif |