4343//config:config FEATURE_TAR_AUTODETECT
4444//config: bool "Autodetect compressed tarballs"
4545//config: default y
46- //config: depends on TAR && (FEATURE_SEAMLESS_Z || FEATURE_SEAMLESS_GZ || FEATURE_SEAMLESS_BZ2 || FEATURE_SEAMLESS_LZMA || FEATURE_SEAMLESS_XZ)
46+ //config: depends on TAR && (FEATURE_SEAMLESS_Z || FEATURE_SEAMLESS_GZ || FEATURE_SEAMLESS_BZ2 || FEATURE_SEAMLESS_LZMA || FEATURE_SEAMLESS_XZ || FEATURE_SEAMLESS_ZSTD )
4747//config: help
4848//config: With this option tar can automatically detect compressed
4949//config: tarballs. Currently it works only on files (not pipes etc).
@@ -787,6 +787,11 @@ static llist_t *append_file_list_to_list(llist_t *list)
787787//usage: "\n --lzma (De)compress using lzma"
788788//usage: )
789789//usage: )
790+ //usage: IF_FEATURE_SEAMLESS_ZSTD(
791+ //usage: IF_FEATURE_TAR_LONG_OPTIONS(
792+ //usage: "\n --zstd (De)compress using zstd"
793+ //usage: )
794+ //usage: )
790795//usage: "\n -a (De)compress based on extension"
791796//usage: IF_FEATURE_TAR_CREATE(
792797//usage: "\n -h Follow symlinks"
@@ -827,6 +832,7 @@ enum {
827832 IF_FEATURE_TAR_NOPRESERVE_TIME (OPTBIT_NOPRESERVE_TIME ,)
828833#if ENABLE_FEATURE_TAR_LONG_OPTIONS
829834 OPTBIT_STRIP_COMPONENTS ,
835+ IF_FEATURE_SEAMLESS_ZSTD (OPTBIT_ZSTD ,)
830836 IF_FEATURE_SEAMLESS_LZMA (OPTBIT_LZMA ,)
831837 OPTBIT_NORECURSION ,
832838 IF_FEATURE_TAR_TO_COMMAND (OPTBIT_2COMMAND ,)
@@ -854,14 +860,15 @@ enum {
854860 OPT_AUTOCOMPRESS_BY_EXT = 1 << OPTBIT_AUTOCOMPRESS_BY_EXT , // a
855861 OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME ((1 << OPTBIT_NOPRESERVE_TIME )) + 0 , // m
856862 OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS ((1 << OPTBIT_STRIP_COMPONENTS )) + 0 , // strip-components
863+ OPT_ZSTD = IF_FEATURE_TAR_LONG_OPTIONS (IF_FEATURE_SEAMLESS_ZSTD ((1 << OPTBIT_ZSTD ))) + 0 , // zstd
857864 OPT_LZMA = IF_FEATURE_TAR_LONG_OPTIONS (IF_FEATURE_SEAMLESS_LZMA ((1 << OPTBIT_LZMA ))) + 0 , // lzma
858865 OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS ((1 << OPTBIT_NORECURSION )) + 0 , // no-recursion
859866 OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND ( (1 << OPTBIT_2COMMAND )) + 0 , // to-command
860867 OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS ((1 << OPTBIT_NUMERIC_OWNER )) + 0 , // numeric-owner
861868 OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS ((1 << OPTBIT_NOPRESERVE_PERM )) + 0 , // no-same-permissions
862869 OPT_OVERWRITE = IF_FEATURE_TAR_LONG_OPTIONS ((1 << OPTBIT_OVERWRITE )) + 0 , // overwrite
863870
864- OPT_ANY_COMPRESS = (OPT_BZIP2 | OPT_LZMA | OPT_GZIP | OPT_XZ | OPT_COMPRESS ),
871+ OPT_ANY_COMPRESS = (OPT_BZIP2 | OPT_LZMA | OPT_GZIP | OPT_XZ | OPT_COMPRESS | OPT_ZSTD ),
865872};
866873#if ENABLE_FEATURE_TAR_LONG_OPTIONS
867874static const char tar_longopts [] ALIGN1 =
@@ -901,7 +908,10 @@ static const char tar_longopts[] ALIGN1 =
901908# if ENABLE_FEATURE_TAR_NOPRESERVE_TIME
902909 "touch\0" No_argument "m"
903910# endif
904- "strip-components\0" Required_argument "\xf8"
911+ "strip-components\0" Required_argument "\xf7"
912+ # if ENABLE_FEATURE_SEAMLESS_ZSTD
913+ "zstd\0" No_argument "\xf8"
914+ # endif
905915# if ENABLE_FEATURE_SEAMLESS_LZMA
906916 "lzma\0" No_argument "\xf9"
907917# endif
@@ -999,7 +1009,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
9991009 IF_FEATURE_SEAMLESS_Z ( "Z" )
10001010 "a"
10011011 IF_FEATURE_TAR_NOPRESERVE_TIME ("m" )
1002- IF_FEATURE_TAR_LONG_OPTIONS ("\xf8 :" ) // --strip-components
1012+ IF_FEATURE_TAR_LONG_OPTIONS ("\xf7 :" ) // --strip-components
10031013 "\0"
10041014 "tt:vv:" // count -t,-v
10051015#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM
@@ -1009,7 +1019,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
10091019 IF_FEATURE_TAR_CREATE ("c--tx:t--cx:x--ct" ) // mutually exclusive
10101020 IF_NOT_FEATURE_TAR_CREATE ("t--x:x--t" ) // mutually exclusive
10111021#if ENABLE_FEATURE_TAR_LONG_OPTIONS
1012- ":\xf8 +" // --strip-components=NUM
1022+ ":\xf7 +" // --strip-components=NUM
10131023#endif
10141024 LONGOPTS
10151025 , & base_dir // -C dir
@@ -1049,6 +1059,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
10491059 showopt (OPT_AUTOCOMPRESS_BY_EXT );
10501060 showopt (OPT_NOPRESERVE_TIME );
10511061 showopt (OPT_STRIP_COMPONENTS );
1062+ showopt (OPT_ZSTD );
10521063 showopt (OPT_LZMA );
10531064 showopt (OPT_NORECURSION );
10541065 showopt (OPT_2COMMAND );
@@ -1170,7 +1181,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
11701181 } else {
11711182 tar_handle -> src_fd = xopen (tar_filename , flags );
11721183#if ENABLE_FEATURE_TAR_CREATE
1173- if ((OPT_GZIP | OPT_BZIP2 | OPT_XZ | OPT_LZMA ) != 0 /* at least one is config-enabled */
1184+ if ((OPT_GZIP | OPT_BZIP2 | OPT_XZ | OPT_LZMA | OPT_ZSTD ) != 0 /* at least one is config-enabled */
11741185 && (opt & OPT_AUTOCOMPRESS_BY_EXT )
11751186 && flags != O_RDONLY
11761187 ) {
@@ -1182,6 +1193,8 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
11821193 opt |= OPT_XZ ;
11831194 if (OPT_LZMA != 0 && is_suffixed_with (tar_filename , "lzma" ))
11841195 opt |= OPT_LZMA ;
1196+ if (OPT_ZSTD != 0 && is_suffixed_with (tar_filename , "zst" ))
1197+ opt |= OPT_ZSTD ;
11851198 }
11861199#endif
11871200 }
@@ -1206,6 +1219,8 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
12061219 zipMode = "lzma" ;
12071220 if (opt & OPT_XZ )
12081221 zipMode = "xz" ;
1222+ if (opt & OPT_ZSTD )
1223+ zipMode = "zstd" ;
12091224# endif
12101225 tbInfo = xzalloc (sizeof (* tbInfo ));
12111226 tbInfo -> tarFd = tar_handle -> src_fd ;
@@ -1246,6 +1261,10 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
12461261 USE_FOR_MMU (IF_FEATURE_SEAMLESS_XZ (xformer = unpack_xz_stream ;))
12471262 USE_FOR_NOMMU (xformer_prog = "unxz" ;)
12481263 }
1264+ if (opt & OPT_ZSTD ) {
1265+ USE_FOR_MMU (xformer = unpack_zstd_stream ;)
1266+ USE_FOR_NOMMU (xformer_prog = "unzstd" ;)
1267+ }
12491268
12501269 fork_transformer_with_sig (tar_handle -> src_fd , xformer , xformer_prog );
12511270 /* Can't lseek over pipes */
0 commit comments