diff options
Diffstat (limited to 'archival/tar.c')
-rw-r--r-- | archival/tar.c | 92 |
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 */ |
511 | static void NOINLINE vfork_compressor(int tar_fd, int gzip) | 511 | static 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 |
683 | static char FAST_FUNC get_header_tar_Z(archive_handle_t *archive_handle) | 683 | static 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 | ||
730 | enum { | 730 | enum { |
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 */ |