diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-16 22:46:01 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-16 22:46:01 +0100 |
commit | 425ad9c93b2736a0ebfbba6267bc1ad56c49d156 (patch) | |
tree | a927ce59974a130f40ac93537b5dacaed668e77b | |
parent | dbc6a7a8fd33c79037c7f2894c24f271b714e3bc (diff) | |
download | busybox-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.c | 16 | ||||
-rw-r--r-- | archival/libunarchive/Kbuild | 1 | ||||
-rw-r--r-- | archival/libunarchive/data_extract_to_buffer.c | 17 | ||||
-rw-r--r-- | archival/tar.c | 14 | ||||
-rw-r--r-- | include/unarchive.h | 21 | ||||
-rwxr-xr-x | testsuite/tar.tests | 9 |
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 | ||
1472 | static 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 | |||
1472 | static char *deb_extract_control_file_to_buffer(archive_handle_t *ar_handle, llist_t *myaccept) | 1480 | static 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 | ||
1484 | static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle) | 1492 | static 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 | |||
11 | void 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 |
775 | static const char tar_longopts[] ALIGN1 = | 776 | static 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 | ||
5 | PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN | 5 | PUSH_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 | |||
16 | typedef struct file_header_t { | 7 | typedef 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; | |||
94 | extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC; | 94 | extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC; |
95 | extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC; | 95 | extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC; |
96 | extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC; | 96 | extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC; |
97 | extern void data_extract_to_buffer(archive_handle_t *archive_handle) FAST_FUNC; | ||
98 | 97 | ||
99 | extern void header_skip(const file_header_t *file_header) FAST_FUNC; | 98 | extern void header_skip(const file_header_t *file_header) FAST_FUNC; |
100 | extern void header_list(const file_header_t *file_header) FAST_FUNC; | 99 | extern 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 | ||
11 | testing "tar hardlinks and repeated files" \ | 11 | testing "tar hardlinks and repeated files" "\ |
12 | ">input_hard1 | 12 | rm -rf input_* test.tar 2>/dev/null |
13 | >input_hard1 | ||
13 | ln input_hard1 input_hard2 | 14 | ln input_hard1 input_hard2 |
14 | mkdir input_dir | 15 | mkdir input_dir |
15 | >input_dir/file | 16 | >input_dir/file |
16 | tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input | 17 | tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input |
17 | tar tvf test.tar | sed 's/.*[0-9] input/input/' | 18 | tar tvf test.tar | sed 's/.*[0-9] input/input/' |
18 | tar xf test.tar 2>&1 && echo Ok | 19 | tar xf test.tar 2>&1 && echo Ok |
19 | " \ | 20 | " "\ |
20 | "input | 21 | input |
21 | input_dir/ | 22 | input_dir/ |
22 | input_dir/file | 23 | input_dir/file |
23 | input_hard1 | 24 | input_hard1 |