aboutsummaryrefslogtreecommitdiff
path: root/archival/tar.c
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2012-09-07 11:48:25 +0100
committerRon Yorston <rmy@pobox.com>2012-09-07 11:48:25 +0100
commitfecf687cc358883de2da21de33346f0df204c80b (patch)
treed22c606157926fb659374ae68d55e3a874bacf25 /archival/tar.c
parentb25a7c28a0f684087fa6ccbbc7e265a9cac0f0fa (diff)
parent6d463de46b418e6c4c8d1397033608f78b33ab21 (diff)
downloadbusybox-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.c36
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 */
602static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, 602static 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
666int writeTarFile(int tar_fd, int verboseFlag, 665int 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
804static const char tar_longopts[] ALIGN1 = 812static 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 */