diff options
Diffstat (limited to 'archival/tar.c')
-rw-r--r-- | archival/tar.c | 101 |
1 files changed, 63 insertions, 38 deletions
diff --git a/archival/tar.c b/archival/tar.c index 54961ff07..6618c9ecc 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
@@ -234,7 +234,7 @@ static HardLinkInfo *findHardLinkInfo(HardLinkInfo *hlInfo, struct stat *statbuf | |||
234 | } | 234 | } |
235 | 235 | ||
236 | /* Put an octal string into the specified buffer. | 236 | /* Put an octal string into the specified buffer. |
237 | * The number is zero padded and possibly null terminated. | 237 | * The number is zero padded and possibly NUL terminated. |
238 | * Stores low-order bits only if whole value does not fit. */ | 238 | * Stores low-order bits only if whole value does not fit. */ |
239 | static void putOctal(char *cp, int len, off_t value) | 239 | static void putOctal(char *cp, int len, off_t value) |
240 | { | 240 | { |
@@ -285,31 +285,32 @@ static void chksum_and_xwrite(int fd, struct tar_header_t* hp) | |||
285 | # if ENABLE_FEATURE_TAR_GNU_EXTENSIONS | 285 | # if ENABLE_FEATURE_TAR_GNU_EXTENSIONS |
286 | static void writeLongname(int fd, int type, const char *name, int dir) | 286 | static void writeLongname(int fd, int type, const char *name, int dir) |
287 | { | 287 | { |
288 | static const struct { | 288 | struct prefilled { |
289 | char mode[8]; /* 100-107 */ | 289 | char mode[8]; /* 100-107 */ |
290 | char uid[8]; /* 108-115 */ | 290 | char uid[8]; /* 108-115 */ |
291 | char gid[8]; /* 116-123 */ | 291 | char gid[8]; /* 116-123 */ |
292 | char size[12]; /* 124-135 */ | 292 | char size[12]; /* 124-135 */ |
293 | char mtime[12]; /* 136-147 */ | 293 | char mtime[12]; /* 136-147 */ |
294 | } prefilled = { | ||
295 | "0000000", | ||
296 | "0000000", | ||
297 | "0000000", | ||
298 | "00000000000", | ||
299 | "00000000000", | ||
300 | }; | 294 | }; |
301 | struct tar_header_t header; | 295 | struct tar_header_t header; |
302 | int size; | 296 | int size; |
303 | 297 | ||
298 | memset(&header, 0, sizeof(header)); | ||
299 | header.typeflag = type; | ||
300 | strcpy(header.name, "././@LongLink"); | ||
301 | /* This sets mode/uid/gid/mtime to "00...00<NUL>" strings */ | ||
302 | memset(header.mode, '0', sizeof(struct prefilled)); | ||
303 | header.mode [sizeof(header.mode ) - 1] = '\0'; | ||
304 | header.uid [sizeof(header.uid ) - 1] = '\0'; | ||
305 | header.gid [sizeof(header.gid ) - 1] = '\0'; | ||
306 | /* header.size is filled by '0' now, will be corrected below */ | ||
307 | header.mtime[sizeof(header.mtime) - 1] = '\0'; | ||
308 | |||
304 | dir = !!dir; /* normalize: 0/1 */ | 309 | dir = !!dir; /* normalize: 0/1 */ |
305 | size = strlen(name) + 1 + dir; /* GNU tar uses strlen+1 */ | 310 | size = strlen(name) + 1 + dir; /* GNU tar uses strlen+1 */ |
306 | /* + dir: account for possible '/' */ | 311 | /* + dir: account for possible '/' */ |
307 | 312 | ||
308 | memset(&header, 0, sizeof(header)); | ||
309 | strcpy(header.name, "././@LongLink"); | ||
310 | memcpy(header.mode, prefilled.mode, sizeof(prefilled)); | ||
311 | PUT_OCTAL(header.size, size); | 313 | PUT_OCTAL(header.size, size); |
312 | header.typeflag = type; | ||
313 | chksum_and_xwrite(fd, &header); | 314 | chksum_and_xwrite(fd, &header); |
314 | 315 | ||
315 | /* Write filename[/] and pad the block. */ | 316 | /* Write filename[/] and pad the block. */ |
@@ -371,7 +372,7 @@ static int writeTarHeader(struct TarBallInfo *tbInfo, | |||
371 | /* If it is larger than 100 bytes, bail out */ | 372 | /* If it is larger than 100 bytes, bail out */ |
372 | if (header.linkname[sizeof(header.linkname)-1]) { | 373 | if (header.linkname[sizeof(header.linkname)-1]) { |
373 | free(lpath); | 374 | free(lpath); |
374 | bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); | 375 | bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); |
375 | return FALSE; | 376 | return FALSE; |
376 | } | 377 | } |
377 | # endif | 378 | # endif |
@@ -550,7 +551,7 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb | |||
550 | 551 | ||
551 | # if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS | 552 | # if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS |
552 | if (strlen(header_name) >= NAME_SIZE) { | 553 | if (strlen(header_name) >= NAME_SIZE) { |
553 | bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); | 554 | bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); |
554 | return TRUE; | 555 | return TRUE; |
555 | } | 556 | } |
556 | # endif | 557 | # endif |
@@ -645,8 +646,14 @@ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) | |||
645 | } | 646 | } |
646 | xmove_fd(data.rd, 0); | 647 | xmove_fd(data.rd, 0); |
647 | xmove_fd(tfd, 1); | 648 | xmove_fd(tfd, 1); |
648 | /* exec gzip/bzip2 program/applet */ | 649 | |
649 | BB_EXECLP(gzip, gzip, "-f", (char *)0); | 650 | /* exec gzip/bzip2/... program */ |
651 | //BB_EXECLP(gzip, gzip, "-f", (char *)0); - WRONG for "xz", | ||
652 | // if xz is an enabled applet, it'll be a version which | ||
653 | // can only decompress. We do need to execute external | ||
654 | // program, not applet. | ||
655 | execlp(gzip, gzip, "-f", (char *)0); | ||
656 | |||
650 | vfork_exec_errno = errno; | 657 | vfork_exec_errno = errno; |
651 | _exit(EXIT_FAILURE); | 658 | _exit(EXIT_FAILURE); |
652 | } | 659 | } |
@@ -748,17 +755,17 @@ static NOINLINE int writeTarFile( | |||
748 | freeHardLinkInfo(&tbInfo->hlInfoHead); | 755 | freeHardLinkInfo(&tbInfo->hlInfoHead); |
749 | 756 | ||
750 | if (errorFlag) | 757 | if (errorFlag) |
751 | bb_error_msg("error exit delayed from previous errors"); | 758 | bb_simple_error_msg("error exit delayed from previous errors"); |
752 | 759 | ||
753 | # if SEAMLESS_COMPRESSION | 760 | # if SEAMLESS_COMPRESSION |
754 | if (gzip) { | 761 | if (gzip) { |
755 | int status; | 762 | int status; |
756 | #if !ENABLE_PLATFORM_MINGW32 | 763 | # if !ENABLE_PLATFORM_MINGW32 |
757 | if (safe_waitpid(-1, &status, 0) == -1) | 764 | if (safe_waitpid(-1, &status, 0) == -1) |
758 | #else | 765 | # else |
759 | if (safe_waitpid(pid, &status, 0) == -1) | 766 | if (safe_waitpid(pid, &status, 0) == -1) |
760 | #endif | 767 | # endif |
761 | bb_perror_msg("waitpid"); | 768 | bb_simple_perror_msg("waitpid"); |
762 | else if (!WIFEXITED(status) || WEXITSTATUS(status)) | 769 | else if (!WIFEXITED(status) || WEXITSTATUS(status)) |
763 | /* gzip was killed or has exited with nonzero! */ | 770 | /* gzip was killed or has exited with nonzero! */ |
764 | errorFlag = TRUE; | 771 | errorFlag = TRUE; |
@@ -798,7 +805,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
798 | //usage: IF_FEATURE_SEAMLESS_GZ("z") | 805 | //usage: IF_FEATURE_SEAMLESS_GZ("z") |
799 | //usage: IF_FEATURE_SEAMLESS_XZ("J") | 806 | //usage: IF_FEATURE_SEAMLESS_XZ("J") |
800 | //usage: IF_FEATURE_SEAMLESS_BZ2("j") | 807 | //usage: IF_FEATURE_SEAMLESS_BZ2("j") |
801 | //usage: IF_FEATURE_SEAMLESS_LZMA("a") | 808 | //usage: "a" |
802 | //usage: IF_FEATURE_TAR_CREATE("h") | 809 | //usage: IF_FEATURE_TAR_CREATE("h") |
803 | //usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m") | 810 | //usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m") |
804 | //usage: "vokO] " | 811 | //usage: "vokO] " |
@@ -837,9 +844,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
837 | //usage: IF_FEATURE_SEAMLESS_BZ2( | 844 | //usage: IF_FEATURE_SEAMLESS_BZ2( |
838 | //usage: "\n -j (De)compress using bzip2" | 845 | //usage: "\n -j (De)compress using bzip2" |
839 | //usage: ) | 846 | //usage: ) |
840 | //usage: IF_FEATURE_SEAMLESS_LZMA( | 847 | //usage: "\n -a (De)compress based on extension" |
841 | //usage: "\n -a (De)compress using lzma" | ||
842 | //usage: ) | ||
843 | //usage: IF_FEATURE_TAR_CREATE( | 848 | //usage: IF_FEATURE_TAR_CREATE( |
844 | //usage: "\n -h Follow symlinks" | 849 | //usage: "\n -h Follow symlinks" |
845 | //usage: ) | 850 | //usage: ) |
@@ -856,6 +861,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
856 | //usage: "$ tar -cf /tmp/tarball.tar /usr/local\n" | 861 | //usage: "$ tar -cf /tmp/tarball.tar /usr/local\n" |
857 | 862 | ||
858 | // Supported but aren't in --help: | 863 | // Supported but aren't in --help: |
864 | // lzma | ||
859 | // no-recursion | 865 | // no-recursion |
860 | // numeric-owner | 866 | // numeric-owner |
861 | // no-same-permissions | 867 | // no-same-permissions |
@@ -869,15 +875,16 @@ enum { | |||
869 | IF_FEATURE_TAR_CREATE( OPTBIT_CREATE ,) | 875 | IF_FEATURE_TAR_CREATE( OPTBIT_CREATE ,) |
870 | IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) | 876 | IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) |
871 | IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,) | 877 | IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,) |
872 | IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,) | ||
873 | IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) | 878 | IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) |
874 | IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) | 879 | IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) |
875 | IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) | 880 | IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) |
876 | IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,) // 16th bit | 881 | IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,) |
877 | IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) | 882 | IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit |
883 | OPTBIT_AUTOCOMPRESS_BY_EXT, | ||
878 | IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) | 884 | IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) |
879 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS | 885 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS |
880 | OPTBIT_STRIP_COMPONENTS, | 886 | OPTBIT_STRIP_COMPONENTS, |
887 | IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,) | ||
881 | OPTBIT_NORECURSION, | 888 | OPTBIT_NORECURSION, |
882 | IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) | 889 | IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) |
883 | OPTBIT_NUMERIC_OWNER, | 890 | OPTBIT_NUMERIC_OWNER, |
@@ -896,14 +903,15 @@ enum { | |||
896 | OPT_CREATE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c | 903 | OPT_CREATE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c |
897 | OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h | 904 | OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h |
898 | OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j | 905 | OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j |
899 | OPT_LZMA = IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA )) + 0, // a | ||
900 | OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T | 906 | OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T |
901 | OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X | 907 | OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X |
902 | OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z | 908 | OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z |
903 | OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J | 909 | OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J |
904 | OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z | 910 | OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z |
911 | OPT_AUTOCOMPRESS_BY_EXT = 1 << OPTBIT_AUTOCOMPRESS_BY_EXT, // a | ||
905 | OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m | 912 | OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m |
906 | OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_STRIP_COMPONENTS)) + 0, // strip-components | 913 | OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_STRIP_COMPONENTS)) + 0, // strip-components |
914 | OPT_LZMA = IF_FEATURE_TAR_LONG_OPTIONS(IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA))) + 0, // lzma | ||
907 | OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion | 915 | OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion |
908 | OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command | 916 | OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command |
909 | OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner | 917 | OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner |
@@ -933,9 +941,6 @@ static const char tar_longopts[] ALIGN1 = | |||
933 | # if ENABLE_FEATURE_SEAMLESS_BZ2 | 941 | # if ENABLE_FEATURE_SEAMLESS_BZ2 |
934 | "bzip2\0" No_argument "j" | 942 | "bzip2\0" No_argument "j" |
935 | # endif | 943 | # endif |
936 | # if ENABLE_FEATURE_SEAMLESS_LZMA | ||
937 | "lzma\0" No_argument "a" | ||
938 | # endif | ||
939 | # if ENABLE_FEATURE_TAR_FROM | 944 | # if ENABLE_FEATURE_TAR_FROM |
940 | "files-from\0" Required_argument "T" | 945 | "files-from\0" Required_argument "T" |
941 | "exclude-from\0" Required_argument "X" | 946 | "exclude-from\0" Required_argument "X" |
@@ -949,10 +954,14 @@ static const char tar_longopts[] ALIGN1 = | |||
949 | # if ENABLE_FEATURE_SEAMLESS_Z | 954 | # if ENABLE_FEATURE_SEAMLESS_Z |
950 | "compress\0" No_argument "Z" | 955 | "compress\0" No_argument "Z" |
951 | # endif | 956 | # endif |
957 | "auto-compress\0" No_argument "a" | ||
952 | # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME | 958 | # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME |
953 | "touch\0" No_argument "m" | 959 | "touch\0" No_argument "m" |
954 | # endif | 960 | # endif |
955 | "strip-components\0" Required_argument "\xf9" | 961 | "strip-components\0" Required_argument "\xf8" |
962 | # if ENABLE_FEATURE_SEAMLESS_LZMA | ||
963 | "lzma\0" No_argument "\xf9" | ||
964 | # endif | ||
956 | "no-recursion\0" No_argument "\xfa" | 965 | "no-recursion\0" No_argument "\xfa" |
957 | # if ENABLE_FEATURE_TAR_TO_COMMAND | 966 | # if ENABLE_FEATURE_TAR_TO_COMMAND |
958 | "to-command\0" Required_argument "\xfb" | 967 | "to-command\0" Required_argument "\xfb" |
@@ -1041,13 +1050,13 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1041 | "txC:f:Oopvk" | 1050 | "txC:f:Oopvk" |
1042 | IF_FEATURE_TAR_CREATE( "ch" ) | 1051 | IF_FEATURE_TAR_CREATE( "ch" ) |
1043 | IF_FEATURE_SEAMLESS_BZ2( "j" ) | 1052 | IF_FEATURE_SEAMLESS_BZ2( "j" ) |
1044 | IF_FEATURE_SEAMLESS_LZMA("a" ) | ||
1045 | IF_FEATURE_TAR_FROM( "T:*X:*") | 1053 | IF_FEATURE_TAR_FROM( "T:*X:*") |
1046 | IF_FEATURE_SEAMLESS_GZ( "z" ) | 1054 | IF_FEATURE_SEAMLESS_GZ( "z" ) |
1047 | IF_FEATURE_SEAMLESS_XZ( "J" ) | 1055 | IF_FEATURE_SEAMLESS_XZ( "J" ) |
1048 | IF_FEATURE_SEAMLESS_Z( "Z" ) | 1056 | IF_FEATURE_SEAMLESS_Z( "Z" ) |
1057 | "a" | ||
1049 | IF_FEATURE_TAR_NOPRESERVE_TIME("m") | 1058 | IF_FEATURE_TAR_NOPRESERVE_TIME("m") |
1050 | IF_FEATURE_TAR_LONG_OPTIONS("\xf9:") // --strip-components | 1059 | IF_FEATURE_TAR_LONG_OPTIONS("\xf8:") // --strip-components |
1051 | "\0" | 1060 | "\0" |
1052 | "tt:vv:" // count -t,-v | 1061 | "tt:vv:" // count -t,-v |
1053 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM | 1062 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM |
@@ -1076,7 +1085,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1076 | ); | 1085 | ); |
1077 | #if DBG_OPTION_PARSING | 1086 | #if DBG_OPTION_PARSING |
1078 | bb_error_msg("opt: 0x%08x", opt); | 1087 | bb_error_msg("opt: 0x%08x", opt); |
1079 | # define showopt(o) bb_error_msg("opt & %s(%x): %x", #o, o, opt & o); | 1088 | # define showopt(o) bb_error_msg("opt & %s(%x):\t%x", #o, o, opt & o); |
1080 | showopt(OPT_TEST ); | 1089 | showopt(OPT_TEST ); |
1081 | showopt(OPT_EXTRACT ); | 1090 | showopt(OPT_EXTRACT ); |
1082 | showopt(OPT_BASEDIR ); | 1091 | showopt(OPT_BASEDIR ); |
@@ -1089,14 +1098,15 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1089 | showopt(OPT_CREATE ); | 1098 | showopt(OPT_CREATE ); |
1090 | showopt(OPT_DEREFERENCE ); | 1099 | showopt(OPT_DEREFERENCE ); |
1091 | showopt(OPT_BZIP2 ); | 1100 | showopt(OPT_BZIP2 ); |
1092 | showopt(OPT_LZMA ); | ||
1093 | showopt(OPT_INCLUDE_FROM ); | 1101 | showopt(OPT_INCLUDE_FROM ); |
1094 | showopt(OPT_EXCLUDE_FROM ); | 1102 | showopt(OPT_EXCLUDE_FROM ); |
1095 | showopt(OPT_GZIP ); | 1103 | showopt(OPT_GZIP ); |
1096 | showopt(OPT_XZ ); | 1104 | showopt(OPT_XZ ); |
1097 | showopt(OPT_COMPRESS ); | 1105 | showopt(OPT_COMPRESS ); |
1106 | showopt(OPT_AUTOCOMPRESS_BY_EXT); | ||
1098 | showopt(OPT_NOPRESERVE_TIME ); | 1107 | showopt(OPT_NOPRESERVE_TIME ); |
1099 | showopt(OPT_STRIP_COMPONENTS); | 1108 | showopt(OPT_STRIP_COMPONENTS); |
1109 | showopt(OPT_LZMA ); | ||
1100 | showopt(OPT_NORECURSION ); | 1110 | showopt(OPT_NORECURSION ); |
1101 | showopt(OPT_2COMMAND ); | 1111 | showopt(OPT_2COMMAND ); |
1102 | showopt(OPT_NUMERIC_OWNER ); | 1112 | showopt(OPT_NUMERIC_OWNER ); |
@@ -1187,7 +1197,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1187 | if (opt & OPT_CREATE) { | 1197 | if (opt & OPT_CREATE) { |
1188 | /* Make sure there is at least one file to tar up */ | 1198 | /* Make sure there is at least one file to tar up */ |
1189 | if (tar_handle->accept == NULL) | 1199 | if (tar_handle->accept == NULL) |
1190 | bb_error_msg_and_die("empty archive"); | 1200 | bb_simple_error_msg_and_die("empty archive"); |
1191 | 1201 | ||
1192 | tar_fd = STDOUT_FILENO; | 1202 | tar_fd = STDOUT_FILENO; |
1193 | /* Mimicking GNU tar 1.15.1: */ | 1203 | /* Mimicking GNU tar 1.15.1: */ |
@@ -1215,6 +1225,21 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1215 | bb_perror_msg_and_die("can't open '%s'", tar_filename); | 1225 | bb_perror_msg_and_die("can't open '%s'", tar_filename); |
1216 | } else { | 1226 | } else { |
1217 | tar_handle->src_fd = xopen(tar_filename, flags); | 1227 | tar_handle->src_fd = xopen(tar_filename, flags); |
1228 | #if ENABLE_FEATURE_TAR_CREATE | ||
1229 | if ((OPT_GZIP | OPT_BZIP2 | OPT_XZ | OPT_LZMA) != 0 /* at least one is config-enabled */ | ||
1230 | && (opt & OPT_AUTOCOMPRESS_BY_EXT) | ||
1231 | && flags != O_RDONLY | ||
1232 | ) { | ||
1233 | if (OPT_GZIP != 0 && is_suffixed_with(tar_filename, "gz")) | ||
1234 | opt |= OPT_GZIP; | ||
1235 | if (OPT_BZIP2 != 0 && is_suffixed_with(tar_filename, "bz2")) | ||
1236 | opt |= OPT_BZIP2; | ||
1237 | if (OPT_XZ != 0 && is_suffixed_with(tar_filename, "xz")) | ||
1238 | opt |= OPT_XZ; | ||
1239 | if (OPT_LZMA != 0 && is_suffixed_with(tar_filename, "lzma")) | ||
1240 | opt |= OPT_LZMA; | ||
1241 | } | ||
1242 | #endif | ||
1218 | } | 1243 | } |
1219 | } | 1244 | } |
1220 | 1245 | ||