aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-12-16 22:46:01 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-12-16 22:46:01 +0100
commit425ad9c93b2736a0ebfbba6267bc1ad56c49d156 (patch)
treea927ce59974a130f40ac93537b5dacaed668e77b
parentdbc6a7a8fd33c79037c7f2894c24f271b714e3bc (diff)
downloadbusybox-w32-425ad9c93b2736a0ebfbba6267bc1ad56c49d156.tar.gz
busybox-w32-425ad9c93b2736a0ebfbba6267bc1ad56c49d156.tar.bz2
busybox-w32-425ad9c93b2736a0ebfbba6267bc1ad56c49d156.zip
libunarchive: move dpkg-specific things into dpkg.c. 0 byte size differences
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/dpkg.c16
-rw-r--r--archival/libunarchive/Kbuild1
-rw-r--r--archival/libunarchive/data_extract_to_buffer.c17
-rw-r--r--archival/tar.c14
-rw-r--r--include/unarchive.h21
-rwxr-xr-xtestsuite/tar.tests9
6 files changed, 34 insertions, 44 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c
index 451c6fa32..2e24541bf 100644
--- a/archival/dpkg.c
+++ b/archival/dpkg.c
@@ -1469,6 +1469,14 @@ static void init_archive_deb_data(archive_handle_t *ar_handle)
1469 ar_handle->sub_archive = tar_handle; 1469 ar_handle->sub_archive = tar_handle;
1470} 1470}
1471 1471
1472static void FAST_FUNC data_extract_to_buffer(archive_handle_t *archive_handle)
1473{
1474 unsigned size = archive_handle->file_header->size;
1475
1476 archive_handle->ah_buffer = xzalloc(size + 1);
1477 xread(archive_handle->src_fd, archive_handle->ah_buffer, size);
1478}
1479
1472static char *deb_extract_control_file_to_buffer(archive_handle_t *ar_handle, llist_t *myaccept) 1480static char *deb_extract_control_file_to_buffer(archive_handle_t *ar_handle, llist_t *myaccept)
1473{ 1481{
1474 ar_handle->sub_archive->action_data = data_extract_to_buffer; 1482 ar_handle->sub_archive->action_data = data_extract_to_buffer;
@@ -1478,7 +1486,7 @@ static char *deb_extract_control_file_to_buffer(archive_handle_t *ar_handle, lli
1478 unpack_ar_archive(ar_handle); 1486 unpack_ar_archive(ar_handle);
1479 close(ar_handle->src_fd); 1487 close(ar_handle->src_fd);
1480 1488
1481 return ar_handle->sub_archive->buffer; 1489 return ar_handle->sub_archive->ah_buffer;
1482} 1490}
1483 1491
1484static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle) 1492static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle)
@@ -1487,7 +1495,7 @@ static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle)
1487 1495
1488 name_ptr += strspn(name_ptr, "./"); 1496 name_ptr += strspn(name_ptr, "./");
1489 if (name_ptr[0] != '\0') { 1497 if (name_ptr[0] != '\0') {
1490 archive_handle->file_header->name = xasprintf("%s%s", archive_handle->buffer, name_ptr); 1498 archive_handle->file_header->name = xasprintf("%s%s", archive_handle->ah_buffer, name_ptr);
1491 data_extract_all(archive_handle); 1499 data_extract_all(archive_handle);
1492 } 1500 }
1493} 1501}
@@ -1530,7 +1538,7 @@ static void unpack_package(deb_file_t *deb_file)
1530 archive_handle->sub_archive->accept = accept_list; 1538 archive_handle->sub_archive->accept = accept_list;
1531 archive_handle->sub_archive->filter = filter_accept_list; 1539 archive_handle->sub_archive->filter = filter_accept_list;
1532 archive_handle->sub_archive->action_data = data_extract_all_prefix; 1540 archive_handle->sub_archive->action_data = data_extract_all_prefix;
1533 archive_handle->sub_archive->buffer = info_prefix; 1541 archive_handle->sub_archive->ah_buffer = info_prefix;
1534 archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD; 1542 archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
1535 unpack_ar_archive(archive_handle); 1543 unpack_ar_archive(archive_handle);
1536 1544
@@ -1541,7 +1549,7 @@ static void unpack_package(deb_file_t *deb_file)
1541 archive_handle = init_archive_deb_ar(deb_file->filename); 1549 archive_handle = init_archive_deb_ar(deb_file->filename);
1542 init_archive_deb_data(archive_handle); 1550 init_archive_deb_data(archive_handle);
1543 archive_handle->sub_archive->action_data = data_extract_all_prefix; 1551 archive_handle->sub_archive->action_data = data_extract_all_prefix;
1544 archive_handle->sub_archive->buffer = (char*)"/"; /* huh? */ 1552 archive_handle->sub_archive->ah_buffer = (char*)"/"; /* huh? */
1545 archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD; 1553 archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
1546 unpack_ar_archive(archive_handle); 1554 unpack_ar_archive(archive_handle);
1547 1555
diff --git a/archival/libunarchive/Kbuild b/archival/libunarchive/Kbuild
index 4bb81ce26..11d23b25f 100644
--- a/archival/libunarchive/Kbuild
+++ b/archival/libunarchive/Kbuild
@@ -11,7 +11,6 @@ COMMON_FILES:= \
11 data_skip.o \ 11 data_skip.o \
12 data_extract_all.o \ 12 data_extract_all.o \
13 data_extract_to_stdout.o \ 13 data_extract_to_stdout.o \
14 data_extract_to_buffer.o \
15\ 14\
16 filter_accept_all.o \ 15 filter_accept_all.o \
17 filter_accept_list.o \ 16 filter_accept_list.o \
diff --git a/archival/libunarchive/data_extract_to_buffer.c b/archival/libunarchive/data_extract_to_buffer.c
deleted file mode 100644
index 1d74e0335..000000000
--- a/archival/libunarchive/data_extract_to_buffer.c
+++ /dev/null
@@ -1,17 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Copyright 2002 Glenn McGrath
4 *
5 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
6 */
7
8#include "libbb.h"
9#include "unarchive.h"
10
11void FAST_FUNC data_extract_to_buffer(archive_handle_t *archive_handle)
12{
13 unsigned int size = archive_handle->file_header->size;
14
15 archive_handle->buffer = xzalloc(size + 1);
16 xread(archive_handle->src_fd, archive_handle->buffer, size);
17}
diff --git a/archival/tar.c b/archival/tar.c
index d6c44a7b7..7ec101d31 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -729,7 +729,7 @@ static void handle_SIGCHLD(int status)
729 /* wait failed?! I'm confused... */ 729 /* wait failed?! I'm confused... */
730 return; 730 return;
731 731
732 if (WIFEXITED(status) && WEXITSTATUS(status)==0) 732 if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
733 /* child exited with 0 */ 733 /* child exited with 0 */
734 return; 734 return;
735 /* Cannot happen? 735 /* Cannot happen?
@@ -748,15 +748,16 @@ enum {
748 IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) 748 IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,)
749 IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) 749 IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,)
750 IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit 750 IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit
751#if ENABLE_FEATURE_TAR_LONG_OPTIONS
751 OPTBIT_NUMERIC_OWNER, 752 OPTBIT_NUMERIC_OWNER,
752 OPTBIT_NOPRESERVE_OWNER,
753 OPTBIT_NOPRESERVE_PERM, 753 OPTBIT_NOPRESERVE_PERM,
754#endif
754 OPT_TEST = 1 << 0, // t 755 OPT_TEST = 1 << 0, // t
755 OPT_EXTRACT = 1 << 1, // x 756 OPT_EXTRACT = 1 << 1, // x
756 OPT_BASEDIR = 1 << 2, // C 757 OPT_BASEDIR = 1 << 2, // C
757 OPT_TARNAME = 1 << 3, // f 758 OPT_TARNAME = 1 << 3, // f
758 OPT_2STDOUT = 1 << 4, // O 759 OPT_2STDOUT = 1 << 4, // O
759 OPT_NOPRESERVE_OWNER = 1 << 5, // no-same-owner 760 OPT_NOPRESERVE_OWNER = 1 << 5, // o == no-same-owner
760 OPT_P = 1 << 6, // p 761 OPT_P = 1 << 6, // p
761 OPT_VERBOSE = 1 << 7, // v 762 OPT_VERBOSE = 1 << 7, // v
762 OPT_KEEP_OLD = 1 << 8, // k 763 OPT_KEEP_OLD = 1 << 8, // k
@@ -768,8 +769,8 @@ enum {
768 OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X 769 OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X
769 OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z 770 OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z
770 OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z 771 OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
771 OPT_NUMERIC_OWNER = 1 << OPTBIT_NUMERIC_OWNER, 772 OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner
772 OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions 773 OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions
773}; 774};
774#if ENABLE_FEATURE_TAR_LONG_OPTIONS 775#if ENABLE_FEATURE_TAR_LONG_OPTIONS
775static const char tar_longopts[] ALIGN1 = 776static const char tar_longopts[] ALIGN1 =
@@ -810,8 +811,7 @@ static const char tar_longopts[] ALIGN1 =
810 /* do not restore mode */ 811 /* do not restore mode */
811 "no-same-permissions\0" No_argument "\xfe" 812 "no-same-permissions\0" No_argument "\xfe"
812 /* --exclude takes next bit position in option mask, */ 813 /* --exclude takes next bit position in option mask, */
813 /* therefore we have to either put it _after_ --no-same-perm */ 814 /* therefore we have to put it _after_ --no-same-permissions */
814 /* or add OPT[BIT]_EXCLUDE before OPT[BIT]_NOPRESERVE_OWNER */
815# if ENABLE_FEATURE_TAR_FROM 815# if ENABLE_FEATURE_TAR_FROM
816 "exclude\0" Required_argument "\xff" 816 "exclude\0" Required_argument "\xff"
817# endif 817# endif
diff --git a/include/unarchive.h b/include/unarchive.h
index 26d79e1e9..35ce52181 100644
--- a/include/unarchive.h
+++ b/include/unarchive.h
@@ -4,15 +4,6 @@
4 4
5PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN 5PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
6 6
7#define ARCHIVE_RESTORE_DATE (1 << 0)
8#define ARCHIVE_CREATE_LEADING_DIRS (1 << 1)
9#define ARCHIVE_UNLINK_OLD (1 << 2)
10#define ARCHIVE_EXTRACT_QUIET (1 << 3)
11#define ARCHIVE_EXTRACT_NEWER (1 << 4)
12#define ARCHIVE_DONT_RESTORE_OWNER (1 << 5)
13#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
14#define ARCHIVE_NUMERIC_OWNER (1 << 7)
15
16typedef struct file_header_t { 7typedef struct file_header_t {
17 char *name; 8 char *name;
18 char *link_target; 9 char *link_target;
@@ -64,7 +55,7 @@ typedef struct archive_handle_t {
64 void FAST_FUNC (*seek)(int fd, off_t amount); 55 void FAST_FUNC (*seek)(int fd, off_t amount);
65 56
66 /* Temporary storage */ 57 /* Temporary storage */
67 char *buffer; 58 char *ah_buffer;
68 59
69 /* Flags and misc. stuff */ 60 /* Flags and misc. stuff */
70 unsigned char ah_flags; 61 unsigned char ah_flags;
@@ -74,6 +65,15 @@ typedef struct archive_handle_t {
74 void *ah_priv[8]; 65 void *ah_priv[8];
75 66
76} archive_handle_t; 67} archive_handle_t;
68/* bits in ah_flags */
69#define ARCHIVE_RESTORE_DATE (1 << 0)
70#define ARCHIVE_CREATE_LEADING_DIRS (1 << 1)
71#define ARCHIVE_UNLINK_OLD (1 << 2)
72#define ARCHIVE_EXTRACT_QUIET (1 << 3)
73#define ARCHIVE_EXTRACT_NEWER (1 << 4)
74#define ARCHIVE_DONT_RESTORE_OWNER (1 << 5)
75#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
76#define ARCHIVE_NUMERIC_OWNER (1 << 7)
77 77
78 78
79/* Info struct unpackers can fill out to inform users of thing like 79/* Info struct unpackers can fill out to inform users of thing like
@@ -94,7 +94,6 @@ extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
94extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC; 94extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
95extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC; 95extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
96extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC; 96extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
97extern void data_extract_to_buffer(archive_handle_t *archive_handle) FAST_FUNC;
98 97
99extern void header_skip(const file_header_t *file_header) FAST_FUNC; 98extern void header_skip(const file_header_t *file_header) FAST_FUNC;
100extern void header_list(const file_header_t *file_header) FAST_FUNC; 99extern void header_list(const file_header_t *file_header) FAST_FUNC;
diff --git a/testsuite/tar.tests b/testsuite/tar.tests
index 0d4fa4584..35f96b77e 100755
--- a/testsuite/tar.tests
+++ b/testsuite/tar.tests
@@ -8,16 +8,17 @@ mkdir tempdir && cd tempdir || exit 1
8 8
9# testing "test name" "script" "expected result" "file input" "stdin" 9# testing "test name" "script" "expected result" "file input" "stdin"
10 10
11testing "tar hardlinks and repeated files" \ 11testing "tar hardlinks and repeated files" "\
12">input_hard1 12rm -rf input_* test.tar 2>/dev/null
13>input_hard1
13ln input_hard1 input_hard2 14ln input_hard1 input_hard2
14mkdir input_dir 15mkdir input_dir
15>input_dir/file 16>input_dir/file
16tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input 17tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input
17tar tvf test.tar | sed 's/.*[0-9] input/input/' 18tar tvf test.tar | sed 's/.*[0-9] input/input/'
18tar xf test.tar 2>&1 && echo Ok 19tar xf test.tar 2>&1 && echo Ok
19" \ 20" "\
20"input 21input
21input_dir/ 22input_dir/
22input_dir/file 23input_dir/file
23input_hard1 24input_hard1