summaryrefslogtreecommitdiff
path: root/trees.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2015-09-05 12:08:28 -0700
committerJim Meyering <meyering@fb.com>2016-03-02 08:58:14 -0800
commitd6d48f427b4839352437be9688142f6733028d22 (patch)
treee8a5def9fa5a46898536bbfe61c430eeea39f93f /trees.c
parent9860eb784749f8588346850e693d7460e5be1601 (diff)
downloadgzip-d6d48f427b4839352437be9688142f6733028d22.tar.gz
gzip: support the --rsyncable option
* deflate.c: Include verify.h. (RSYNC_WIN, RSYNC_SUM_MATCH): Define. (rsync_sum, rsync_chunk_end): Declare file-scoped globals. (lm_init): Initialize globals. (fill_window): Update rsync_chunk_end. (rsync_roll): New function. (RSYNC_ROLL): New macro. (FLUSH_BLOCK): Update for new "pad" parameter. (deflate_fast): Use RSYNC_ROLL and flush/pad. (deflate): Likewise. * trees.c (flush_block): Add "pad" parameter. * gzip.c (rsync): New global. (RSYNCABLE_OPTION, longopts, help): Add the option. (main): Set the new global. * gzip.h (rsync): Declare new global. (flush_block): Update prototype. * doc/gzip.texi: Document it. * gzip.1: Likewise. * bootstrap.conf: Use verify module. * NEWS (New feature): Mention it. * Makefile.am (check-local): Add tests and use AM_V__* command- hiding opions. Reported against Debian here: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=118118
Diffstat (limited to 'trees.c')
-rw-r--r--trees.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/trees.c b/trees.c
index f314e57..025d5ba 100644
--- a/trees.c
+++ b/trees.c
@@ -856,9 +856,10 @@ local void send_all_trees(lcodes, dcodes, blcodes)
* trees or store, and output the encoded block to the zip file. This function
* returns the total compressed length for the file so far.
*/
-off_t flush_block(buf, stored_len, eof)
+off_t flush_block(buf, stored_len, pad, eof)
char *buf; /* input block, or NULL if too old */
ulg stored_len; /* length of input block */
+ int pad; /* pad output to byte boundary */
int eof; /* true if this is the last block for a file */
{
ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
@@ -951,6 +952,10 @@ off_t flush_block(buf, stored_len, eof)
Assert (input_len == bytes_in, "bad input size");
bi_windup();
compressed_len += 7; /* align on byte boundary */
+ } else if (pad && (compressed_len % 8) != 0) {
+ send_bits((STORED_BLOCK<<1)+eof, 3); /* send block type */
+ compressed_len = (compressed_len + 3 + 7) & ~7L;
+ copy_block(buf, 0, 1); /* with header */
}
return compressed_len >> 3;