Browse Source

Add support for zstd compression

* configure.ac (zstd): Register compression program.
* doc/tar.1: Mention --zstd.
* doc/tar.texi: Document zstd support.
* src/buffer.c: Register zstd compression.
* src/suffix.c: Add suffixes zst and tzst.
* src/tar.c: New compression option --zstd.
Adam Borowski 7 years ago
parent
commit
3d45373d3b
7 changed files with 44 additions and 10 deletions
  1. 1 0
      configure.ac
  2. 1 0
      doc/.gitignore
  3. 4 0
      doc/tar.1
  4. 21 8
      doc/tar.texi
  5. 4 1
      src/buffer.c
  6. 2 0
      src/suffix.c
  7. 11 1
      src/tar.c

+ 1 - 0
configure.ac

@@ -250,6 +250,7 @@ TAR_COMPR_PROGRAM(lzip)
 TAR_COMPR_PROGRAM(lzma)
 TAR_COMPR_PROGRAM(lzop)
 TAR_COMPR_PROGRAM(xz)
+TAR_COMPR_PROGRAM(zstd)
 
 AC_MSG_CHECKING(for default archive format)
 

+ 1 - 0
doc/.gitignore

@@ -24,3 +24,4 @@ tar.tp
 tar.vr
 version.texi
 /parse-datetime.texi
+/rmt.8

+ 4 - 0
doc/tar.1

@@ -831,6 +831,10 @@ Filter the archive through
 \fB\-Z\fR, \fB\-\-compress\fR, \fB\-\-uncompress\fR
 Filter the archive through
 .BR compress (1).
+.TP
+\fB\-\-zstd\fR
+Filter the archive through
+.BR zstd (1).
 .SS Local file selection
 .TP
 \fB\-\-add\-file\fR=\fIFILE\fR

+ 21 - 8
doc/tar.texi

@@ -3713,6 +3713,9 @@ only attributes from the user namespace.
 @itemx -J
 Use @command{xz} for compressing or decompressing the archives.  @xref{gzip}.
 
+@item --zstd
+Use @command{zstd} for compressing or decompressing the archives.  @xref{gzip}.
+
 @end table
 
 @node Short Option Summary
@@ -9520,6 +9523,7 @@ switch to @samp{posix}.
 @cindex lzma
 @cindex lzop
 @cindex compress
+@cindex zstd
 @GNUTAR{} is able to create and read compressed archives.  It supports
 a wide variety of compression programs, namely: @command{gzip},
 @command{bzip2}, @command{lzip}, @command{lzma}, @command{lzop},
@@ -9530,14 +9534,21 @@ compression programs@footnote{It also had patent problems in the past.}.
 
 Creating a compressed archive is simple: you just specify a
 @dfn{compression option} along with the usual archive creation
-commands.  The compression option is @option{-z} (@option{--gzip}) to
-create a @command{gzip} compressed archive, @option{-j}
-(@option{--bzip2}) to create a @command{bzip2} compressed archive,
-@option{--lzip} to create an @asis{lzip} compressed archive,
-@option{-J} (@option{--xz}) to create an @asis{XZ} archive,
-@option{--lzma} to create an @asis{LZMA} compressed
-archive, @option{--lzop} to create an @asis{LZOP} archive, and
-@option{-Z} (@option{--compress}) to use @command{compress} program.
+commands.  Available compression options are summarized in the
+table below:
+
+@multitable @columnfractions 0.4 0.2 0.4
+@headitem Long            @tab Short       @tab Archive format
+@item @option{--gzip}     @tab @option{-z} @tab @command{gzip}
+@item @option{--bzip2}    @tab @option{-j} @tab @command{bzip2}
+@item @option{--xz}       @tab @option{-J} @tab @command{xz}
+@item @option{--lzip}     @tab             @tab @command{lzip}
+@item @option{--lzma}     @tab             @tab @command{lzma}
+@item @option{--lzop}     @tab             @tab @command{lzop}
+@item @option{--zstd}     @tab             @tab @command{zstd}
+@item @option{--compress} @tab @option{-Z} @tab @command{compress}
+@end multitable
+
 For example:
 
 @smallexample
@@ -9730,6 +9741,8 @@ suffix.  The following suffixes are recognized:
 @item @samp{.tlz} @tab @command{lzma}
 @item @samp{.lzo} @tab @command{lzop}
 @item @samp{.xz} @tab @command{xz}
+@item @samp{.zst} @tab @command{zstd}
+@item @samp{.tzst} @tab @command{zstd}
 @end multitable
 
 @anchor{use-compress-program}

+ 4 - 1
src/buffer.c

@@ -281,7 +281,8 @@ enum compress_type {
   ct_lzip,
   ct_lzma,
   ct_lzop,
-  ct_xz
+  ct_xz,
+  ct_zstd
 };
 
 static enum compress_type archive_compression_type = ct_none;
@@ -310,6 +311,7 @@ static struct zip_magic const magic[] = {
   { ct_lzma,     6, "\xFFLZMA" },
   { ct_lzop,     4, "\211LZO" },
   { ct_xz,       6, "\xFD" "7zXZ" },
+  { ct_zstd,     4, "\x28\xB5\x2F\xFD" },
 };
 
 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
@@ -325,6 +327,7 @@ static struct zip_program zip_program[] = {
   { ct_lzma,     XZ_PROGRAM,       "-J" },
   { ct_lzop,     LZOP_PROGRAM,     "--lzop" },
   { ct_xz,       XZ_PROGRAM,       "-J" },
+  { ct_zstd,     ZSTD_PROGRAM,     "--zstd" },
   { ct_none }
 };
 

+ 2 - 0
src/suffix.c

@@ -46,6 +46,8 @@ static struct compression_suffix compression_suffixes[] = {
   { S(lzo,  LZOP) },
   { S(xz,   XZ) },
   { S(txz,  XZ) }, /* Slackware */
+  { S(zst,  ZSTD) },
+  { S(tzst, ZSTD) },
   { NULL }
 #undef S
 #undef __CAT2__

+ 11 - 1
src/tar.c

@@ -348,7 +348,8 @@ enum
   WARNING_OPTION,
   XATTR_OPTION,
   XATTR_EXCLUDE,
-  XATTR_INCLUDE
+  XATTR_INCLUDE,
+  ZSTD_OPTION,
 };
 
 static char const doc[] = N_("\
@@ -682,6 +683,7 @@ static struct argp_option options[] = {
   {"lzma", LZMA_OPTION, 0, 0, NULL, GRID+1 },
   {"lzop", LZOP_OPTION, 0, 0, NULL, GRID+1 },
   {"xz", 'J', 0, 0, NULL, GRID+1 },
+  {"zstd", ZSTD_OPTION, 0, 0, NULL, GRID+1 },
 #undef GRID
 
 #define GRID 100
@@ -1129,6 +1131,10 @@ tar_help_filter (int key, const char *text, void *input)
       s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
       break;
 
+    case ZSTD_OPTION:
+      s = xasprintf (_("filter the archive through %s"), ZSTD_PROGRAM);
+      break;
+
     case ARGP_KEY_HELP_EXTRA:
       {
 	const char *tstr;
@@ -1650,6 +1656,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
       set_use_compress_program_option (COMPRESS_PROGRAM, args->loc);
       break;
 
+    case ZSTD_OPTION:
+      set_use_compress_program_option (ZSTD_PROGRAM, args->loc);
+      break;
+
     case ATIME_PRESERVE_OPTION:
       atime_preserve_option =
 	(arg