components/pigz/patches/index.patch
author Michael Gerdts <mike.gerdts@oracle.com>
Thu, 21 Aug 2014 15:36:47 -0700
branchs11u2-sru
changeset 3431 7c34db1c2816
child 3687 778f019197ce
permissions -rw-r--r--
19612384 pigz needs parallel uncompress
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3431
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     1
# HG changeset patch
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     2
# User Michael Gerdts <[email protected]>
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     3
# Date 1412600364 25200
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     4
#      Mon Oct 06 05:59:24 2014 -0700
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     5
# Node ID ba834c48cee26e4c43976af8477dd34863b40f18
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     6
# Parent  1debb63439545fd0b30153eb68e884623d06c531
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     7
parallel uncompress - developed by Oracle
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     8
Offered to upstream at https://github.com/mgerdts/pigz
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
     9
 - Branch mt-uncompress-2.2 forked from https://github.com/madler/pigz v. 2.2.6
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    10
 - Branch mt-uncompress forked from https://github.com/madler/pigz branch master
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    11
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    12
diff -r 1debb6343954 -r ba834c48cee2 Makefile
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    13
--- a/Makefile
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    14
+++ b/Makefile
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    15
@@ -44,6 +44,15 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    16
 	  compress -f < pigz.c | ./unpigz | cmp - pigz.c ;\
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    17
 	fi
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    18
 	@rm -f pigz.c.gz pigz.c.zz pigz.c.zip
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    19
+	@rm -rf d/1 d/2
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    20
+	(mkdir -p d/1; cd d/1; tar xzf ../../../../pigz-2.2.5.tar.gz; \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    21
+	  cd ..; cp -pr 1 2; ../pigz -rp 4 --index %z 1; \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    22
+	  ../pigz -drp 4 --index %z 1; diff -r 1 2)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    23
+	@rm -rf d/1 d/2
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    24
+	(mkdir -p d/1; cd d/1; tar xzf ../../../../pigz-2.2.5.tar.gz; \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    25
+	  cd ..; cp -pr 1 2; ../pigz -zrp 4 -X %f.idx 1; \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    26
+	  ../pigz -dzrp 4 -X %f.idx 1; diff -r 1 2)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    27
+	@rm -rf d/1 d/2
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    28
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    29
 tests: dev test
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    30
 	./pigzn -kf pigz.c ; ./pigz -t pigz.c.gz
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    31
diff -r 1debb6343954 -r ba834c48cee2 pigz.1
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    32
--- a/pigz.1
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    33
+++ b/pigz.1
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    34
@@ -180,6 +180,14 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    35
 .B -V --version
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    36
 Show the version of pigz.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    37
 .TP
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    38
+.B -X --index file
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    39
+During compression, create an index that can be used for parallel
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    40
+decompression.  During decompression, use the specified index file for parallel
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    41
+decompression.  Each occurrence of %f and %z are replaced by the uncompressed
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    42
+and compressed file names, respectively.  If the index file is the same file as
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    43
+the compressed file, the index is written to or read from the end of the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    44
+compressed file.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    45
+.TP
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    46
 .B -z --zlib
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    47
 Compress to zlib (.zz) instead of gzip format.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    48
 .TP
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    49
diff -r 1debb6343954 -r ba834c48cee2 pigz.c
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    50
--- a/pigz.c
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    51
+++ b/pigz.c
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    52
@@ -191,13 +191,27 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    53
    effectiveness of deflating in a single thread.  This can be turned off using
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    54
    the --independent or -i option, so that the blocks can be decompressed
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    55
    independently for partial error recovery or for random access.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    56
-
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    57
-   Decompression can't be parallelized, at least not without specially prepared
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    58
-   deflate streams for that purpose.  As a result, pigz uses a single thread
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    59
-   (the main thread) for decompression, but will create three other threads for
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    60
-   reading, writing, and check calculation, which can speed up decompression
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    61
-   under some circumstances.  Parallel decompression can be turned off by
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    62
-   specifying one process (-dp 1 or -tp 1).
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    63
+   
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    64
+   The --index or -X option causes the generation of a block index which can be
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    65
+   used for parallel decompression.  The block index can be appended onto the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    66
+   compressed output or it may be stored in a separate file.  The uncompressed
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    67
+   size, compressed size, checksum of each block are stored in the index,
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    68
+   allowing future applications to perform random reads of the compressed file.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    69
+   Streams generated with -X are readable by legacy versions of pigz and gzip.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    70
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    71
+   Decompression can be parallelized, but only if a block index is available.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    72
+   If a block index is not present, pigz uses a single thread (the main thread)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    73
+   for decompression, but will create three other threads for reading, writing,
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    74
+   and check calculation, which can speed up decompression under some
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    75
+   circumstances.  Parallel decompression can be turned off by specifying one
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    76
+   process (-dp 1 or -tp 1).
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    77
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    78
+   If the block index is present, the main thread reads the input file and
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    79
+   dispatches each block to an uncompress thread.  The uncompress thread
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    80
+   uncompresses the block, verifies the block checksum, and passes the block
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    81
+   off to a writer thread.  The writer thread writes the blocks in order,
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    82
+   and combines the individual block checksums into a per-file checksum.  The
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    83
+   per-file checksum is compared to the checksum in the stream's trailer.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    84
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    85
    pigz requires zlib 1.2.1 or later to allow setting the dictionary when doing
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    86
    raw deflate.  Since zlib 1.2.3 corrects security vulnerabilities in zlib
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    87
@@ -259,13 +273,14 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    88
    can't get way ahead of the write thread and build up a large backlog of
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    89
    unwritten compressed data.  The write thread will write the compressed data,
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    90
    drop the output buffer, and then wait for the check value to be unlocked
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    91
-   by the compress thread.  Then the write thread combines the check value for
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    92
-   this chunk with the total check value for eventual use in the trailer.  If
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    93
-   this is not the last chunk, the write thread then goes back to look for the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    94
-   next output chunk in sequence.  After the last chunk, the write thread
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    95
-   returns and joins the main thread.  Unlike the compress threads, a new write
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    96
-   thread is launched for each input stream.  The write thread writes the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    97
-   appropriate header and trailer around the compressed data.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    98
+   by the compress thread.  Then the write thread writes an index entry (if -X)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
    99
+   and combines the check value for this chunk with the total check value for
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   100
+   eventual use in the trailer.  If this is not the last chunk, the write thread
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   101
+   then goes back to look for the next output chunk in sequence.  After the last
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   102
+   chunk, the write thread returns and joins the main thread.  Unlike the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   103
+   compress threads, a new write thread is launched for each input stream.  The
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   104
+   write thread writes the appropriate header and trailer around the compressed
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   105
+   data.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   106
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   107
    The input and output buffers are reused through their collection in pools.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   108
    Each buffer has a use count, which when decremented to zero returns the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   109
