diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-05 13:10:34 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-05 13:10:34 +0000 |
| commit | e9ad84dfd4c7eb2936374f02989dacf7026a7276 (patch) | |
| tree | 37412d21c0a2ccec7c162e0fb42833058f5934e3 /libbb | |
| parent | 9b44613202a6f2f080ec23746d0680dcef88628d (diff) | |
| download | busybox-w32-e9ad84dfd4c7eb2936374f02989dacf7026a7276.tar.gz busybox-w32-e9ad84dfd4c7eb2936374f02989dacf7026a7276.tar.bz2 busybox-w32-e9ad84dfd4c7eb2936374f02989dacf7026a7276.zip | |
*: refactor handling of archived files. "tar f file.tar.lzma" now works too.
function old new delta
unpack_Z_stream - 1229 +1229
open_zipped - 176 +176
unpack_bz2_stream_prime - 60 +60
tar_main 642 677 +35
find_main 406 418 +12
sv_main 1222 1233 +11
decode_format_string 829 837 +8
cmp_main 641 649 +8
popstring 134 140 +6
filter_accept_list_reassign 120 125 +5
parse_and_put_prompt 800 804 +4
passwd_main 1053 1049 -4
make_new_name_gunzip 119 114 -5
rpm_main 1688 1670 -18
prepare 302 283 -19
xmalloc_open_zipped_read_close 135 61 -74
uncompress 1229 - -1229
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 8/5 up/down: 1554/-1349) Total: 205 bytes
Diffstat (limited to 'libbb')
| -rw-r--r-- | libbb/appletlib.c | 3 | ||||
| -rw-r--r-- | libbb/read.c | 89 |
2 files changed, 78 insertions, 14 deletions
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index beb1d6fcb..2bab0eba6 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
| @@ -73,7 +73,8 @@ static const char *unpack_usage_messages(void) | |||
| 73 | 73 | ||
| 74 | i = start_bunzip(&bd, | 74 | i = start_bunzip(&bd, |
| 75 | /* src_fd: */ -1, | 75 | /* src_fd: */ -1, |
| 76 | /* inbuf: */ (void *)packed_usage, | 76 | //FIXME: can avoid storing these 2 bytes! |
| 77 | /* inbuf: */ (void *)packed_usage + 2, | ||
| 77 | /* len: */ sizeof(packed_usage)); | 78 | /* len: */ sizeof(packed_usage)); |
| 78 | /* read_bunzip can longjmp to start_bunzip, and ultimately | 79 | /* read_bunzip can longjmp to start_bunzip, and ultimately |
| 79 | * end up here with i != 0 on read data errors! Not trivial */ | 80 | * end up here with i != 0 on read data errors! Not trivial */ |
diff --git a/libbb/read.c b/libbb/read.c index 18f62838e..9f6bfcd1b 100644 --- a/libbb/read.c +++ b/libbb/read.c | |||
| @@ -8,7 +8,14 @@ | |||
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include "libbb.h" | 10 | #include "libbb.h" |
| 11 | #if ENABLE_FEATURE_MODPROBE_SMALL_ZIPPED | 11 | |
| 12 | #define ZIPPED (ENABLE_FEATURE_SEAMLESS_LZMA \ | ||
| 13 | || ENABLE_FEATURE_SEAMLESS_BZ2 \ | ||
| 14 | || ENABLE_FEATURE_SEAMLESS_GZ \ | ||
| 15 | /* || ENABLE_FEATURE_SEAMLESS_Z */ \ | ||
| 16 | ) | ||
| 17 | |||
| 18 | #if ZIPPED | ||
| 12 | #include "unarchive.h" | 19 | #include "unarchive.h" |
| 13 | #endif | 20 | #endif |
| 14 | 21 | ||
| @@ -299,24 +306,81 @@ void* FAST_FUNC xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p) | |||
| 299 | return buf; | 306 | return buf; |
| 300 | } | 307 | } |
| 301 | 308 | ||
| 302 | #if ENABLE_FEATURE_MODPROBE_SMALL_ZIPPED | 309 | int FAST_FUNC open_zipped(const char *fname) |
| 310 | { | ||
| 311 | #if !ZIPPED | ||
| 312 | return open(fname, O_RDONLY); | ||
| 313 | #else | ||
| 314 | unsigned char magic[2]; | ||
| 315 | char *sfx; | ||
| 316 | int fd; | ||
| 317 | #if BB_MMU | ||
| 318 | USE_DESKTOP(long long) int FAST_FUNC (*xformer)(int src_fd, int dst_fd); | ||
| 319 | enum { xformer_prog = 0 }; | ||
| 320 | #else | ||
| 321 | enum { xformer = 0 }; | ||
| 322 | const char *xformer_prog; | ||
| 323 | #endif | ||
| 324 | |||
| 325 | fd = open(fname, O_RDONLY); | ||
| 326 | if (fd < 0) | ||
| 327 | return fd; | ||
| 328 | |||
| 329 | sfx = strrchr(fname, '.'); | ||
| 330 | if (sfx) { | ||
| 331 | if (ENABLE_FEATURE_SEAMLESS_LZMA && strcmp(sfx, ".lzma") == 0) | ||
| 332 | /* .lzma has no header/signature, just trust it */ | ||
| 333 | open_transformer(fd, unpack_lzma_stream, "unlzma"); | ||
| 334 | else | ||
| 335 | if ((ENABLE_FEATURE_SEAMLESS_GZ && strcmp(sfx, ".gz") == 0) | ||
| 336 | || (ENABLE_FEATURE_SEAMLESS_BZ2 && strcmp(sfx, ".bz2") == 0) | ||
| 337 | ) { | ||
| 338 | /* .gz and .bz2 both have 2-byte signature, and their | ||
| 339 | * unpack_XXX_stream want this header skipped. */ | ||
| 340 | xread(fd, &magic, 2); | ||
| 341 | #if BB_MMU | ||
| 342 | xformer = unpack_gz_stream; | ||
| 343 | #else | ||
| 344 | xformer_prog = "gunzip"; | ||
| 345 | #endif | ||
| 346 | if (magic[0] != 0x1f || magic[1] != 0x8b) { | ||
| 347 | if (!ENABLE_FEATURE_SEAMLESS_BZ2 | ||
| 348 | || magic[0] != 'B' || magic[1] != 'Z' | ||
| 349 | ) { | ||
| 350 | bb_error_msg_and_die("no gzip" | ||
| 351 | USE_FEATURE_SEAMLESS_BZ2("/bzip2") | ||
| 352 | " magic"); | ||
| 353 | } | ||
| 354 | #if BB_MMU | ||
| 355 | xformer = unpack_bz2_stream; | ||
| 356 | #else | ||
| 357 | xformer_prog = "bunzip2"; | ||
| 358 | #endif | ||
| 359 | } else { | ||
| 360 | #if !BB_MMU | ||
| 361 | /* NOMMU version of open_transformer execs | ||
| 362 | * an external unzipper that wants | ||
| 363 | * file position at the start of the file */ | ||
| 364 | xlseek(fd, 0, SEEK_SET); | ||
| 365 | #endif | ||
| 366 | } | ||
| 367 | open_transformer(fd, xformer, xformer_prog); | ||
| 368 | } | ||
| 369 | } | ||
| 370 | |||
| 371 | return fd; | ||
| 372 | #endif | ||
| 373 | } | ||
| 374 | |||
| 303 | void* FAST_FUNC xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) | 375 | void* FAST_FUNC xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) |
| 304 | { | 376 | { |
| 377 | int fd; | ||
| 305 | char *image; | 378 | char *image; |
| 306 | char *suffix; | ||
| 307 | 379 | ||
| 308 | int fd = open(fname, O_RDONLY); | 380 | fd = open_zipped(fname); |
| 309 | if (fd < 0) | 381 | if (fd < 0) |
| 310 | return NULL; | 382 | return NULL; |
| 311 | 383 | ||
| 312 | suffix = strrchr(fname, '.'); | ||
| 313 | if (suffix) { | ||
| 314 | if (strcmp(suffix, ".gz") == 0) | ||
| 315 | open_transformer(fd, unpack_gz_stream, "gunzip"); | ||
| 316 | else if (strcmp(suffix, ".bz2") == 0) | ||
| 317 | open_transformer(fd, unpack_bz2_stream, "bunzip2"); | ||
| 318 | } | ||
| 319 | |||
| 320 | image = xmalloc_read(fd, maxsz_p); | 384 | image = xmalloc_read(fd, maxsz_p); |
| 321 | if (!image) | 385 | if (!image) |
| 322 | bb_perror_msg("read error from '%s'", fname); | 386 | bb_perror_msg("read error from '%s'", fname); |
| @@ -324,4 +388,3 @@ void* FAST_FUNC xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_ | |||
| 324 | 388 | ||
| 325 | return image; | 389 | return image; |
| 326 | } | 390 | } |
| 327 | #endif | ||
