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