@@ -313,6 +328,9 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   110
 #if __STDC_VERSION__-0 >= 199901L || __GNUC__-0 >= 3
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   111
 #  include <inttypes.h> /* intmax_t */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   112
 #endif
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   113
+#include <stddef.h>     /* offsetof() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   114
+#include <sys/mman.h>   /* mmap() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   115
+#include <netinet/in.h> /* htonl() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   116
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   117
 #ifdef __hpux
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   118
 #  include <sys/param.h>
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   119
@@ -420,8 +438,10 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   120
 local char *prog;           /* name by which pigz was invoked */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   121
 local int ind;              /* input file descriptor */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   122
 local int outd;             /* output file descriptor */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   123
+local int idxd;             /* index file descriptor */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   124
 local char in[PATH_MAX+1];  /* input file name (accommodate recursion) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   125
 local char *out = NULL;     /* output file name (allocated if not NULL) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   126
+local char *index = NULL;   /* index file name template (may have %f, %z) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   127
 local int verbosity;        /* 0 = quiet, 1 = normal, 2 = verbose, 3 = trace */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   128
 local int headis;           /* 1 to store name, 2 to store date, 3 both */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   129
 local int pipeout;          /* write output to stdout even if file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   130
@@ -467,9 +487,12 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   131
     return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   132
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   133
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   134
+local void idx_abort(void);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   135
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   136
 /* exit with error, delete output file if in the middle of writing it */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   137
 local int bail(char *why, char *what)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   138
 {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   139
+    idx_abort();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   140
     if (outd != -1 && out != NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   141
         unlink(out);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   142
     complain("abort: %s%s", why, what);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   143
@@ -684,11 +707,23 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   144
     return dos;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   145
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   146
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   147
-/* put a 4-byte integer into a byte array in LSB order or MSB order */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   148
+/* put integers into a byte array in LSB order or MSB order */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   149
 #define PUT2L(a,b) (*(a)=(b)&0xff,(a)[1]=(b)>>8)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   150
 #define PUT4L(a,b) (PUT2L(a,(b)&0xffff),PUT2L((a)+2,(b)>>16))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   151
+#define PUT8L(a,b) (PUT4L(a,(b)&0xffffffff),PUT4L((a)+4,(b)>>32))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   152
 #define PUT4M(a,b) (*(a)=(b)>>24,(a)[1]=(b)>>16,(a)[2]=(b)>>8,(a)[3]=(b))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   153
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   154
+/* pull LSB order or MSB order integers from an unsigned char buffer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   155
+#define PULL2L(p) ((p)[0] + ((unsigned)((p)[1]) << 8))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   156
+#define PULL4L(p) (PULL2L(p) + ((unsigned long)(PULL2L((p) + 2)) << 16))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   157
+#define PULL8L(p) ((uint64_t)((p)[0]) | ((uint64_t)((p)[1]) << 8) | \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   158
+                   ((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) | \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   159
+                   ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) | \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   160
+                   ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   161
+#define PULL2M(p) (((unsigned)((p)[0]) << 8) + (p)[1])
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   162
+#define PULL4M(p) (((unsigned long)(PULL2M(p)) << 16) + PULL2M((p) + 2))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   163
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   164
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   165
 /* write a gzip, zlib, or zip header using the information in the globals */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   166
 local unsigned long put_header(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   167
 {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   168
@@ -982,7 +1017,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   169
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   170
 /* get a space from a pool -- the use count is initially set to one, so there
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   171
    is no need to call use_space() for the first use */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   172
-local struct space *get_space(struct pool *pool)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   173
+local struct space *get_space_size(struct pool *pool, size_t size)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   174
 {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   175
     struct space *space;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   176
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   177
@@ -995,6 +1030,15 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   178
     if (pool->head != NULL) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   179
         space = pool->head;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   180
         possess(space->use);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   181
+        /* If there's not enough space, free and malloc rather than realloc to
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   182
+           avoid the potential of an unnecessary memory copy. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   183
+        if (space->size < size) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   184
+            free(space->buf);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   185
+            space->buf = malloc(size);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   186
+            if (space->buf == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   187
+                bail("not enough memory", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   188
+            space->size = size;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   189
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   190
         pool->head = space->next;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   191
         twist(pool->have, BY, -1);      /* one less in pool */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   192
         twist(space->use, TO, 1);       /* initially one user */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   193
@@ -1012,15 +1056,20 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   194
     if (space == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   195
         bail("not enough memory", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   196
     space->use = new_lock(1);           /* initially one user */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   197
-    space->buf = malloc(pool->size);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   198
+    space->buf = malloc(size);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   199
     if (space->buf == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   200
         bail("not enough memory", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   201
-    space->size = pool->size;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   202
+    space->size = size;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   203
     space->len = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   204
     space->pool = pool;                 /* remember the pool this belongs to */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   205
     return space;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   206
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   207
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   208
+local struct space *get_space(struct pool *pool)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   209
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   210
+    return get_space_size(pool, pool->size);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   211
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   212
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   213
 /* compute next size up by multiplying by about 2**(1/3) and round to the next
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   214
    power of 2 if we're close (so three applications results in doubling) -- if
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   215
    small, go up to at least 16, if overflow, go to max size_t value */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   216
@@ -1109,17 +1158,35 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   217
     return count;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   218
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   219
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   220
+/* prompt for permission to overwrite a file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   221
+local int allow_overwrite(const char *path)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   222
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   223
+    char ch;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   224
+    int reply = -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   225
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   226
+    fprintf(stderr, "%s exists -- overwrite (y/n)? ", path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   227
+    fflush(stderr);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   228
+    do {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   229
+        ch = getchar();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   230
+        if (reply < 0 && ch != ' ' && ch != '\t')
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   231
+            reply = ch == 'y' || ch == 'Y' ? 1 : 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   232
+    } while (ch != EOF && ch != '\n' && ch != '\r');
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   233
+    return reply;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   234
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   235
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   236
 /* input and output buffer pools */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   237
 local struct pool in_pool;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   238
 local struct pool out_pool;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   239
 local struct pool dict_pool;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   240
 local struct pool lens_pool;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   241
+local struct pool idx_pool;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   242
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   243
 /* -- parallel compression -- */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   244
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   245
 /* compress or write job (passed from compress list to write list) -- if seq is
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   246
    equal to -1, compress_thread is instructed to return; if more is false then
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   247
-   this is the last chunk, which after writing tells write_thread to return */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   248
+   this is the last chunk, which after writing tells compress_write_thread to
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   249
+   return */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   250
 struct job {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   251
     long seq;                   /* sequence number */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   252
     int more;                   /* true if this is not the last chunk */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   253
@@ -1166,6 +1233,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   254
     new_pool(&out_pool, OUTPOOL(size), -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   255
     new_pool(&dict_pool, DICT, -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   256
     new_pool(&lens_pool, size >> (RSYNCBITS - 1), -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   257
+    new_pool(&idx_pool, 1, -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   258
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   259
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   260
 /* command the compress threads to all return, then join them all (call from
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   261
@@ -1202,6 +1270,8 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   262
     Trace(("-- freed %d output buffers", caught));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   263
     caught = free_pool(&in_pool);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   264
     Trace(("-- freed %d input buffers", caught));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   265
+    caught = free_pool(&idx_pool);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   266
+    Trace(("-- freed %d index buffers", caught));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   267
     free_lock(write_first);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   268
     free_lock(compress_have);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   269
     compress_have = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   270
@@ -1395,18 +1465,483 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   271
     (void)deflateEnd(&strm);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   272
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   273
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   274
+/* Block Index
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   275
+  
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   276
+   The block index is an array of idx_entry structs followed by an idx_trailer
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   277
+   struct.  They are written to the file in LSB order.  The block index can
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   278
+   exist as a standalone file or be appended onto the compressed files.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   279
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   280
+   The trailer is used to identify a block index.  The beginning of the trailer
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   281
+   contains a magic number that is a value too large to be confused with a valid
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   282
+   block length.  Aside from backwards P's the magic number looks kinda like
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   283
+   "0xf pigzip 0xf". */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   284
+#define IDXMAGIC 0xf916219f
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   285
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   286
+struct idx_trailer {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   287
+    uint32_t    magic;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   288
+    uint64_t    count;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   289
+};
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   290
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   291
+struct idx_entry {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   292
+    uint32_t    infsz;          /* inflated size of the block */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   293
+    uint32_t    defsz;          /* deflated size of the block */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   294
+    uint32_t    check;          /* adler32 or crc32 checksum of the block */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   295
+};
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   296
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   297
+local struct {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   298
+    int             valid;      /* Do the rest of these fields mean anything? */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   299
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   300
+    /* An array of entries.  References address in space or map */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   301
+    struct idx_entry *ents;     /* not in right byte order, used for offset */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   302
+    uint64_t        seq;        /* current entry */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   303
+    int64_t         eof;        /* has the last entry been retrieved? */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   304
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   305
+    /* When compressing and appending, entries are stored in space->buf.  */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   306
+    int             append;     /* is the index at end of compressed file? */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   307
+    struct space    *space;     /* space for storage of index */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   308
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   309
+    /* The following are valid only when mmap is used. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   310
+    uchar_t         *map;       /* mmap'd region containing ents */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   311
+    size_t          mapsz;      /* size of mmap'd region at map */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   312
+    off_t           mapoff;     /* bytes between map and ents */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   313
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   314
+    /* Index path, after %f and %z are replaced. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   315
+    char            path[PATH_MAX+1];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   316
+} idx;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   317
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   318
+/* determines if the two paths refer to the same extant file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   319
+local int same_file(const char *f1, const char *f2)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   320
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   321
+    struct stat s1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   322
+    struct stat s2;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   323
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   324
+    return (stat(f1, &s1) == 0 && stat(f2, &s2) == 0 &&
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   325
+            s1.st_dev == s2.st_dev && s1.st_ino == s2.st_ino);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   326
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   327
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   328
+/* Remove the index file, but only if it is not the same as in or out.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   329
+   We don't worry about a full cleanup, as this should only be called in an
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   330
+   error path just before exiting. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   331
+local void idx_abort(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   332
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   333
+    if (!idx.valid)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   334
+        return;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   335
+    if (idx.path[0] == '\0' || idx.append)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   336
+        return;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   337
+    (void) unlink(idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   338
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   339
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   340
+/* If 0 is returned, a trailer was found and read.  Non-zero return means
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   341
+   there was no trailer. Does not exit. Does not change file pointer for fd. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   342
+local int idx_read_trailer(int fd, char *path, struct idx_trailer *trail)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   343
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   344
+    uchar_t buf[sizeof(*trail)];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   345
+    off_t off;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   346
+    struct stat st;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   347
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   348
+    if (fd < 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   349
+        Trace(("%s: index file descriptor %d not valid", path, fd));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   350
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   351
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   352
+    if (fstat(fd, &st) != 0 || !S_ISREG(st.st_mode)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   353
+        Trace(("%s: index appended to non-regular file", path));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   354
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   355
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   356
+    off = st.st_size - sizeof(*trail);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   357
+    if (off < 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   358
+        Trace(("%s: index file too short for header", path));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   359
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   360
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   361
+    if (pread(fd, buf, sizeof(buf), off) != sizeof(buf)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   362
+        Trace(("%s: unable to read index trailer", path));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   363
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   364
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   365
+    trail->magic = PULL4L(buf);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   366
+    trail->count = PULL8L(buf + 4);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   367
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   368
+    if (trail->magic != IDXMAGIC) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   369
+        Trace(("%s: invalid pigz index magic", path));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   370
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   371
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   372
+    return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   373
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   374
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   375
+/* Expand a path pattern containing %f and/or %z tokens into a full path.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   376
+ * Result is stored in idx.path. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   377
+local int expand_pathpat(char *pathpat)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   378
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   379
+    char *copy = NULL;              /* points to in or out global */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   380
+    char *suf = NULL;               /* suffix (.zz, .gz, etc.) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   381
+    int chop_suffix;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   382
+    int len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   383
+    int i;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   384
+    int j;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   385
+    int nag;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   386
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   387
+    /* Be quiet when opportunistic index use check is being done. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   388
+    nag = ((index == NULL) && strcmp(pathpat, "%z"));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   389
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   390
+    for (i = 0, j = 0; pathpat[i] && j < sizeof(idx.path); i++) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   391
+        if (pathpat[i] != '%') {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   392
+            idx.path[j++] = pathpat[i];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   393
+            continue;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   394
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   395
+        i++;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   396
+        switch (pathpat[i]) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   397
+        case '%':               /* %% is replaced by % */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   398
+            idx.path[j++] = '%';
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   399
+            continue;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   400
+        case 'f':               /* %f is replaced by uncompressed file name */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   401
+            if (decode) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   402
+                if (strcmp(out, "<stdout>") != 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   403
+                    copy = out;                     /* uncompressed file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   404
+                    chop_suffix = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   405
+                    break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   406
+                }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   407
+                if (strcmp(in, "<stdin>") != 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   408
+                    copy = in;                      /* compressed file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   409
+                    chop_suffix = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   410
+                    suf = strrchr(in, '.');
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   411
+                    break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   412
+                }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   413
+                if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   414
+                    complain("file name for %%f unknown");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   415
+                return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   416
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   417
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   418
+            if (strcmp(out, "<stdout>") != 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   419
+                copy = out;                         /* compressed file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   420
+                chop_suffix = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   421
+                suf = strrchr(out, '.');
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   422
+                break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   423
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   424
+            if (strcmp(in, "<stdin>") != 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   425
+                copy = in;                          /* uncompressed file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   426
+                chop_suffix = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   427
+                break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   428
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   429
+            if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   430
+                complain("file name for %%f unknown");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   431
+            return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   432
+        case 'z':               /* %z is replaced by compressed file name */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   433
+            chop_suffix = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   434
+            if (decode) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   435
+                if (strcmp(in, "<stdin>") == 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   436
+                    if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   437
+                        complain("file name for %%z unknown");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   438
+                    return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   439
+                }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   440
+                copy = in;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   441
+                break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   442
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   443
+            if (strcmp(pathpat, "%z") == 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   444
+                /* index will be appended onto stdout */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   445
+                copy = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   446
+                idx.append = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   447
+                break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   448
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   449
+            if (strcmp(out, "<stdout>") == 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   450
+                if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   451
+                    complain("file name for %%z unknown");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   452
+                return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   453
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   454
+            copy = out;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   455
+            break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   456
+        default:
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   457
+            if (nag) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   458
+                complain("invalid %% sequence in index file pattern %s",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   459
+                         pathpat);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   460
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   461
+            return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   462
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   463
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   464
+        /* pathpat is "%z" and out is stdout */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   465
+        if (copy == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   466
+            break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   467
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   468
+        len = strlen(&idx.path[j]) + strlen(copy);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   469
+        if (chop_suffix)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   470
+            len -= strlen(suf);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   471
+        if (len >= (sizeof(idx.path) - j)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   472
+            if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   473
+                complain("index file name too long");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   474
+            return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   475
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   476
+        (void)strncpy(&idx.path[j], copy, sizeof(idx.path) - j);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   477
+        j += len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   478
+        assert(j <= sizeof(idx.path));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   479
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   480
+    if (j == sizeof(idx.path)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   481
+        idx.path[j-1] = '\0';
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   482
+        if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   483
+            complain("index file \"%s...\" name too long", idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   484
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   485
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   486
+    idx.path[j] = '\0';
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   487
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   488
+    if (copy == NULL && idx.append) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   489
+            (void)strncpy(idx.path, out, sizeof(idx.path));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   490
+            idx.path[sizeof(idx.path) - 1] = '\0';
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   491
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   492
+    else {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   493
+        if (same_file(decode ? out : in, idx.path)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   494
+            if (nag)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   495
+                complain("index file %s must not be same as uncompressed file",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   496
+                        idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   497
+            return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   498
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   499
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   500
+        idx.append = same_file(decode ? in : out, idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   501
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   502
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   503
+    if (verbosity > 1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   504
+        (void) fprintf(stderr, "index %s ", idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   505
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   506
+    return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   507
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   508
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   509
+/* open the index file associated with the current input or output file. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   510
+local int idx_open(char *pathpat)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   511
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   512
+    int ret;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   513
+    struct stat st;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   514
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   515
+    assert(pathpat != NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   516
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   517
+    memset(&idx, 0, sizeof(idx));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   518
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   519
+    setup_jobs();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   520
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   521
+    idxd = -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   522
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   523
+    if (expand_pathpat(pathpat) != 0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   524
+        return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   525
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   526
+    if (decode) {                               /* Uncompress */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   527
+        int64_t sz;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   528
+        int64_t off;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   529
+        long pagesize;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   530
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   531
+        /* Position idxd at the first index record to read. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   532
+        if (idx.append) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   533
+            struct idx_trailer trail;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   534
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   535
+            /* uncompressing, index at end of compressed file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   536
+            if (idx_read_trailer(ind, in, &trail) != 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   537
+                complain("%s: could not read index", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   538
+                return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   539
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   540
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   541
+            idxd = dup(ind);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   542
+            if (fstat(idxd, &st) != 0 || !S_ISREG(st.st_mode)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   543
+                complain("%s: index appended to non-regular file", idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   544
+                (void) close(idxd);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   545
+                return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   546
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   547
+            off = st.st_size - sizeof(trail);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   548
+            sz = trail.count * sizeof(struct idx_entry);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   549
+            off -= sz;          /* offset into file of first idx_entry */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   550
+        } else {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   551
+            /* Uncompressing, index in a different file. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   552
+            if ((idxd = open(idx.path, O_RDONLY)) < 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   553
+                complain("%s: unable to open index file", idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   554
+                return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   555
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   556
+            if (fstat(idxd, &st) != 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   557
+                complain("%s: unable to stat index file", idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   558
+                (void) close(idxd);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   559
+                return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   560
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   561
+            off = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   562
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   563
+        /* Try to mmap the index file and let the OS manage the space used by
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   564
+           the index entries.  The starting offset of must be a multiple of the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   565
+           page size.  The mapping will end at the end of the file. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   566
+        if ((pagesize = sysconf(_SC_PAGESIZE)) > 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   567
+            off_t moff;                     /* mmap offset in idxd */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   568
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   569
+            /* moff is the beginning of the page containing off */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   570
+            moff = off & ~(pagesize -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   571
+            idx.mapsz = st.st_size - moff;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   572
+            idx.map = mmap(NULL, idx.mapsz, PROT_READ, MAP_PRIVATE, idxd, moff);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   573
+            if (idx.map != MAP_FAILED) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   574
+                (void)close(idxd);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   575
+                idxd = -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   576
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   577
+                /* set up array for idx_get() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   578
+                idx.ents = (struct idx_entry*)(idx.map + (off & (pagesize -1)));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   579
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   580
+                idx.valid = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   581
+                return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   582
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   583
+            idx.mapsz = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   584
+            idx.map = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   585
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   586
+        /* unable to mmap.  Ensure idxfd is positioned properly. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   587
+        if (lseek(idxd, off, SEEK_SET) != off) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   588
+            complain("%s: unable to seek on index file", idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   589
+            return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   590
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   591
+        idx.valid = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   592
+        return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   593
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   594
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   595
+    /* compress - entries will be added to idx.space or idxd. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   596
+    if (idx.append) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   597
+        idx.space = get_space(&idx_pool);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   598
+        idx.valid = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   599
+        return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   600
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   601
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   602
+    idxd = open(idx.path, O_WRONLY | O_CREAT | O_TRUNC | (force ? 0 : O_EXCL),
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   603
+                0600);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   604
+    if (idxd < 0 && errno == EEXIST && isatty(0) && verbosity &&
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   605
+            allow_overwrite(idx.path)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   606
+        idxd = open(idx.path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   607
+        if (idxd == -1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   608
+            complain("%s: %s", idx.path, strerror(errno));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   609
+            return -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   610
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   611
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   612
+    idx.valid = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   613
+    return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   614
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   615
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   616
+local void idx_get_next(struct idx_entry *entry)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   617
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   618
+    uchar_t buf[sizeof(*entry)];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   619
+    uchar_t *base;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   620
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   621
+    if (idx.ents != NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   622
+        base = (uchar_t *)&idx.ents[idx.seq];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   623
+    else {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   624
+        readn(idxd, buf, sizeof(buf));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   625
+        base = buf;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   626
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   627
+    entry->infsz = PULL4L(base);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   628
+    entry->defsz = PULL4L(base + 4);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   629
+    entry->check = PULL4L(base + 8);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   630
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   631
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   632
+/* Returns the fields of the next index entry. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   633
+local void idx_get(uint64_t *inflated, uint64_t *deflated, uint64_t *check,
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   634
+                   int *last)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   635
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   636
+    struct idx_trailer *t;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   637
+    static struct idx_entry entry;        /* value from previous call */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   638
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   639
+    assert(!idx.eof);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   640
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   641
+    if (idx.seq == 0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   642
+        idx_get_next(&entry);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   643
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   644
+    *inflated = entry.infsz;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   645
+    *deflated = entry.defsz;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   646
+    *check = entry.check;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   647
+    idx.seq++;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   648
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   649
+    /* Look for trailer after this.  Value retained for next call. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   650
+    idx_get_next(&entry);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   651
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   652
+    t = (struct idx_trailer *)&entry;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   653
+    *last = (t->magic == IDXMAGIC);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   654
+    idx.eof = *last;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   655
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   656
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   657
+local void idx_add(size_t insz, size_t outsz, unsigned long check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   658
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   659
+    uchar_t buf[sizeof(struct idx_entry)];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   660
+    uchar_t *start;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   661
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   662
+    idx.seq++;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   663
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   664
+    /* point start at the right buffer, ensuring it is big enough */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   665
+    if (idxd != -1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   666
+        start = buf;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   667
+    } else {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   668
+        possess(idx.space->use);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   669
+        while (idx.space->size - idx.space->len < sizeof(struct idx_entry))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   670
+            grow_space(idx.space);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   671
+        start = idx.space->buf + idx.space->len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   672
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   673
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   674
+    /* copy data into buffer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   675
+    PUT4L(start, (uint32_t)insz);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   676
+    PUT4L(start + 4, (uint32_t)outsz);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   677
+    PUT4L(start + 8, (uint32_t)check);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   678
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   679
+    if (idxd != -1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   680
+        writen(idxd, buf, sizeof(buf));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   681
+    else {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   682
+        idx.space->len += sizeof(struct idx_entry);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   683
+        release(idx.space->use);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   684
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   685
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   686
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   687
+local void idx_close(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   688
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   689
+    uchar_t buf[sizeof(struct idx_trailer)];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   690
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   691
+    assert(idx.valid);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   692
+    idx.valid = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   693
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   694
+    if (decode && !keep && !idx.append)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   695
+        (void)unlink(idx.path);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   696
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   697
+    if (idx.map != NULL) {           /* uncompressing, using mmap'd index */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   698
+        (void)munmap(idx.map, idx.mapsz);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   699
+        idx.ents = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   700
+        return;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   701
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   702
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   703
+    if (decode) {                   /* uncompressing, from a file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   704
+        (void)close(idxd);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   705
+        idxd = -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   706
+        return;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   707
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   708
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   709
+    if (idx.space != NULL) {        /* compressing, append to output file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   710
+        writen(outd, idx.space->buf, idx.space->len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   711
+        release(idx.space->use);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   712
+        drop_space(idx.space);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   713
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   714
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   715
+    PUT4L(buf, IDXMAGIC);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   716
+    PUT8L(buf + 4, idx.seq);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   717
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   718
+    writen(idx.append ? outd : idxd, buf, sizeof(buf));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   719
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   720
+    if (idxd != -1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   721
+        (void) close(idxd);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   722
+        idxd = -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   723
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   724
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   725
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   726
+/* Does the compressed input file have an index appended? */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   727
+local int ind_has_index(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   728
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   729
+    struct idx_trailer trail;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   730
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   731
+    /* Not relevant unless we are uncompressing */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   732
+    if (decode == 0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   733
+        return (0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   734
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   735
+    return (idx_read_trailer(ind, in, &trail) == 0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   736
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   737
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   738
 /* collect the write jobs off of the list in sequence order and write out the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   739
    compressed data until the last chunk is written -- also write the header and
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   740
    trailer and combine the individual check values of the input buffers */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   741
-local void write_thread(void *dummy)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   742
+local void compress_write_thread(void *dummy)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   743
 {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   744
     long seq;                       /* next sequence number looking for */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   745
     struct job *job;                /* job pulled and working on */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   746
     size_t len;                     /* input length */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   747
+    size_t olen;                    /* output length */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   748
     int more;                       /* true if more chunks to write */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   749
     unsigned long head;             /* header length */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   750
     unsigned long ulen;             /* total uncompressed size (overflow ok) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   751
-    unsigned long clen;             /* total compressed size (overflow ok) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   752
+    size_t clen;                    /* total compressed size */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   753
     unsigned long check;            /* check value of uncompressed data */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   754
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   755
     (void)dummy;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   756
@@ -1430,23 +1965,27 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   757
         /* update lengths, save uncompressed length for COMB */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   758
         more = job->more;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   759
         len = job->in->len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   760
+        olen = job->out->len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   761
         drop_space(job->in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   762
         ulen += (unsigned long)len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   763
-        clen += (unsigned long)(job->out->len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   764
+        clen += olen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   765
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   766
         /* write the compressed data and drop the output buffer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   767
         Trace(("-- writing #%ld", seq));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   768
-        writen(outd, job->out->buf, job->out->len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   769
+        writen(outd, job->out->buf, olen);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   770
         drop_space(job->out);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   771
         Trace(("-- wrote #%ld%s", seq, more ? "" : " (last)"));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   772
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   773
-        /* wait for check calculation to complete, then combine, once
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   774
-           the compress thread is done with the input, release it */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   775
+        /* wait for check calculation to complete, then combine */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   776
         possess(job->calc);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   777
         wait_for(job->calc, TO_BE, 1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   778
         release(job->calc);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   779
         check = COMB(check, job->check, len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   780
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   781
+        /* update the block index */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   782
+        if (index)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   783
+            idx_add(len, olen, job->check);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   784
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   785
         /* free the job */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   786
         free_lock(job->calc);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   787
         free(job);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   788
@@ -1517,7 +2056,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   789
     setup_jobs();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   790
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   791
     /* start write thread */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   792
-    writeth = launch(write_thread, NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   793
+    writeth = launch(compress_write_thread, NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   794
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   795
     /* read from input and start compress threads (write thread will pick up
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   796
      the output of the compress threads) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   797
@@ -1913,7 +2452,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   798
 #ifndef NOTHREAD
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   799
     /* if first time in or procs == 1, read a buffer to have something to
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   800
        return, otherwise wait for the previous read job to complete */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   801
-    if (procs > 1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   802
+    if (procs > 1 && index == NULL && !ind_has_index()) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   803
         /* if first time, fire up the read thread, ask for a read */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   804
         if (in_which == -1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   805
             in_which = 1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   806
@@ -1995,12 +2534,6 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   807
         in_next += togo; \
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   808
     } while (0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   809
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   810
-/* pull LSB order or MSB order integers from an unsigned char buffer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   811
-#define PULL2L(p) ((p)[0] + ((unsigned)((p)[1]) << 8))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   812
-#define PULL4L(p) (PULL2L(p) + ((unsigned long)(PULL2L((p) + 2)) << 16))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   813
-#define PULL2M(p) (((unsigned)((p)[0]) << 8) + (p)[1])
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   814
-#define PULL4M(p) (((unsigned long)(PULL2M(p)) << 16) + PULL2M((p) + 2))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   815
-
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   816
 /* convert MS-DOS date and time to a Unix time, assuming current timezone
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   817
    (you got a better idea?) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   818
 local time_t dos2time(unsigned long dos)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   819
@@ -2613,6 +3146,73 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   820
     return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   821
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   822
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   823
+local void check_trailer(unsigned long check, off_t clen)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   824
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   825
+    unsigned tmp2;              /* used by GET4() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   826
+    unsigned long tmp4;         /* used by GET4() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   827
+    unsigned long len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   828
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   829
+    /* read and check trailer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   830
+    if (form > 1) {             /* zip local trailer (if any) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   831
+        if (form == 3) {        /* data descriptor follows */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   832
+            /* read original version of data descriptor */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   833
+            zip_crc = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   834
+            zip_clen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   835
+            zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   836
+            if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   837
+                bail("corrupted zip entry -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   838
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   839
+            /* if crc doesn't match, try info-zip variant with sig */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   840
+            if (zip_crc != out_check) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   841
+                if (zip_crc != 0x08074b50UL || zip_clen != out_check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   842
+                    bail("corrupted zip entry -- crc32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   843
+                zip_crc = zip_clen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   844
+                zip_clen = zip_ulen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   845
+                zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   846
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   847
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   848
+            /* handle incredibly rare cases where crc equals signature */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   849
+            else if (zip_crc == 0x08074b50UL && zip_clen == zip_crc &&
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   850
+              ((clen & LOW32) != zip_crc || zip_ulen == zip_crc)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   851
+                zip_crc = zip_clen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   852
+                zip_clen = zip_ulen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   853
+                zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   854
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   855
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   856
+            /* if second length doesn't match, try 64-bit lengths */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   857
+            if (zip_ulen != (out_tot & LOW32)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   858
+                zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   859
+                (void)GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   860
+            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   861
+            if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   862
+                bail("corrupted zip entry -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   863
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   864
+        if (zip_clen != (clen & LOW32) || zip_ulen != (out_tot & LOW32))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   865
+            bail("corrupted zip entry -- length mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   866
+        check = zip_crc;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   867
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   868
+    else if (form == 1) {       /* zlib (big-endian) trailer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   869
+        check = (unsigned long)(GET()) << 24;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   870
+        check += (unsigned long)(GET()) << 16;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   871
+        check += (unsigned)(GET()) << 8;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   872
+        check += GET();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   873
+        if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   874
+            bail("corrupted zlib stream -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   875
+        if (check != out_check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   876
+            bail("corrupted zlib stream -- adler32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   877
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   878
+    else {                      /* gzip trailer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   879
+        check = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   880
+        len = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   881
+        if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   882
+            bail("corrupted gzip stream -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   883
+        if (check != out_check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   884
+            bail("corrupted gzip stream -- crc32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   885
+        if (len != (out_tot & LOW32))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   886
+            bail("corrupted gzip stream -- length mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   887
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   888
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   889
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   890
 /* inflate for decompression or testing -- decompress from ind to outd unless
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   891
    decode != 1, in which case just test ind, and then also list if list != 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   892
    look for and decode multiple, concatenated gzip and/or zlib streams;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   893
@@ -2620,10 +3220,8 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   894
 local void infchk(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   895
 {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   896
     int ret, cont;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   897
-    unsigned long check, len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   898
+    unsigned long check;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   899
     z_stream strm;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   900
-    unsigned tmp2;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   901
-    unsigned long tmp4;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   902
     off_t clen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   903
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   904
     cont = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   905
@@ -2653,65 +3251,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   906
         /* compute compressed data length */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   907
         clen = in_tot - in_left;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   908
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   909
-        /* read and check trailer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   910
-        if (form > 1) {             /* zip local trailer (if any) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   911
-            if (form == 3) {        /* data descriptor follows */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   912
-                /* read original version of data descriptor */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   913
-                zip_crc = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   914
-                zip_clen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   915
-                zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   916
-                if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   917
-                    bail("corrupted zip entry -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   918
-
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   919
-                /* if crc doesn't match, try info-zip variant with sig */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   920
-                if (zip_crc != out_check) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   921
-                    if (zip_crc != 0x08074b50UL || zip_clen != out_check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   922
-                        bail("corrupted zip entry -- crc32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   923
-                    zip_crc = zip_clen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   924
-                    zip_clen = zip_ulen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   925
-                    zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   926
-                }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   927
-
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   928
-                /* handle incredibly rare cases where crc equals signature */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   929
-                else if (zip_crc == 0x08074b50UL && zip_clen == zip_crc &&
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   930
-                         ((clen & LOW32) != zip_crc || zip_ulen == zip_crc)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   931
-                    zip_crc = zip_clen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   932
-                    zip_clen = zip_ulen;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   933
-                    zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   934
-                }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   935
-
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   936
-                /* if second length doesn't match, try 64-bit lengths */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   937
-                if (zip_ulen != (out_tot & LOW32)) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   938
-                    zip_ulen = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   939
-                    (void)GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   940
-                }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   941
-                if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   942
-                    bail("corrupted zip entry -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   943
-            }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   944
-            if (zip_clen != (clen & LOW32) || zip_ulen != (out_tot & LOW32))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   945
-                bail("corrupted zip entry -- length mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   946
-            check = zip_crc;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   947
-        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   948
-        else if (form == 1) {       /* zlib (big-endian) trailer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   949
-            check = (unsigned long)(GET()) << 24;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   950
-            check += (unsigned long)(GET()) << 16;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   951
-            check += (unsigned)(GET()) << 8;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   952
-            check += GET();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   953
-            if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   954
-                bail("corrupted zlib stream -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   955
-            if (check != out_check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   956
-                bail("corrupted zlib stream -- adler32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   957
-        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   958
-        else {                      /* gzip trailer */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   959
-            check = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   960
-            len = GET4();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   961
-            if (in_eof)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   962
-                bail("corrupted gzip stream -- missing trailer: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   963
-            if (check != out_check)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   964
-                bail("corrupted gzip stream -- crc32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   965
-            if (len != (out_tot & LOW32))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   966
-                bail("corrupted gzip stream -- length mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   967
-        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   968
+        check_trailer(check, clen);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   969
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   970
         /* show file information if requested */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   971
         if (list) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   972
@@ -2731,6 +3271,231 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   973
         complain("%s OK, has trailing junk which was ignored", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   974
 }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   975
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   976
+local void uncompress_write_thread(void *dummy)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   977
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   978
+    long seq;                       /* next sequence number looking for */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   979
+    struct job *job;                /* job pulled and working on */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   980
+    int more;                       /* true if more chunks to write */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   981
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   982
+    (void)dummy;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   983
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   984
+    seq = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   985
+    do {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   986
+        /* get next write job in order */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   987
+        possess(write_first);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   988
+        wait_for(write_first, TO_BE, seq);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   989
+        job = write_head;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   990
+        write_head = job->next;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   991
+        twist(write_first, TO, write_head == NULL ? -1 : write_head->seq);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   992
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   993
+        /* Checksum has been verified.  Accumulate the checksum, write the
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   994
+           output, and free the input and output spaces.  While the input space
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   995
+           could be dropped earlier, it is done here to ensure the write queue
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   996
+           doesn't grow without bounds. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   997
+        out_check = COMB(out_check, job->check, job->out->len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   998
+        out_tot += job->out->len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
   999
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1000
+        Trace(("-- writing #%ld", seq));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1001
+        if (decode == 1)            /* don't really write if just checking */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1002
+            writen(outd, job->out->buf, job->out->len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1003
+        drop_space(job->in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1004
+        drop_space(job->out);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1005
+        Trace(("-- wrote #%ld%s", seq, job->more ? "" : " (last)"));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1006
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1007
+        more = job->more;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1008
+        free(job);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1009
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1010
+        seq++;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1011
+    } while (more);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1012
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1013
+    /* verify no more jobs, prepare for next use */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1014
+    possess(compress_have);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1015
+    assert(compress_head == NULL && peek_lock(compress_have) == 0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1016
+    release(compress_have);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1017
+    possess(write_first);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1018
+    assert(write_head == NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1019
+    twist(write_first, TO, -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1020
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1021
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1022
+local void uncompress_thread(void *dummy)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1023
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1024
+    struct job *job;                /* job pulled and working on */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1025
+    struct job *here, **prior;      /* pointers for inserting in write list */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1026
+    unsigned long check;            /* check value of output */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1027
+    z_stream strm;                  /* deflate stream */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1028
+    int err;                        /* error from inflate() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1029
+    long firstcheck;                /* the initial checksum value */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1030
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1031
+    (void)dummy;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1032
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1033
+    strm.zfree = Z_NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1034
+    strm.zalloc = Z_NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1035
+    strm.opaque = Z_NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1036
+    if (inflateInit2(&strm, -15) != Z_OK)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1037
+        bail("not enough memory", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1038
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1039
+    firstcheck = CHECK(0, Z_NULL, 0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1040
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1041
+    /* keep looking for work */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1042
+    for (;;) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1043
+        possess(compress_have);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1044
+        wait_for(compress_have, NOT_TO_BE, 0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1045
+        job = compress_head;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1046
+        assert(job != NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1047
+        if (job->seq == -1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1048
+            break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1049
+        compress_head = job->next;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1050
+        if (job->next == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1051
+            compress_tail = &compress_head;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1052
+        twist(compress_have, BY, -1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1053
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1054
+        /* got a job -- buffers have all been allocated to the right size.
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1055
+           deflate and verify the checksum. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1056
+        Trace(("-- uncompressing #%ld", job->seq));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1057
+        if (inflateReset2(&strm, -15) != Z_OK)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1058
+            bail("stream reset failed: ", strm.msg);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1059
+        strm.next_in = job->in->buf;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1060
+        strm.avail_in = job->in->len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1061
+        strm.next_out = job->out->buf;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1062
+        strm.avail_out = job->out->len;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1063
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1064
+        err = inflate(&strm, Z_SYNC_FLUSH);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1065
+        if (err != Z_OK && err != Z_STREAM_END)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1066
+            bail("corrupted input -- invalid deflate data: ", strm.msg);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1067
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1068
+        /* It's not strictly necessary to verify the checksum here, but it
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1069
+           seems nice to get an error about a bad checksum as early as possible
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1070
+           to wasteful cpu and i/o consumtion. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1071
+        check = CHECK(firstcheck, job->out->buf, job->out->len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1072
+        if (check != job->check) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1073
+            if (form == 1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1074
+                bail("corrupted zlib stream -- adler32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1075
+            else
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1076
+                bail("corrupted gzip stream -- crc32 mismatch: ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1077
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1078
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1079
+        Trace(("-- uncompressed #%ld%s", job->seq, job->more ? "" : " (last)"));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1080
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1081
+        /* insert write job in list in sorted order, alert write thread */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1082
+        possess(write_first);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1083
+        prior = &write_head;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1084
+        while ((here = *prior) != NULL) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1085
+            if (here->seq > job->seq)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1086
+                break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1087
+            prior = &(here->next);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1088
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1089
+        job->next = here;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1090
+        *prior = job;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1091
+        twist(write_first, TO, write_head->seq);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1092
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1093
+    /* found job with seq == -1 -- free deflate memory and return to join */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1094
+    release(compress_have);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1095
+    (void)deflateEnd(&strm);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1096
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1097
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1098
+local void parallel_infchk(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1099
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1100
+    long seq;                       /* sequence number */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1101
+    struct job *job;                /* job of uncompress, then write */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1102
+    struct space *insp;             /* space for job input */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1103
+    struct space *outsp;            /* space for job output */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1104
+    size_t fromload;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1105
+    uint64_t infsz;                 /* size after inflate() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1106
+    uint64_t defsz;                 /* size before inflate() */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1107
+    uint64_t check;                 /* checksum */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1108
+    int last = 0;                   /* is this the last block? */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1109
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1110
+    /* If the index is useless, don't try to use it. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1111
+    if (!idx.valid) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1112
+        infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1113
+        return;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1114
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1115
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1116
+    if (form > 1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1117
+        complain("index not supported with zip file ", in);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1118
+        infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1119
+        return;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1120
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1121
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1122
+    /* if first time or after an option change, setup the job lists */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1123
+    setup_jobs();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1124
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1125
+    /* start write thread */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1126
+    writeth = launch(uncompress_write_thread, NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1127
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1128
+    /* updated by uncompress_write_thread */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1129
+    out_check = CHECK(0L, Z_NULL, 0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1130
+    out_len = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1131
+    out_tot = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1132
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1133
+    for (seq = 0; !last; seq++) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1134
+        /* get the next entry from the index */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1135
+        idx_get(&infsz, &defsz, &check, &last);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1136
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1137
+        job = malloc(sizeof(struct job));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1138
+        if (job == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1139
+            bail("not enough memory", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1140
+        job->seq = seq;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1141
+        job->more = !last;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1142
+        job->in = get_space_size(&in_pool, defsz);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1143
+        job->out = get_space_size(&out_pool, infsz);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1144
+        job->lens = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1145
+        job->check = check;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1146
+        job->calc = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1147
+        job->next = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1148
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1149
+        /* reading the header cached some data, be sure not to skip it */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1150
+        fromload = (in_left < defsz ? in_left : defsz);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1151
+        if (fromload > 0) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1152
+            (void)memcpy(job->in->buf, in_next, fromload);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1153
+            in_left -= fromload;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1154
+            in_next += fromload;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1155
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1156
+        if (fromload < defsz)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1157
+            readn(ind, job->in->buf + fromload, defsz - fromload);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1158
+        job->in->len = defsz;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1159
+        job->out->len = infsz;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1160
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1161
+        out_len += infsz;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1162
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1163
+        /* start another uncompress thread if needed */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1164
+        if (cthreads <= seq && cthreads < procs) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1165
+            (void)launch(uncompress_thread, NULL);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1166
+            cthreads++;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1167
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1168
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1169
+        possess(compress_have);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1170
+        *compress_tail = job;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1171
+        compress_tail = &(job->next);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1172
+        twist(compress_have, BY, +1);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1173
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1174
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1175
+    /* wait for the write thread to complete (we leave the compress threads out
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1176
+       there and waiting in case there is another stream to compress) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1177
+    join(writeth);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1178
+    writeth = NULL;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1179
+    Trace(("-- write thread joined"));
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1180
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1181
+    check_trailer(out_check, out_len);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1182
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1183
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1184
+/* parallel_infchk() or infchk(), whichever works. */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1185
+local void best_infchk(void)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1186
+{
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1187
+    if (index != NULL) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1188
+        /* User specified index file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1189
+        if (idx_open(index) != 0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1190
+            bail("invalid index file", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1191
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1192
+    else if (ind_has_index())
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1193
+        (void)idx_open("%z");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1194
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1195
+    if (idx.valid)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1196
+        parallel_infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1197
+    else
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1198
+        infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1199
+}
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1200
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1201
 /* --- decompress Unix compress (LZW) input --- */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1202
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1203
 /* memory for unlzw() --
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1204
@@ -3159,7 +3924,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1205
         /* if requested, test input file (possibly a special list) */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1206
         if (decode == 2) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1207
             if (method == 8)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1208
-                infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1209
+                best_infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1210
             else {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1211
                 unlzw();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1212
                 if (list) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1213
@@ -3219,19 +3984,8 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1214
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1215
         /* if exists and not -f, give user a chance to overwrite */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1216
         if (outd < 0 && errno == EEXIST && isatty(0) && verbosity) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1217
-            int ch, reply;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1218
-
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1219
-            fprintf(stderr, "%s exists -- overwrite (y/n)? ", out);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1220
-            fflush(stderr);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1221
-            reply = -1;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1222
-            do {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1223
-                ch = getchar();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1224
-                if (reply < 0 && ch != ' ' && ch != '\t')
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1225
-                    reply = ch == 'y' || ch == 'Y' ? 1 : 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1226
-            } while (ch != EOF && ch != '\n' && ch != '\r');
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1227
-            if (reply == 1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1228
-                outd = open(out, O_CREAT | O_TRUNC | O_WRONLY,
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1229
-                            0600);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1230
+            if (allow_overwrite(out))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1231
+                outd = open(out, O_CREAT | O_TRUNC | O_WRONLY, 0600);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1232
         }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1233
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1234
         /* if exists and no overwrite, report and go on to next */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1235
@@ -3254,17 +4008,22 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1236
     /* process ind to outd */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1237
     if (verbosity > 1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1238
         fprintf(stderr, "%s to %s ", in, out);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1239
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1240
     if (decode) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1241
-        if (method == 8)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1242
-            infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1243
+        if (method == 8) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1244
+            best_infchk();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1245
+        }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1246
         else if (method == 256)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1247
             unlzw();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1248
         else
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1249
             cat();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1250
     }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1251
 #ifndef NOTHREAD
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1252
-    else if (procs > 1)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1253
+    else if (procs > 1) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1254
+        if (index != NULL && idx_open(index) != 0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1255
+            bail("invalid index file", "");
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1256
         parallel_compress();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1257
+    }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1258
 #endif
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1259
     else
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1260
         single_compress(0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1261
@@ -3273,6 +4032,10 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1262
         fflush(stderr);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1263
     }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1264
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1265
+    /* close index file - this may append the index to outd */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1266
+    if (idx.valid)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1267
+        idx_close();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1268
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1269
     /* finish up, copy attributes, set times, delete original */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1270
     if (ind != 0)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1271
         close(ind);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1272
@@ -3331,6 +4094,9 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1273
 "  -v, --verbose        Provide more verbose output",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1274
 #endif
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1275
 "  -V  --version        Show the version of pigz",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1276
+"  -X  --index file     Create or use parallel uncompression index file.",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1277
+"                       %f and %z are replaced by uncompressed and compressed",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1278
+"                       file names",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1279
 "  -z, --zlib           Compress to zlib (.zz) instead of gzip format",
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1280
 "  --                   All arguments after \"--\" are treated as files"
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1281
 };
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1282
@@ -3400,11 +4166,11 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1283
 local char *longopts[][2] = {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1284
     {"LZW", "Z"}, {"ascii", "a"}, {"best", "9"}, {"bits", "Z"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1285
     {"blocksize", "b"}, {"decompress", "d"}, {"fast", "1"}, {"force", "f"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1286
-    {"help", "h"}, {"independent", "i"}, {"keep", "k"}, {"license", "L"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1287
-    {"list", "l"}, {"name", "N"}, {"no-name", "n"}, {"no-time", "T"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1288
-    {"processes", "p"}, {"quiet", "q"}, {"recursive", "r"}, {"rsyncable", "R"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1289
-    {"silent", "q"}, {"stdout", "c"}, {"suffix", "S"}, {"test", "t"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1290
-    {"to-stdout", "c"}, {"uncompress", "d"}, {"verbose", "v"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1291
+    {"help", "h"}, {"independent", "i"}, {"index", "X"}, {"keep", "k"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1292
+    {"license", "L"}, {"list", "l"}, {"name", "N"}, {"no-name", "n"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1293
+    {"no-time", "T"}, {"processes", "p"}, {"quiet", "q"}, {"recursive", "r"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1294
+    {"rsyncable", "R"}, {"silent", "q"}, {"stdout", "c"}, {"suffix", "S"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1295
+    {"test", "t"}, {"to-stdout", "c"}, {"uncompress", "d"}, {"verbose", "v"},
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1296
     {"version", "V"}, {"zip", "K"}, {"zlib", "z"}};
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1297
 #define NLOPTS (sizeof(longopts) / (sizeof(char *) << 1))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1298
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1299
@@ -3444,7 +4210,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1300
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1301
     /* if no argument or dash option, check status of get */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1302
     if (get && (arg == NULL || *arg == '-')) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1303
-        bad[1] = "bpS"[get - 1];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1304
+        bad[1] = "bpSX"[get - 1];
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1305
         bail("missing parameter after ", bad);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1306
     }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1307
     if (arg == NULL)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1308
@@ -3503,6 +4269,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1309
             case 'R':  rsync = 1;  break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1310
             case 'S':  get = 3;  break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1311
             case 'V':  fputs(VERSION, stderr);  exit(0);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1312
+            case 'X':  setdict = 0; get = 4;  break;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1313
             case 'Z':
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1314
                 bail("invalid option: LZW output not supported: ", bad);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1315
             case 'a':
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1316
@@ -3530,7 +4297,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1317
             return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1318
     }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1319
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1320
-    /* process option parameter for -b, -p, or -S */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1321
+    /* process option parameter for -b, -p, -S, or -X */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1322
     if (get) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1323
         size_t n;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1324
 
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1325
@@ -3543,7 +4310,7 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1326
                 OUTPOOL(size) < size ||
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1327
                 (ssize_t)OUTPOOL(size) < 0 ||
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1328
                 size > (1UL << 22))
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1329
-                bail("block size too large: ", arg);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1330
+                bail("block size too large:", arg);
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1331
             new_opts();
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1332
         }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1333
         else if (get == 2) {
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1334
@@ -3561,6 +4328,9 @@
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1335
         }
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1336
         else if (get == 3)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1337
             sufx = arg;                         /* gz suffix */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1338
+        else if (get == 4)
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1339
+            index = arg;                        /* index file */
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1340
+
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1341
         get = 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1342
         return 0;
7c34db1c2816 19612384 pigz needs parallel uncompress
Michael Gerdts <mike.gerdts@oracle.com>
parents:
diff changeset
  1343
     }