diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2015-09-05 12:08:28 -0700 |
---|---|---|
committer | Jim Meyering <meyering@fb.com> | 2016-03-02 08:58:14 -0800 |
commit | d6d48f427b4839352437be9688142f6733028d22 (patch) | |
tree | e8a5def9fa5a46898536bbfe61c430eeea39f93f /trees.c | |
parent | 9860eb784749f8588346850e693d7460e5be1601 (diff) | |
download | gzip-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.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -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; |