aboutsummaryrefslogtreecommitdiff
path: root/archival/tar.c
diff options
context:
space:
mode:
Diffstat (limited to 'archival/tar.c')
-rw-r--r--archival/tar.c92
1 files changed, 49 insertions, 43 deletions
diff --git a/archival/tar.c b/archival/tar.c
index b2481b843..45701c985 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -36,7 +36,7 @@
36#define block_buf bb_common_bufsiz1 36#define block_buf bb_common_bufsiz1
37 37
38 38
39#if !ENABLE_FEATURE_TAR_GZIP && !ENABLE_FEATURE_TAR_BZIP2 39#if !ENABLE_FEATURE_SEAMLESS_GZ && !ENABLE_FEATURE_SEAMLESS_BZ2
40/* Do not pass gzip flag to writeTarFile() */ 40/* Do not pass gzip flag to writeTarFile() */
41#define writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude, gzip) \ 41#define writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude, gzip) \
42 writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude) 42 writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude)
@@ -503,19 +503,19 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb
503 return TRUE; 503 return TRUE;
504} 504}
505 505
506#if ENABLE_FEATURE_TAR_GZIP || ENABLE_FEATURE_TAR_BZIP2 506#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
507#if !(ENABLE_FEATURE_TAR_GZIP && ENABLE_FEATURE_TAR_BZIP2) 507#if !(ENABLE_FEATURE_SEAMLESS_GZ && ENABLE_FEATURE_SEAMLESS_BZ2)
508#define vfork_compressor(tar_fd, gzip) vfork_compressor(tar_fd) 508#define vfork_compressor(tar_fd, gzip) vfork_compressor(tar_fd)
509#endif 509#endif
510/* Don't inline: vfork scares gcc and pessimizes code */ 510/* Don't inline: vfork scares gcc and pessimizes code */
511static void NOINLINE vfork_compressor(int tar_fd, int gzip) 511static void NOINLINE vfork_compressor(int tar_fd, int gzip)
512{ 512{
513 pid_t gzipPid; 513 pid_t gzipPid;
514#if ENABLE_FEATURE_TAR_GZIP && ENABLE_FEATURE_TAR_BZIP2 514#if ENABLE_FEATURE_SEAMLESS_GZ && ENABLE_FEATURE_SEAMLESS_BZ2
515 const char *zip_exec = (gzip == 1) ? "gzip" : "bzip2"; 515 const char *zip_exec = (gzip == 1) ? "gzip" : "bzip2";
516#elif ENABLE_FEATURE_TAR_GZIP 516#elif ENABLE_FEATURE_SEAMLESS_GZ
517 const char *zip_exec = "gzip"; 517 const char *zip_exec = "gzip";
518#else /* only ENABLE_FEATURE_TAR_BZIP2 */ 518#else /* only ENABLE_FEATURE_SEAMLESS_BZ2 */
519 const char *zip_exec = "bzip2"; 519 const char *zip_exec = "bzip2";
520#endif 520#endif
521 // On Linux, vfork never unpauses parent early, although standard 521 // On Linux, vfork never unpauses parent early, although standard
@@ -579,7 +579,7 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
579 bb_perror_msg_and_die("cannot exec %s", zip_exec); 579 bb_perror_msg_and_die("cannot exec %s", zip_exec);
580 } 580 }
581} 581}
582#endif /* ENABLE_FEATURE_TAR_GZIP || ENABLE_FEATURE_TAR_BZIP2 */ 582#endif /* ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2 */
583 583
584 584
585/* gcc 4.2.1 inlines it, making code bigger */ 585/* gcc 4.2.1 inlines it, making code bigger */
@@ -601,7 +601,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
601 if (fstat(tbInfo.tarFd, &tbInfo.statBuf) < 0) 601 if (fstat(tbInfo.tarFd, &tbInfo.statBuf) < 0)
602 bb_perror_msg_and_die("cannot stat tar file"); 602 bb_perror_msg_and_die("cannot stat tar file");
603 603
604#if ENABLE_FEATURE_TAR_GZIP || ENABLE_FEATURE_TAR_BZIP2 604#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
605 if (gzip) 605 if (gzip)
606 vfork_compressor(tbInfo.tarFd, gzip); 606 vfork_compressor(tbInfo.tarFd, gzip);
607#endif 607#endif
@@ -637,7 +637,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
637 if (errorFlag) 637 if (errorFlag)
638 bb_error_msg("error exit delayed from previous errors"); 638 bb_error_msg("error exit delayed from previous errors");
639 639
640#if ENABLE_FEATURE_TAR_GZIP || ENABLE_FEATURE_TAR_BZIP2 640#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
641 if (gzip) { 641 if (gzip) {
642 int status; 642 int status;
643 if (safe_waitpid(-1, &status, 0) == -1) 643 if (safe_waitpid(-1, &status, 0) == -1)
@@ -679,7 +679,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
679#define append_file_list_to_list(x) 0 679#define append_file_list_to_list(x) 0
680#endif 680#endif
681 681
682#if ENABLE_FEATURE_TAR_COMPRESS 682#if ENABLE_FEATURE_SEAMLESS_Z
683static char FAST_FUNC get_header_tar_Z(archive_handle_t *archive_handle) 683static char FAST_FUNC get_header_tar_Z(archive_handle_t *archive_handle)
684{ 684{
685 /* Can't lseek over pipes */ 685 /* Can't lseek over pipes */
@@ -692,7 +692,7 @@ static char FAST_FUNC get_header_tar_Z(archive_handle_t *archive_handle)
692 bb_error_msg_and_die("invalid magic"); 692 bb_error_msg_and_die("invalid magic");
693 } 693 }
694 694
695 open_transformer(archive_handle->src_fd, uncompress, "uncompress"); 695 open_transformer(archive_handle->src_fd, unpack_Z_stream, "uncompress");
696 archive_handle->offset = 0; 696 archive_handle->offset = 0;
697 while (get_header_tar(archive_handle) == EXIT_SUCCESS) 697 while (get_header_tar(archive_handle) == EXIT_SUCCESS)
698 continue; 698 continue;
@@ -729,14 +729,14 @@ static void handle_SIGCHLD(int status)
729 729
730enum { 730enum {
731 OPTBIT_KEEP_OLD = 7, 731 OPTBIT_KEEP_OLD = 7,
732 USE_FEATURE_TAR_CREATE( OPTBIT_CREATE ,) 732 USE_FEATURE_TAR_CREATE( OPTBIT_CREATE ,)
733 USE_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) 733 USE_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,)
734 USE_FEATURE_TAR_BZIP2( OPTBIT_BZIP2 ,) 734 USE_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,)
735 USE_FEATURE_TAR_LZMA( OPTBIT_LZMA ,) 735 USE_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,)
736 USE_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) 736 USE_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,)
737 USE_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) 737 USE_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,)
738 USE_FEATURE_TAR_GZIP( OPTBIT_GZIP ,) 738 USE_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,)
739 USE_FEATURE_TAR_COMPRESS(OPTBIT_COMPRESS ,) 739 USE_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,)
740 OPTBIT_NOPRESERVE_OWN, 740 OPTBIT_NOPRESERVE_OWN,
741 OPTBIT_NOPRESERVE_PERM, 741 OPTBIT_NOPRESERVE_PERM,
742 OPT_TEST = 1 << 0, // t 742 OPT_TEST = 1 << 0, // t
@@ -747,14 +747,14 @@ enum {
747 OPT_P = 1 << 5, // p 747 OPT_P = 1 << 5, // p
748 OPT_VERBOSE = 1 << 6, // v 748 OPT_VERBOSE = 1 << 6, // v
749 OPT_KEEP_OLD = 1 << 7, // k 749 OPT_KEEP_OLD = 1 << 7, // k
750 OPT_CREATE = USE_FEATURE_TAR_CREATE( (1<<OPTBIT_CREATE )) + 0, // c 750 OPT_CREATE = USE_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c
751 OPT_DEREFERENCE = USE_FEATURE_TAR_CREATE( (1<<OPTBIT_DEREFERENCE )) + 0, // h 751 OPT_DEREFERENCE = USE_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h
752 OPT_BZIP2 = USE_FEATURE_TAR_BZIP2( (1<<OPTBIT_BZIP2 )) + 0, // j 752 OPT_BZIP2 = USE_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j
753 OPT_LZMA = USE_FEATURE_TAR_LZMA( (1<<OPTBIT_LZMA )) + 0, // a 753 OPT_LZMA = USE_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA )) + 0, // a
754 OPT_INCLUDE_FROM = USE_FEATURE_TAR_FROM( (1<<OPTBIT_INCLUDE_FROM)) + 0, // T 754 OPT_INCLUDE_FROM = USE_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T
755 OPT_EXCLUDE_FROM = USE_FEATURE_TAR_FROM( (1<<OPTBIT_EXCLUDE_FROM)) + 0, // X 755 OPT_EXCLUDE_FROM = USE_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X
756 OPT_GZIP = USE_FEATURE_TAR_GZIP( (1<<OPTBIT_GZIP )) + 0, // z 756 OPT_GZIP = USE_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z
757 OPT_COMPRESS = USE_FEATURE_TAR_COMPRESS((1<<OPTBIT_COMPRESS )) + 0, // Z 757 OPT_COMPRESS = USE_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
758 OPT_NOPRESERVE_OWN = 1 << OPTBIT_NOPRESERVE_OWN , // no-same-owner 758 OPT_NOPRESERVE_OWN = 1 << OPTBIT_NOPRESERVE_OWN , // no-same-owner
759 OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions 759 OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions
760}; 760};
@@ -772,20 +772,20 @@ static const char tar_longopts[] ALIGN1 =
772 "create\0" No_argument "c" 772 "create\0" No_argument "c"
773 "dereference\0" No_argument "h" 773 "dereference\0" No_argument "h"
774# endif 774# endif
775# if ENABLE_FEATURE_TAR_BZIP2 775# if ENABLE_FEATURE_SEAMLESS_BZ2
776 "bzip2\0" No_argument "j" 776 "bzip2\0" No_argument "j"
777# endif 777# endif
778# if ENABLE_FEATURE_TAR_LZMA 778# if ENABLE_FEATURE_SEAMLESS_LZMA
779 "lzma\0" No_argument "a" 779 "lzma\0" No_argument "a"
780# endif 780# endif
781# if ENABLE_FEATURE_TAR_FROM 781# if ENABLE_FEATURE_TAR_FROM
782 "files-from\0" Required_argument "T" 782 "files-from\0" Required_argument "T"
783 "exclude-from\0" Required_argument "X" 783 "exclude-from\0" Required_argument "X"
784# endif 784# endif
785# if ENABLE_FEATURE_TAR_GZIP 785# if ENABLE_FEATURE_SEAMLESS_GZ
786 "gzip\0" No_argument "z" 786 "gzip\0" No_argument "z"
787# endif 787# endif
788# if ENABLE_FEATURE_TAR_COMPRESS 788# if ENABLE_FEATURE_SEAMLESS_Z
789 "compress\0" No_argument "Z" 789 "compress\0" No_argument "Z"
790# endif 790# endif
791 "no-same-owner\0" No_argument "\xfd" 791 "no-same-owner\0" No_argument "\xfd"
@@ -834,12 +834,12 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
834#endif 834#endif
835 opt = getopt32(argv, 835 opt = getopt32(argv,
836 "txC:f:Opvk" 836 "txC:f:Opvk"
837 USE_FEATURE_TAR_CREATE( "ch" ) 837 USE_FEATURE_TAR_CREATE( "ch" )
838 USE_FEATURE_TAR_BZIP2( "j" ) 838 USE_FEATURE_SEAMLESS_BZ2( "j" )
839 USE_FEATURE_TAR_LZMA( "a" ) 839 USE_FEATURE_SEAMLESS_LZMA("a" )
840 USE_FEATURE_TAR_FROM( "T:X:") 840 USE_FEATURE_TAR_FROM( "T:X:")
841 USE_FEATURE_TAR_GZIP( "z" ) 841 USE_FEATURE_SEAMLESS_GZ( "z" )
842 USE_FEATURE_TAR_COMPRESS("Z" ) 842 USE_FEATURE_SEAMLESS_Z( "Z" )
843 , &base_dir // -C dir 843 , &base_dir // -C dir
844 , &tar_filename // -f filename 844 , &tar_filename // -f filename
845 USE_FEATURE_TAR_FROM(, &(tar_handle->accept)) // T 845 USE_FEATURE_TAR_FROM(, &(tar_handle->accept)) // T
@@ -922,8 +922,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
922 922
923 tar_stream = stdout; 923 tar_stream = stdout;
924 /* Mimicking GNU tar 1.15.1: */ 924 /* Mimicking GNU tar 1.15.1: */
925 flags = O_WRONLY|O_CREAT|O_TRUNC; 925 flags = O_WRONLY | O_CREAT | O_TRUNC;
926 /* was doing unlink; open(O_WRONLY|O_CREAT|O_EXCL); why? */
927 } else { 926 } else {
928 tar_stream = stdin; 927 tar_stream = stdin;
929 flags = O_RDONLY; 928 flags = O_RDONLY;
@@ -933,7 +932,14 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
933 tar_handle->src_fd = fileno(tar_stream); 932 tar_handle->src_fd = fileno(tar_stream);
934 tar_handle->seek = seek_by_read; 933 tar_handle->seek = seek_by_read;
935 } else { 934 } else {
936 tar_handle->src_fd = xopen(tar_filename, flags); 935 if (ENABLE_FEATURE_TAR_AUTODETECT && flags == O_RDONLY) {
936 get_header_ptr = get_header_tar;
937 tar_handle->src_fd = open_zipped(tar_filename);
938 if (tar_handle->src_fd < 0)
939 bb_perror_msg_and_die("can't open '%s'", tar_filename);
940 } else {
941 tar_handle->src_fd = xopen(tar_filename, flags);
942 }
937 } 943 }
938 } 944 }
939 945
@@ -947,11 +953,11 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
947 953
948 /* create an archive */ 954 /* create an archive */
949 if (opt & OPT_CREATE) { 955 if (opt & OPT_CREATE) {
950#if ENABLE_FEATURE_TAR_GZIP || ENABLE_FEATURE_TAR_BZIP2 956#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
951 int zipMode = 0; 957 int zipMode = 0;
952 if (ENABLE_FEATURE_TAR_GZIP && (opt & OPT_GZIP)) 958 if (ENABLE_FEATURE_SEAMLESS_GZ && (opt & OPT_GZIP))
953 zipMode = 1; 959 zipMode = 1;
954 if (ENABLE_FEATURE_TAR_BZIP2 && (opt & OPT_BZIP2)) 960 if (ENABLE_FEATURE_SEAMLESS_BZ2 && (opt & OPT_BZIP2))
955 zipMode = 2; 961 zipMode = 2;
956#endif 962#endif
957 /* NB: writeTarFile() closes tar_handle->src_fd */ 963 /* NB: writeTarFile() closes tar_handle->src_fd */