diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-08-02 15:19:56 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-08-02 15:19:56 +0200 |
commit | 16474cf246cb10b982f7365b201f32a930e8af95 (patch) | |
tree | 3ee0e6cb0a2dd535a41a52a9f99f05d22d044049 | |
parent | e6a87e74837ba5f2f2207a75cd825acf8cf28afb (diff) | |
download | busybox-w32-16474cf246cb10b982f7365b201f32a930e8af95.tar.gz busybox-w32-16474cf246cb10b982f7365b201f32a930e8af95.tar.bz2 busybox-w32-16474cf246cb10b982f7365b201f32a930e8af95.zip |
tar: change -a from meaning "lzma" to mean "autodetect by extension"
function old new delta
tar_main 1026 1100 +74
packed_usage 33311 33329 +18
tar_longopts 309 325 +16
vfork_compressor 246 210 -36
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/1 up/down: 108/-36) Total: 72 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/tar.c | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/archival/tar.c b/archival/tar.c index f10781a58..4f64d2286 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
@@ -637,8 +637,14 @@ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) | |||
637 | } | 637 | } |
638 | xmove_fd(data.rd, 0); | 638 | xmove_fd(data.rd, 0); |
639 | xmove_fd(tfd, 1); | 639 | xmove_fd(tfd, 1); |
640 | /* exec gzip/bzip2 program/applet */ | 640 | |
641 | BB_EXECLP(gzip, gzip, "-f", (char *)0); | 641 | /* exec gzip/bzip2/... program */ |
642 | //BB_EXECLP(gzip, gzip, "-f", (char *)0); - WRONG for "xz", | ||
643 | // if xz is an enabled applet, it'll be a version which | ||
644 | // can only decompress. We do need to execute external | ||
645 | // program, not applet. | ||
646 | execlp(gzip, gzip, "-f", (char *)0); | ||
647 | |||
642 | vfork_exec_errno = errno; | 648 | vfork_exec_errno = errno; |
643 | _exit(EXIT_FAILURE); | 649 | _exit(EXIT_FAILURE); |
644 | } | 650 | } |
@@ -762,7 +768,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
762 | //usage: IF_FEATURE_SEAMLESS_GZ("z") | 768 | //usage: IF_FEATURE_SEAMLESS_GZ("z") |
763 | //usage: IF_FEATURE_SEAMLESS_XZ("J") | 769 | //usage: IF_FEATURE_SEAMLESS_XZ("J") |
764 | //usage: IF_FEATURE_SEAMLESS_BZ2("j") | 770 | //usage: IF_FEATURE_SEAMLESS_BZ2("j") |
765 | //usage: IF_FEATURE_SEAMLESS_LZMA("a") | 771 | //usage: "a" |
766 | //usage: IF_FEATURE_TAR_CREATE("h") | 772 | //usage: IF_FEATURE_TAR_CREATE("h") |
767 | //usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m") | 773 | //usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m") |
768 | //usage: "vokO] " | 774 | //usage: "vokO] " |
@@ -801,9 +807,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
801 | //usage: IF_FEATURE_SEAMLESS_BZ2( | 807 | //usage: IF_FEATURE_SEAMLESS_BZ2( |
802 | //usage: "\n -j (De)compress using bzip2" | 808 | //usage: "\n -j (De)compress using bzip2" |
803 | //usage: ) | 809 | //usage: ) |
804 | //usage: IF_FEATURE_SEAMLESS_LZMA( | 810 | //usage: "\n -a (De)compress based on extension" |
805 | //usage: "\n -a (De)compress using lzma" | ||
806 | //usage: ) | ||
807 | //usage: IF_FEATURE_TAR_CREATE( | 811 | //usage: IF_FEATURE_TAR_CREATE( |
808 | //usage: "\n -h Follow symlinks" | 812 | //usage: "\n -h Follow symlinks" |
809 | //usage: ) | 813 | //usage: ) |
@@ -820,6 +824,7 @@ static llist_t *append_file_list_to_list(llist_t *list) | |||
820 | //usage: "$ tar -cf /tmp/tarball.tar /usr/local\n" | 824 | //usage: "$ tar -cf /tmp/tarball.tar /usr/local\n" |
821 | 825 | ||
822 | // Supported but aren't in --help: | 826 | // Supported but aren't in --help: |
827 | // lzma | ||
823 | // no-recursion | 828 | // no-recursion |
824 | // numeric-owner | 829 | // numeric-owner |
825 | // no-same-permissions | 830 | // no-same-permissions |
@@ -833,15 +838,16 @@ enum { | |||
833 | IF_FEATURE_TAR_CREATE( OPTBIT_CREATE ,) | 838 | IF_FEATURE_TAR_CREATE( OPTBIT_CREATE ,) |
834 | IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) | 839 | IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) |
835 | IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,) | 840 | IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,) |
836 | IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,) | ||
837 | IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) | 841 | IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) |
838 | IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) | 842 | IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) |
839 | IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) | 843 | IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) |
840 | IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,) // 16th bit | 844 | IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,) |
841 | IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) | 845 | IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit |
846 | OPTBIT_AUTOCOMPRESS_BY_EXT, | ||
842 | IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) | 847 | IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) |
843 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS | 848 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS |
844 | OPTBIT_STRIP_COMPONENTS, | 849 | OPTBIT_STRIP_COMPONENTS, |
850 | IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,) | ||
845 | OPTBIT_NORECURSION, | 851 | OPTBIT_NORECURSION, |
846 | IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) | 852 | IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) |
847 | OPTBIT_NUMERIC_OWNER, | 853 | OPTBIT_NUMERIC_OWNER, |
@@ -860,14 +866,15 @@ enum { | |||
860 | OPT_CREATE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c | 866 | OPT_CREATE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c |
861 | OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h | 867 | OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h |
862 | OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j | 868 | OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j |
863 | OPT_LZMA = IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA )) + 0, // a | ||
864 | OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T | 869 | OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T |
865 | OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X | 870 | OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X |
866 | OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z | 871 | OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z |
867 | OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J | 872 | OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J |
868 | OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z | 873 | OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z |
874 | OPT_AUTOCOMPRESS_BY_EXT = 1 << OPTBIT_AUTOCOMPRESS_BY_EXT, // a | ||
869 | OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m | 875 | OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m |
870 | OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_STRIP_COMPONENTS)) + 0, // strip-components | 876 | OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_STRIP_COMPONENTS)) + 0, // strip-components |
877 | OPT_LZMA = IF_FEATURE_TAR_LONG_OPTIONS(IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA))) + 0, // lzma | ||
871 | OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion | 878 | OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion |
872 | OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command | 879 | OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command |
873 | OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner | 880 | OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner |
@@ -897,9 +904,6 @@ static const char tar_longopts[] ALIGN1 = | |||
897 | # if ENABLE_FEATURE_SEAMLESS_BZ2 | 904 | # if ENABLE_FEATURE_SEAMLESS_BZ2 |
898 | "bzip2\0" No_argument "j" | 905 | "bzip2\0" No_argument "j" |
899 | # endif | 906 | # endif |
900 | # if ENABLE_FEATURE_SEAMLESS_LZMA | ||
901 | "lzma\0" No_argument "a" | ||
902 | # endif | ||
903 | # if ENABLE_FEATURE_TAR_FROM | 907 | # if ENABLE_FEATURE_TAR_FROM |
904 | "files-from\0" Required_argument "T" | 908 | "files-from\0" Required_argument "T" |
905 | "exclude-from\0" Required_argument "X" | 909 | "exclude-from\0" Required_argument "X" |
@@ -913,10 +917,14 @@ static const char tar_longopts[] ALIGN1 = | |||
913 | # if ENABLE_FEATURE_SEAMLESS_Z | 917 | # if ENABLE_FEATURE_SEAMLESS_Z |
914 | "compress\0" No_argument "Z" | 918 | "compress\0" No_argument "Z" |
915 | # endif | 919 | # endif |
920 | "auto-compress\0" No_argument "a" | ||
916 | # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME | 921 | # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME |
917 | "touch\0" No_argument "m" | 922 | "touch\0" No_argument "m" |
918 | # endif | 923 | # endif |
919 | "strip-components\0" Required_argument "\xf9" | 924 | "strip-components\0" Required_argument "\xf8" |
925 | # if ENABLE_FEATURE_SEAMLESS_LZMA | ||
926 | "lzma\0" No_argument "\xf9" | ||
927 | # endif | ||
920 | "no-recursion\0" No_argument "\xfa" | 928 | "no-recursion\0" No_argument "\xfa" |
921 | # if ENABLE_FEATURE_TAR_TO_COMMAND | 929 | # if ENABLE_FEATURE_TAR_TO_COMMAND |
922 | "to-command\0" Required_argument "\xfb" | 930 | "to-command\0" Required_argument "\xfb" |
@@ -1005,13 +1013,13 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1005 | "txC:f:Oopvk" | 1013 | "txC:f:Oopvk" |
1006 | IF_FEATURE_TAR_CREATE( "ch" ) | 1014 | IF_FEATURE_TAR_CREATE( "ch" ) |
1007 | IF_FEATURE_SEAMLESS_BZ2( "j" ) | 1015 | IF_FEATURE_SEAMLESS_BZ2( "j" ) |
1008 | IF_FEATURE_SEAMLESS_LZMA("a" ) | ||
1009 | IF_FEATURE_TAR_FROM( "T:*X:*") | 1016 | IF_FEATURE_TAR_FROM( "T:*X:*") |
1010 | IF_FEATURE_SEAMLESS_GZ( "z" ) | 1017 | IF_FEATURE_SEAMLESS_GZ( "z" ) |
1011 | IF_FEATURE_SEAMLESS_XZ( "J" ) | 1018 | IF_FEATURE_SEAMLESS_XZ( "J" ) |
1012 | IF_FEATURE_SEAMLESS_Z( "Z" ) | 1019 | IF_FEATURE_SEAMLESS_Z( "Z" ) |
1020 | "a" | ||
1013 | IF_FEATURE_TAR_NOPRESERVE_TIME("m") | 1021 | IF_FEATURE_TAR_NOPRESERVE_TIME("m") |
1014 | IF_FEATURE_TAR_LONG_OPTIONS("\xf9:") // --strip-components | 1022 | IF_FEATURE_TAR_LONG_OPTIONS("\xf8:") // --strip-components |
1015 | "\0" | 1023 | "\0" |
1016 | "tt:vv:" // count -t,-v | 1024 | "tt:vv:" // count -t,-v |
1017 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM | 1025 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM |
@@ -1040,7 +1048,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1040 | ); | 1048 | ); |
1041 | #if DBG_OPTION_PARSING | 1049 | #if DBG_OPTION_PARSING |
1042 | bb_error_msg("opt: 0x%08x", opt); | 1050 | bb_error_msg("opt: 0x%08x", opt); |
1043 | # define showopt(o) bb_error_msg("opt & %s(%x): %x", #o, o, opt & o); | 1051 | # define showopt(o) bb_error_msg("opt & %s(%x):\t%x", #o, o, opt & o); |
1044 | showopt(OPT_TEST ); | 1052 | showopt(OPT_TEST ); |
1045 | showopt(OPT_EXTRACT ); | 1053 | showopt(OPT_EXTRACT ); |
1046 | showopt(OPT_BASEDIR ); | 1054 | showopt(OPT_BASEDIR ); |
@@ -1053,14 +1061,15 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1053 | showopt(OPT_CREATE ); | 1061 | showopt(OPT_CREATE ); |
1054 | showopt(OPT_DEREFERENCE ); | 1062 | showopt(OPT_DEREFERENCE ); |
1055 | showopt(OPT_BZIP2 ); | 1063 | showopt(OPT_BZIP2 ); |
1056 | showopt(OPT_LZMA ); | ||
1057 | showopt(OPT_INCLUDE_FROM ); | 1064 | showopt(OPT_INCLUDE_FROM ); |
1058 | showopt(OPT_EXCLUDE_FROM ); | 1065 | showopt(OPT_EXCLUDE_FROM ); |
1059 | showopt(OPT_GZIP ); | 1066 | showopt(OPT_GZIP ); |
1060 | showopt(OPT_XZ ); | 1067 | showopt(OPT_XZ ); |
1061 | showopt(OPT_COMPRESS ); | 1068 | showopt(OPT_COMPRESS ); |
1069 | showopt(OPT_AUTOCOMPRESS_BY_EXT); | ||
1062 | showopt(OPT_NOPRESERVE_TIME ); | 1070 | showopt(OPT_NOPRESERVE_TIME ); |
1063 | showopt(OPT_STRIP_COMPONENTS); | 1071 | showopt(OPT_STRIP_COMPONENTS); |
1072 | showopt(OPT_LZMA ); | ||
1064 | showopt(OPT_NORECURSION ); | 1073 | showopt(OPT_NORECURSION ); |
1065 | showopt(OPT_2COMMAND ); | 1074 | showopt(OPT_2COMMAND ); |
1066 | showopt(OPT_NUMERIC_OWNER ); | 1075 | showopt(OPT_NUMERIC_OWNER ); |
@@ -1179,6 +1188,21 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
1179 | bb_perror_msg_and_die("can't open '%s'", tar_filename); | 1188 | bb_perror_msg_and_die("can't open '%s'", tar_filename); |
1180 | } else { | 1189 | } else { |
1181 | tar_handle->src_fd = xopen(tar_filename, flags); | 1190 | tar_handle->src_fd = xopen(tar_filename, flags); |
1191 | #if ENABLE_FEATURE_TAR_CREATE | ||
1192 | if ((OPT_GZIP | OPT_BZIP2 | OPT_XZ | OPT_LZMA) != 0 /* at least one is config-enabled */ | ||
1193 | && (opt & OPT_AUTOCOMPRESS_BY_EXT) | ||
1194 | && flags != O_RDONLY | ||
1195 | ) { | ||
1196 | if (OPT_GZIP != 0 && is_suffixed_with(tar_filename, "gz")) | ||
1197 | opt |= OPT_GZIP; | ||
1198 | if (OPT_BZIP2 != 0 && is_suffixed_with(tar_filename, "bz2")) | ||
1199 | opt |= OPT_BZIP2; | ||
1200 | if (OPT_XZ != 0 && is_suffixed_with(tar_filename, "xz")) | ||
1201 | opt |= OPT_XZ; | ||
1202 | if (OPT_LZMA != 0 && is_suffixed_with(tar_filename, "lzma")) | ||
1203 | opt |= OPT_LZMA; | ||
1204 | } | ||
1205 | #endif | ||
1182 | } | 1206 | } |
1183 | } | 1207 | } |
1184 | 1208 | ||