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