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 | ||
