diff options
author | Ron Yorston <rmy@pobox.com> | 2012-09-07 11:48:25 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2012-09-07 11:48:25 +0100 |
commit | fecf687cc358883de2da21de33346f0df204c80b (patch) | |
tree | d22c606157926fb659374ae68d55e3a874bacf25 /archival/tar.c | |
parent | b25a7c28a0f684087fa6ccbbc7e265a9cac0f0fa (diff) | |
parent | 6d463de46b418e6c4c8d1397033608f78b33ab21 (diff) | |
download | busybox-w32-fecf687cc358883de2da21de33346f0df204c80b.tar.gz busybox-w32-fecf687cc358883de2da21de33346f0df204c80b.tar.bz2 busybox-w32-fecf687cc358883de2da21de33346f0df204c80b.zip |
Merge branch 'busybox' into merge
Conflicts:
include/libbb.h
shell/ash.c
Diffstat (limited to 'archival/tar.c')
-rw-r--r-- | archival/tar.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/archival/tar.c b/archival/tar.c index 9fa5a0f44..e27950b6c 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
@@ -60,8 +60,8 @@ | |||
60 | 60 | ||
61 | #if !ENABLE_FEATURE_SEAMLESS_GZ && !ENABLE_FEATURE_SEAMLESS_BZ2 | 61 | #if !ENABLE_FEATURE_SEAMLESS_GZ && !ENABLE_FEATURE_SEAMLESS_BZ2 |
62 | /* Do not pass gzip flag to writeTarFile() */ | 62 | /* Do not pass gzip flag to writeTarFile() */ |
63 | #define writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude, gzip) \ | 63 | #define writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude, gzip) \ |
64 | writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude) | 64 | writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude) |
65 | #endif | 65 | #endif |
66 | 66 | ||
67 | 67 | ||
@@ -600,7 +600,7 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip) | |||
600 | 600 | ||
601 | /* gcc 4.2.1 inlines it, making code bigger */ | 601 | /* gcc 4.2.1 inlines it, making code bigger */ |
602 | static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, | 602 | static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, |
603 | int dereferenceFlag, const llist_t *include, | 603 | int recurseFlags, const llist_t *include, |
604 | const llist_t *exclude, int gzip) | 604 | const llist_t *exclude, int gzip) |
605 | { | 605 | { |
606 | int errorFlag = FALSE; | 606 | int errorFlag = FALSE; |
@@ -623,8 +623,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, | |||
623 | 623 | ||
624 | /* Read the directory/files and iterate over them one at a time */ | 624 | /* Read the directory/files and iterate over them one at a time */ |
625 | while (include) { | 625 | while (include) { |
626 | if (!recursive_action(include->data, ACTION_RECURSE | | 626 | if (!recursive_action(include->data, recurseFlags, |
627 | (dereferenceFlag ? ACTION_FOLLOWLINKS : 0), | ||
628 | writeFileToTarball, writeFileToTarball, &tbInfo, 0) | 627 | writeFileToTarball, writeFileToTarball, &tbInfo, 0) |
629 | ) { | 628 | ) { |
630 | errorFlag = TRUE; | 629 | errorFlag = TRUE; |
@@ -664,7 +663,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, | |||
664 | } | 663 | } |
665 | #else | 664 | #else |
666 | int writeTarFile(int tar_fd, int verboseFlag, | 665 | int writeTarFile(int tar_fd, int verboseFlag, |
667 | int dereferenceFlag, const llist_t *include, | 666 | int recurseFlags, const llist_t *include, |
668 | const llist_t *exclude, int gzip); | 667 | const llist_t *exclude, int gzip); |
669 | #endif /* FEATURE_TAR_CREATE */ | 668 | #endif /* FEATURE_TAR_CREATE */ |
670 | 669 | ||
@@ -696,6 +695,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
696 | //usage: "-[" IF_FEATURE_TAR_CREATE("c") "xt" | 695 | //usage: "-[" IF_FEATURE_TAR_CREATE("c") "xt" |
697 | //usage: IF_FEATURE_SEAMLESS_Z("Z") | 696 | //usage: IF_FEATURE_SEAMLESS_Z("Z") |
698 | //usage: IF_FEATURE_SEAMLESS_GZ("z") | 697 | //usage: IF_FEATURE_SEAMLESS_GZ("z") |
698 | //usage: IF_FEATURE_SEAMLESS_XZ("J") | ||
699 | //usage: IF_FEATURE_SEAMLESS_BZ2("j") | 699 | //usage: IF_FEATURE_SEAMLESS_BZ2("j") |
700 | //usage: IF_FEATURE_SEAMLESS_LZMA("a") | 700 | //usage: IF_FEATURE_SEAMLESS_LZMA("a") |
701 | //usage: IF_FEATURE_TAR_CREATE("h") | 701 | //usage: IF_FEATURE_TAR_CREATE("h") |
@@ -722,6 +722,9 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
722 | //usage: IF_FEATURE_SEAMLESS_GZ( | 722 | //usage: IF_FEATURE_SEAMLESS_GZ( |
723 | //usage: "\n z (De)compress using gzip" | 723 | //usage: "\n z (De)compress using gzip" |
724 | //usage: ) | 724 | //usage: ) |
725 | //usage: IF_FEATURE_SEAMLESS_XZ( | ||
726 | //usage: "\n J (De)compress using xz" | ||
727 | //usage: ) | ||
725 | //usage: IF_FEATURE_SEAMLESS_BZ2( | 728 | //usage: IF_FEATURE_SEAMLESS_BZ2( |
726 | //usage: "\n j (De)compress using bzip2" | 729 | //usage: "\n j (De)compress using bzip2" |
727 | //usage: ) | 730 | //usage: ) |
@@ -751,6 +754,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
751 | // o no-same-owner | 754 | // o no-same-owner |
752 | // p same-permissions | 755 | // p same-permissions |
753 | // k keep-old | 756 | // k keep-old |
757 | // no-recursion | ||
754 | // numeric-owner | 758 | // numeric-owner |
755 | // no-same-permissions | 759 | // no-same-permissions |
756 | // overwrite | 760 | // overwrite |
@@ -767,9 +771,11 @@ enum { | |||
767 | IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) | 771 | IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) |
768 | IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) | 772 | IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) |
769 | IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) | 773 | IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) |
770 | IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit | 774 | IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,) // 16th bit |
775 | IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) | ||
771 | IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) | 776 | IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) |
772 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS | 777 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS |
778 | OPTBIT_NORECURSION, | ||
773 | IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) | 779 | IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) |
774 | OPTBIT_NUMERIC_OWNER, | 780 | OPTBIT_NUMERIC_OWNER, |
775 | OPTBIT_NOPRESERVE_PERM, | 781 | OPTBIT_NOPRESERVE_PERM, |
@@ -791,14 +797,16 @@ enum { | |||
791 | OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T | 797 | OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T |
792 | OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X | 798 | OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X |
793 | OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z | 799 | OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z |
800 | OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J | ||
794 | OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z | 801 | OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z |
795 | OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m | 802 | OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m |
803 | OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion | ||
796 | OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command | 804 | OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command |
797 | OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner | 805 | OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner |
798 | OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions | 806 | OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions |
799 | OPT_OVERWRITE = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_OVERWRITE )) + 0, // overwrite | 807 | OPT_OVERWRITE = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_OVERWRITE )) + 0, // overwrite |
800 | 808 | ||
801 | OPT_ANY_COMPRESS = (OPT_BZIP2 | OPT_LZMA | OPT_GZIP | OPT_COMPRESS), | 809 | OPT_ANY_COMPRESS = (OPT_BZIP2 | OPT_LZMA | OPT_GZIP | OPT_XZ | OPT_COMPRESS), |
802 | }; | 810 | }; |
803 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS | 811 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS |
804 | static const char tar_longopts[] ALIGN1 = | 812 | static const char tar_longopts[] ALIGN1 = |
@@ -831,12 +839,16 @@ static const char tar_longopts[] ALIGN1 = | |||
831 | # if ENABLE_FEATURE_SEAMLESS_GZ | 839 | # if ENABLE_FEATURE_SEAMLESS_GZ |
832 | "gzip\0" No_argument "z" | 840 | "gzip\0" No_argument "z" |
833 | # endif | 841 | # endif |
842 | # if ENABLE_FEATURE_SEAMLESS_XZ | ||
843 | "xz\0" No_argument "J" | ||
844 | # endif | ||
834 | # if ENABLE_FEATURE_SEAMLESS_Z | 845 | # if ENABLE_FEATURE_SEAMLESS_Z |
835 | "compress\0" No_argument "Z" | 846 | "compress\0" No_argument "Z" |
836 | # endif | 847 | # endif |
837 | # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME | 848 | # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME |
838 | "touch\0" No_argument "m" | 849 | "touch\0" No_argument "m" |
839 | # endif | 850 | # endif |
851 | "no-recursion\0" No_argument "\xfa" | ||
840 | # if ENABLE_FEATURE_TAR_TO_COMMAND | 852 | # if ENABLE_FEATURE_TAR_TO_COMMAND |
841 | "to-command\0" Required_argument "\xfb" | 853 | "to-command\0" Required_argument "\xfb" |
842 | # endif | 854 | # endif |
@@ -923,6 +935,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
923 | IF_FEATURE_SEAMLESS_LZMA("a" ) | 935 | IF_FEATURE_SEAMLESS_LZMA("a" ) |
924 | IF_FEATURE_TAR_FROM( "T:X:") | 936 | IF_FEATURE_TAR_FROM( "T:X:") |
925 | IF_FEATURE_SEAMLESS_GZ( "z" ) | 937 | IF_FEATURE_SEAMLESS_GZ( "z" ) |
938 | IF_FEATURE_SEAMLESS_XZ( "J" ) | ||
926 | IF_FEATURE_SEAMLESS_Z( "Z" ) | 939 | IF_FEATURE_SEAMLESS_Z( "Z" ) |
927 | IF_FEATURE_TAR_NOPRESERVE_TIME("m") | 940 | IF_FEATURE_TAR_NOPRESERVE_TIME("m") |
928 | , &base_dir // -C dir | 941 | , &base_dir // -C dir |
@@ -1052,7 +1065,9 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1052 | zipMode = 2; | 1065 | zipMode = 2; |
1053 | #endif | 1066 | #endif |
1054 | /* NB: writeTarFile() closes tar_handle->src_fd */ | 1067 | /* NB: writeTarFile() closes tar_handle->src_fd */ |
1055 | return writeTarFile(tar_handle->src_fd, verboseFlag, opt & OPT_DEREFERENCE, | 1068 | return writeTarFile(tar_handle->src_fd, verboseFlag, |
1069 | (opt & OPT_DEREFERENCE ? ACTION_FOLLOWLINKS : 0) | ||
1070 | | (opt & OPT_NORECURSION ? 0 : ACTION_RECURSE), | ||
1056 | tar_handle->accept, | 1071 | tar_handle->accept, |
1057 | tar_handle->reject, zipMode); | 1072 | tar_handle->reject, zipMode); |
1058 | } | 1073 | } |
@@ -1073,6 +1088,9 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1073 | if (opt & OPT_LZMA) | 1088 | if (opt & OPT_LZMA) |
1074 | USE_FOR_MMU(xformer = unpack_lzma_stream;) | 1089 | USE_FOR_MMU(xformer = unpack_lzma_stream;) |
1075 | USE_FOR_NOMMU(xformer_prog = "unlzma";) | 1090 | USE_FOR_NOMMU(xformer_prog = "unlzma";) |
1091 | if (opt & OPT_XZ) | ||
1092 | USE_FOR_MMU(xformer = unpack_xz_stream;) | ||
1093 | USE_FOR_NOMMU(xformer_prog = "unxz";) | ||
1076 | 1094 | ||
1077 | open_transformer_with_sig(tar_handle->src_fd, xformer, xformer_prog); | 1095 | open_transformer_with_sig(tar_handle->src_fd, xformer, xformer_prog); |
1078 | /* Can't lseek over pipes */ | 1096 | /* Can't lseek over pipes */ |