aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-05-06 14:19:19 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2010-05-06 14:19:19 +0000
commit27653adc8b7ebe44bd357511de53d0c14eef0894 (patch)
treed1c9b0facbcca408a18d75f93aa507e96927ef31 /libbb
parentb8ba6b66f5d730efcf13dbbb3f9362dd6840d93b (diff)
downloadbusybox-w32-27653adc8b7ebe44bd357511de53d0c14eef0894.tar.gz
busybox-w32-27653adc8b7ebe44bd357511de53d0c14eef0894.tar.bz2
busybox-w32-27653adc8b7ebe44bd357511de53d0c14eef0894.zip
rpm: code shrink. Now uses open_zipped's logic (factored out into setup_unzip_on_fd())
function old new delta setup_unzip_on_fd - 80 +80 open_zipped 176 113 -63 rpm_main 1672 1355 -317 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 0/2 up/down: 80/-380) Total: -300 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/read.c97
1 files changed, 55 insertions, 42 deletions
diff --git a/libbb/read.c b/libbb/read.c
index 06ce29718..503216eb5 100644
--- a/libbb/read.c
+++ b/libbb/read.c
@@ -6,7 +6,6 @@
6 * 6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */ 8 */
9
10#include "libbb.h" 9#include "libbb.h"
11 10
12#define ZIPPED (ENABLE_FEATURE_SEAMLESS_LZMA \ 11#define ZIPPED (ENABLE_FEATURE_SEAMLESS_LZMA \
@@ -16,7 +15,7 @@
16) 15)
17 16
18#if ZIPPED 17#if ZIPPED
19#include "unarchive.h" 18# include "unarchive.h"
20#endif 19#endif
21 20
22ssize_t FAST_FUNC safe_read(int fd, void *buf, size_t count) 21ssize_t FAST_FUNC safe_read(int fd, void *buf, size_t count)
@@ -306,14 +305,11 @@ void* FAST_FUNC xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p)
306 return buf; 305 return buf;
307} 306}
308 307
309int FAST_FUNC open_zipped(const char *fname) 308#if ZIPPED
309int FAST_FUNC setup_unzip_on_fd(int fd /*, int fail_if_not_detected*/)
310{ 310{
311#if !ZIPPED 311 const int fail_if_not_detected = 1;
312 return open(fname, O_RDONLY);
313#else
314 unsigned char magic[2]; 312 unsigned char magic[2];
315 char *sfx;
316 int fd;
317#if BB_MMU 313#if BB_MMU
318 IF_DESKTOP(long long) int FAST_FUNC (*xformer)(int src_fd, int dst_fd); 314 IF_DESKTOP(long long) int FAST_FUNC (*xformer)(int src_fd, int dst_fd);
319 enum { xformer_prog = 0 }; 315 enum { xformer_prog = 0 };
@@ -322,6 +318,56 @@ int FAST_FUNC open_zipped(const char *fname)
322 const char *xformer_prog; 318 const char *xformer_prog;
323#endif 319#endif
324 320
321 /* .gz and .bz2 both have 2-byte signature, and their
322 * unpack_XXX_stream wants this header skipped. */
323 xread(fd, &magic, 2);
324#if ENABLE_FEATURE_SEAMLESS_GZ
325# if BB_MMU
326 xformer = unpack_gz_stream;
327# else
328 xformer_prog = "gunzip";
329# endif
330#endif
331 if (!ENABLE_FEATURE_SEAMLESS_GZ
332 || magic[0] != 0x1f || magic[1] != 0x8b
333 ) {
334 if (!ENABLE_FEATURE_SEAMLESS_BZ2
335 || magic[0] != 'B' || magic[1] != 'Z'
336 ) {
337 if (fail_if_not_detected)
338 bb_error_msg_and_die("no gzip"
339 IF_FEATURE_SEAMLESS_BZ2("/bzip2")
340 " magic");
341 xlseek(fd, -2, SEEK_CUR);
342 return fd;
343 }
344#if BB_MMU
345 xformer = unpack_bz2_stream;
346#else
347 xformer_prog = "bunzip2";
348#endif
349 } else {
350#if !BB_MMU
351 /* NOMMU version of open_transformer execs
352 * an external unzipper that wants
353 * file position at the start of the file */
354 xlseek(fd, -2, SEEK_CUR);
355#endif
356 }
357 open_transformer(fd, xformer, xformer_prog);
358
359 return fd;
360}
361#endif /* ZIPPED */
362
363int FAST_FUNC open_zipped(const char *fname)
364{
365#if !ZIPPED
366 return open(fname, O_RDONLY);
367#else
368 char *sfx;
369 int fd;
370
325 fd = open(fname, O_RDONLY); 371 fd = open(fname, O_RDONLY);
326 if (fd < 0) 372 if (fd < 0)
327 return fd; 373 return fd;
@@ -335,40 +381,7 @@ int FAST_FUNC open_zipped(const char *fname)
335 if ((ENABLE_FEATURE_SEAMLESS_GZ && strcmp(sfx, ".gz") == 0) 381 if ((ENABLE_FEATURE_SEAMLESS_GZ && strcmp(sfx, ".gz") == 0)
336 || (ENABLE_FEATURE_SEAMLESS_BZ2 && strcmp(sfx, ".bz2") == 0) 382 || (ENABLE_FEATURE_SEAMLESS_BZ2 && strcmp(sfx, ".bz2") == 0)
337 ) { 383 ) {
338 /* .gz and .bz2 both have 2-byte signature, and their 384 setup_unzip_on_fd(fd /*, fail_if_not_detected: 1*/);
339 * unpack_XXX_stream wants this header skipped. */
340 xread(fd, &magic, 2);
341#if ENABLE_FEATURE_SEAMLESS_GZ
342#if BB_MMU
343 xformer = unpack_gz_stream;
344#else
345 xformer_prog = "gunzip";
346#endif
347#endif
348 if (!ENABLE_FEATURE_SEAMLESS_GZ
349 || magic[0] != 0x1f || magic[1] != 0x8b
350 ) {
351 if (!ENABLE_FEATURE_SEAMLESS_BZ2
352 || magic[0] != 'B' || magic[1] != 'Z'
353 ) {
354 bb_error_msg_and_die("no gzip"
355 IF_FEATURE_SEAMLESS_BZ2("/bzip2")
356 " magic");
357 }
358#if BB_MMU
359 xformer = unpack_bz2_stream;
360#else
361 xformer_prog = "bunzip2";
362#endif
363 } else {
364#if !BB_MMU
365 /* NOMMU version of open_transformer execs
366 * an external unzipper that wants
367 * file position at the start of the file */
368 xlseek(fd, 0, SEEK_SET);
369#endif
370 }
371 open_transformer(fd, xformer, xformer_prog);
372 } 385 }
373 } 386 }
374 387