libarchive-static 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. data/ext/Makefile +6 -0
  2. data/ext/extconf.rb +61 -0
  3. data/ext/libarchive-0.1.1/COPYING.libarchive +60 -0
  4. data/ext/libarchive-0.1.1/LICENSE.libbzip2 +42 -0
  5. data/ext/libarchive-0.1.1/README.txt +143 -0
  6. data/ext/libarchive-0.1.1/ext/Makefile.in +0 -0
  7. data/ext/libarchive-0.1.1/ext/archive_read_support_compression.c +31 -0
  8. data/ext/libarchive-0.1.1/ext/archive_read_support_compression.h +6 -0
  9. data/ext/libarchive-0.1.1/ext/archive_read_support_format.c +32 -0
  10. data/ext/libarchive-0.1.1/ext/archive_read_support_format.h +6 -0
  11. data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.c +29 -0
  12. data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.h +6 -0
  13. data/ext/libarchive-0.1.1/ext/archive_write_set_compression.c +32 -0
  14. data/ext/libarchive-0.1.1/ext/archive_write_set_compression.h +6 -0
  15. data/ext/libarchive-0.1.1/ext/config.h.in +22 -0
  16. data/ext/libarchive-0.1.1/ext/configure +3904 -0
  17. data/ext/libarchive-0.1.1/ext/configure.in +11 -0
  18. data/ext/libarchive-0.1.1/ext/depend +19 -0
  19. data/ext/libarchive-0.1.1/ext/extconf.rb +6 -0
  20. data/ext/libarchive-0.1.1/ext/install-sh +250 -0
  21. data/ext/libarchive-0.1.1/ext/libarchive.c +89 -0
  22. data/ext/libarchive-0.1.1/ext/libarchive_archive.c +84 -0
  23. data/ext/libarchive-0.1.1/ext/libarchive_entry.c +1015 -0
  24. data/ext/libarchive-0.1.1/ext/libarchive_internal.h +155 -0
  25. data/ext/libarchive-0.1.1/ext/libarchive_reader.c +328 -0
  26. data/ext/libarchive-0.1.1/ext/libarchive_win32.h +52 -0
  27. data/ext/libarchive-0.1.1/ext/libarchive_writer.c +246 -0
  28. data/ext/libarchive-0.1.1/libarchive.c +1762 -0
  29. data/ext/libarchive-2.8.4/Makefile.in +7076 -0
  30. data/ext/libarchive-2.8.4/build/autoconf/check_stdcall_func.m4 +51 -0
  31. data/ext/libarchive-2.8.4/build/autoconf/compile +143 -0
  32. data/ext/libarchive-2.8.4/build/autoconf/config.guess +1502 -0
  33. data/ext/libarchive-2.8.4/build/autoconf/config.sub +1708 -0
  34. data/ext/libarchive-2.8.4/build/autoconf/depcomp +630 -0
  35. data/ext/libarchive-2.8.4/build/autoconf/install-sh +291 -0
  36. data/ext/libarchive-2.8.4/build/autoconf/la_uid_t.m4 +20 -0
  37. data/ext/libarchive-2.8.4/build/autoconf/ltmain.sh +8406 -0
  38. data/ext/libarchive-2.8.4/build/autoconf/missing +376 -0
  39. data/ext/libarchive-2.8.4/build/pkgconfig/libarchive.pc.in +10 -0
  40. data/ext/libarchive-2.8.4/config.h.in +772 -0
  41. data/ext/libarchive-2.8.4/configure +17916 -0
  42. data/ext/libarchive-2.8.4/libarchive/archive.h +741 -0
  43. data/ext/libarchive-2.8.4/libarchive/archive_check_magic.c +134 -0
  44. data/ext/libarchive-2.8.4/libarchive/archive_crc32.h +66 -0
  45. data/ext/libarchive-2.8.4/libarchive/archive_endian.h +162 -0
  46. data/ext/libarchive-2.8.4/libarchive/archive_entry.c +2202 -0
  47. data/ext/libarchive-2.8.4/libarchive/archive_entry.h +524 -0
  48. data/ext/libarchive-2.8.4/libarchive/archive_entry_copy_bhfi.c +74 -0
  49. data/ext/libarchive-2.8.4/libarchive/archive_entry_copy_stat.c +77 -0
  50. data/ext/libarchive-2.8.4/libarchive/archive_entry_link_resolver.c +405 -0
  51. data/ext/libarchive-2.8.4/libarchive/archive_entry_private.h +184 -0
  52. data/ext/libarchive-2.8.4/libarchive/archive_entry_stat.c +118 -0
  53. data/ext/libarchive-2.8.4/libarchive/archive_entry_strmode.c +87 -0
  54. data/ext/libarchive-2.8.4/libarchive/archive_entry_xattr.c +158 -0
  55. data/ext/libarchive-2.8.4/libarchive/archive_hash.h +281 -0
  56. data/ext/libarchive-2.8.4/libarchive/archive_platform.h +165 -0
  57. data/ext/libarchive-2.8.4/libarchive/archive_private.h +124 -0
  58. data/ext/libarchive-2.8.4/libarchive/archive_read.c +1249 -0
  59. data/ext/libarchive-2.8.4/libarchive/archive_read_data_into_fd.c +93 -0
  60. data/ext/libarchive-2.8.4/libarchive/archive_read_disk.c +198 -0
  61. data/ext/libarchive-2.8.4/libarchive/archive_read_disk_entry_from_file.c +570 -0
  62. data/ext/libarchive-2.8.4/libarchive/archive_read_disk_private.h +62 -0
  63. data/ext/libarchive-2.8.4/libarchive/archive_read_disk_set_standard_lookup.c +303 -0
  64. data/ext/libarchive-2.8.4/libarchive/archive_read_extract.c +182 -0
  65. data/ext/libarchive-2.8.4/libarchive/archive_read_open_fd.c +190 -0
  66. data/ext/libarchive-2.8.4/libarchive/archive_read_open_file.c +165 -0
  67. data/ext/libarchive-2.8.4/libarchive/archive_read_open_filename.c +272 -0
  68. data/ext/libarchive-2.8.4/libarchive/archive_read_open_memory.c +156 -0
  69. data/ext/libarchive-2.8.4/libarchive/archive_read_private.h +199 -0
  70. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_all.c +60 -0
  71. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_bzip2.c +353 -0
  72. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_compress.c +444 -0
  73. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_gzip.c +465 -0
  74. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_none.c +40 -0
  75. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_program.c +459 -0
  76. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_rpm.c +287 -0
  77. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_uu.c +627 -0
  78. data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_xz.c +708 -0
  79. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_all.c +43 -0
  80. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_ar.c +584 -0
  81. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_cpio.c +777 -0
  82. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_empty.c +93 -0
  83. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_iso9660.c +2830 -0
  84. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_mtree.c +1304 -0
  85. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_raw.c +185 -0
  86. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_tar.c +2418 -0
  87. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_xar.c +3151 -0
  88. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_zip.c +903 -0
  89. data/ext/libarchive-2.8.4/libarchive/archive_string.c +453 -0
  90. data/ext/libarchive-2.8.4/libarchive/archive_string.h +148 -0
  91. data/ext/libarchive-2.8.4/libarchive/archive_string_sprintf.c +164 -0
  92. data/ext/libarchive-2.8.4/libarchive/archive_util.c +391 -0
  93. data/ext/libarchive-2.8.4/libarchive/archive_virtual.c +94 -0
  94. data/ext/libarchive-2.8.4/libarchive/archive_windows.c +1236 -0
  95. data/ext/libarchive-2.8.4/libarchive/archive_windows.h +347 -0
  96. data/ext/libarchive-2.8.4/libarchive/archive_write.c +466 -0
  97. data/ext/libarchive-2.8.4/libarchive/archive_write_disk.c +2628 -0
  98. data/ext/libarchive-2.8.4/libarchive/archive_write_disk_private.h +38 -0
  99. data/ext/libarchive-2.8.4/libarchive/archive_write_disk_set_standard_lookup.c +262 -0
  100. data/ext/libarchive-2.8.4/libarchive/archive_write_open_fd.c +141 -0
  101. data/ext/libarchive-2.8.4/libarchive/archive_write_open_file.c +105 -0
  102. data/ext/libarchive-2.8.4/libarchive/archive_write_open_filename.c +162 -0
  103. data/ext/libarchive-2.8.4/libarchive/archive_write_open_memory.c +126 -0
  104. data/ext/libarchive-2.8.4/libarchive/archive_write_private.h +122 -0
  105. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_bzip2.c +408 -0
  106. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_compress.c +492 -0
  107. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_gzip.c +477 -0
  108. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_none.c +257 -0
  109. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_program.c +347 -0
  110. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_xz.c +438 -0
  111. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format.c +72 -0
  112. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_ar.c +550 -0
  113. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_by_name.c +76 -0
  114. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio.c +344 -0
  115. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio_newc.c +295 -0
  116. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_mtree.c +1050 -0
  117. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_pax.c +1386 -0
  118. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_shar.c +626 -0
  119. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_ustar.c +587 -0
  120. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_zip.c +667 -0
  121. data/ext/libarchive-2.8.4/libarchive/config_freebsd.h +154 -0
  122. data/ext/libarchive-2.8.4/libarchive/filter_fork.c +161 -0
  123. data/ext/libarchive-2.8.4/libarchive/filter_fork.h +41 -0
  124. data/ext/libarchive-2.8.4/libarchive/filter_fork_windows.c +113 -0
  125. data/ext/libarchive-static-makefile +80 -0
  126. data/ext/libarchive-static-wrapper-makefile +22 -0
  127. data/ext/zlib-1.2.5/Makefile.in +257 -0
  128. data/ext/zlib-1.2.5/adler32.c +169 -0
  129. data/ext/zlib-1.2.5/compress.c +80 -0
  130. data/ext/zlib-1.2.5/configure +596 -0
  131. data/ext/zlib-1.2.5/crc32.c +442 -0
  132. data/ext/zlib-1.2.5/crc32.h +441 -0
  133. data/ext/zlib-1.2.5/deflate.c +1834 -0
  134. data/ext/zlib-1.2.5/deflate.h +342 -0
  135. data/ext/zlib-1.2.5/example.c +565 -0
  136. data/ext/zlib-1.2.5/gzclose.c +25 -0
  137. data/ext/zlib-1.2.5/gzguts.h +132 -0
  138. data/ext/zlib-1.2.5/gzlib.c +537 -0
  139. data/ext/zlib-1.2.5/gzread.c +653 -0
  140. data/ext/zlib-1.2.5/gzwrite.c +531 -0
  141. data/ext/zlib-1.2.5/infback.c +632 -0
  142. data/ext/zlib-1.2.5/inffast.c +340 -0
  143. data/ext/zlib-1.2.5/inffast.h +11 -0
  144. data/ext/zlib-1.2.5/inffixed.h +94 -0
  145. data/ext/zlib-1.2.5/inflate.c +1480 -0
  146. data/ext/zlib-1.2.5/inflate.h +122 -0
  147. data/ext/zlib-1.2.5/inftrees.c +330 -0
  148. data/ext/zlib-1.2.5/inftrees.h +62 -0
  149. data/ext/zlib-1.2.5/minigzip.c +440 -0
  150. data/ext/zlib-1.2.5/trees.c +1244 -0
  151. data/ext/zlib-1.2.5/trees.h +128 -0
  152. data/ext/zlib-1.2.5/uncompr.c +59 -0
  153. data/ext/zlib-1.2.5/zconf.h +428 -0
  154. data/ext/zlib-1.2.5/zlib.h +1613 -0
  155. data/ext/zlib-1.2.5/zutil.c +318 -0
  156. data/ext/zlib-1.2.5/zutil.h +274 -0
  157. metadata +211 -0
@@ -0,0 +1,1249 @@
1
+ /*-
2
+ * Copyright (c) 2003-2007 Tim Kientzle
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ */
25
+
26
+ /*
27
+ * This file contains the "essential" portions of the read API, that
28
+ * is, stuff that will probably always be used by any client that
29
+ * actually needs to read an archive. Optional pieces have been, as
30
+ * far as possible, separated out into separate files to avoid
31
+ * needlessly bloating statically-linked clients.
32
+ */
33
+
34
+ #include "archive_platform.h"
35
+ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read.c 201157 2009-12-29 05:30:23Z kientzle $");
36
+
37
+ #ifdef HAVE_ERRNO_H
38
+ #include <errno.h>
39
+ #endif
40
+ #include <stdio.h>
41
+ #ifdef HAVE_STDLIB_H
42
+ #include <stdlib.h>
43
+ #endif
44
+ #ifdef HAVE_STRING_H
45
+ #include <string.h>
46
+ #endif
47
+ #ifdef HAVE_UNISTD_H
48
+ #include <unistd.h>
49
+ #endif
50
+
51
+ #include "archive.h"
52
+ #include "archive_entry.h"
53
+ #include "archive_private.h"
54
+ #include "archive_read_private.h"
55
+
56
+ #define minimum(a, b) (a < b ? a : b)
57
+
58
+ static int build_stream(struct archive_read *);
59
+ static int choose_format(struct archive_read *);
60
+ static int cleanup_filters(struct archive_read *);
61
+ static struct archive_vtable *archive_read_vtable(void);
62
+ static int _archive_read_close(struct archive *);
63
+ static int _archive_read_finish(struct archive *);
64
+
65
+ static struct archive_vtable *
66
+ archive_read_vtable(void)
67
+ {
68
+ static struct archive_vtable av;
69
+ static int inited = 0;
70
+
71
+ if (!inited) {
72
+ av.archive_finish = _archive_read_finish;
73
+ av.archive_close = _archive_read_close;
74
+ }
75
+ return (&av);
76
+ }
77
+
78
+ /*
79
+ * Allocate, initialize and return a struct archive object.
80
+ */
81
+ struct archive *
82
+ archive_read_new(void)
83
+ {
84
+ struct archive_read *a;
85
+
86
+ a = (struct archive_read *)malloc(sizeof(*a));
87
+ if (a == NULL)
88
+ return (NULL);
89
+ memset(a, 0, sizeof(*a));
90
+ a->archive.magic = ARCHIVE_READ_MAGIC;
91
+
92
+ a->archive.state = ARCHIVE_STATE_NEW;
93
+ a->entry = archive_entry_new();
94
+ a->archive.vtable = archive_read_vtable();
95
+
96
+ return (&a->archive);
97
+ }
98
+
99
+ /*
100
+ * Record the do-not-extract-to file. This belongs in archive_read_extract.c.
101
+ */
102
+ void
103
+ archive_read_extract_set_skip_file(struct archive *_a, dev_t d, ino_t i)
104
+ {
105
+ struct archive_read *a = (struct archive_read *)_a;
106
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_ANY,
107
+ "archive_read_extract_set_skip_file");
108
+ a->skip_file_dev = d;
109
+ a->skip_file_ino = i;
110
+ }
111
+
112
+ /*
113
+ * Set read options for the format.
114
+ */
115
+ int
116
+ archive_read_set_format_options(struct archive *_a, const char *s)
117
+ {
118
+ struct archive_read *a;
119
+ struct archive_format_descriptor *format;
120
+ char key[64], val[64];
121
+ char *valp;
122
+ size_t i;
123
+ int len, r;
124
+
125
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
126
+ "archive_read_set_format_options");
127
+
128
+ if (s == NULL || *s == '\0')
129
+ return (ARCHIVE_OK);
130
+ a = (struct archive_read *)_a;
131
+ __archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC,
132
+ ARCHIVE_STATE_NEW, "archive_read_set_format_options");
133
+ len = 0;
134
+ for (i = 0; i < sizeof(a->formats)/sizeof(a->formats[0]); i++) {
135
+ format = &a->formats[i];
136
+ if (format == NULL || format->options == NULL ||
137
+ format->name == NULL)
138
+ /* This format does not support option. */
139
+ continue;
140
+
141
+ while ((len = __archive_parse_options(s, format->name,
142
+ sizeof(key), key, sizeof(val), val)) > 0) {
143
+ valp = val[0] == '\0' ? NULL : val;
144
+ a->format = format;
145
+ r = format->options(a, key, valp);
146
+ a->format = NULL;
147
+ if (r == ARCHIVE_FATAL)
148
+ return (r);
149
+ s += len;
150
+ }
151
+ }
152
+ if (len < 0) {
153
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
154
+ "Illegal format options.");
155
+ return (ARCHIVE_WARN);
156
+ }
157
+ return (ARCHIVE_OK);
158
+ }
159
+
160
+ /*
161
+ * Set read options for the filter.
162
+ */
163
+ int
164
+ archive_read_set_filter_options(struct archive *_a, const char *s)
165
+ {
166
+ struct archive_read *a;
167
+ struct archive_read_filter *filter;
168
+ struct archive_read_filter_bidder *bidder;
169
+ char key[64], val[64];
170
+ int len, r;
171
+
172
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
173
+ "archive_read_set_filter_options");
174
+
175
+ if (s == NULL || *s == '\0')
176
+ return (ARCHIVE_OK);
177
+ a = (struct archive_read *)_a;
178
+ __archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC,
179
+ ARCHIVE_STATE_NEW, "archive_read_set_filter_options");
180
+ len = 0;
181
+ for (filter = a->filter; filter != NULL; filter = filter->upstream) {
182
+ bidder = filter->bidder;
183
+ if (bidder == NULL)
184
+ continue;
185
+ if (bidder->options == NULL)
186
+ /* This bidder does not support option */
187
+ continue;
188
+ while ((len = __archive_parse_options(s, filter->name,
189
+ sizeof(key), key, sizeof(val), val)) > 0) {
190
+ if (val[0] == '\0')
191
+ r = bidder->options(bidder, key, NULL);
192
+ else
193
+ r = bidder->options(bidder, key, val);
194
+ if (r == ARCHIVE_FATAL)
195
+ return (r);
196
+ s += len;
197
+ }
198
+ }
199
+ if (len < 0) {
200
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
201
+ "Illegal format options.");
202
+ return (ARCHIVE_WARN);
203
+ }
204
+ return (ARCHIVE_OK);
205
+ }
206
+
207
+ /*
208
+ * Set read options for the format and the filter.
209
+ */
210
+ int
211
+ archive_read_set_options(struct archive *_a, const char *s)
212
+ {
213
+ int r;
214
+
215
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
216
+ "archive_read_set_options");
217
+ archive_clear_error(_a);
218
+
219
+ r = archive_read_set_format_options(_a, s);
220
+ if (r != ARCHIVE_OK)
221
+ return (r);
222
+ r = archive_read_set_filter_options(_a, s);
223
+ if (r != ARCHIVE_OK)
224
+ return (r);
225
+ return (ARCHIVE_OK);
226
+ }
227
+
228
+ /*
229
+ * Open the archive
230
+ */
231
+ int
232
+ archive_read_open(struct archive *a, void *client_data,
233
+ archive_open_callback *client_opener, archive_read_callback *client_reader,
234
+ archive_close_callback *client_closer)
235
+ {
236
+ /* Old archive_read_open() is just a thin shell around
237
+ * archive_read_open2. */
238
+ return archive_read_open2(a, client_data, client_opener,
239
+ client_reader, NULL, client_closer);
240
+ }
241
+
242
+ static ssize_t
243
+ client_read_proxy(struct archive_read_filter *self, const void **buff)
244
+ {
245
+ ssize_t r;
246
+ r = (self->archive->client.reader)(&self->archive->archive,
247
+ self->data, buff);
248
+ self->archive->archive.raw_position += r;
249
+ return (r);
250
+ }
251
+
252
+ static int64_t
253
+ client_skip_proxy(struct archive_read_filter *self, int64_t request)
254
+ {
255
+ int64_t ask, get, total;
256
+ /* Limit our maximum seek request to 1GB on platforms
257
+ * with 32-bit off_t (such as Windows). */
258
+ int64_t skip_limit = ((int64_t)1) << (sizeof(off_t) * 8 - 2);
259
+
260
+ if (self->archive->client.skipper == NULL)
261
+ return (0);
262
+ total = 0;
263
+ for (;;) {
264
+ ask = request;
265
+ if (ask > skip_limit)
266
+ ask = skip_limit;
267
+ get = (self->archive->client.skipper)(&self->archive->archive,
268
+ self->data, ask);
269
+ if (get == 0)
270
+ return (total);
271
+ request -= get;
272
+ self->archive->archive.raw_position += get;
273
+ total += get;
274
+ }
275
+ }
276
+
277
+ static int
278
+ client_close_proxy(struct archive_read_filter *self)
279
+ {
280
+ int r = ARCHIVE_OK;
281
+
282
+ if (self->archive->client.closer != NULL)
283
+ r = (self->archive->client.closer)((struct archive *)self->archive,
284
+ self->data);
285
+ self->data = NULL;
286
+ return (r);
287
+ }
288
+
289
+
290
+ int
291
+ archive_read_open2(struct archive *_a, void *client_data,
292
+ archive_open_callback *client_opener,
293
+ archive_read_callback *client_reader,
294
+ archive_skip_callback *client_skipper,
295
+ archive_close_callback *client_closer)
296
+ {
297
+ struct archive_read *a = (struct archive_read *)_a;
298
+ struct archive_read_filter *filter;
299
+ int e;
300
+
301
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
302
+ "archive_read_open");
303
+ archive_clear_error(&a->archive);
304
+
305
+ if (client_reader == NULL)
306
+ __archive_errx(1,
307
+ "No reader function provided to archive_read_open");
308
+
309
+ /* Open data source. */
310
+ if (client_opener != NULL) {
311
+ e =(client_opener)(&a->archive, client_data);
312
+ if (e != 0) {
313
+ /* If the open failed, call the closer to clean up. */
314
+ if (client_closer)
315
+ (client_closer)(&a->archive, client_data);
316
+ return (e);
317
+ }
318
+ }
319
+
320
+ /* Save the client functions and mock up the initial source. */
321
+ a->client.reader = client_reader;
322
+ a->client.skipper = client_skipper;
323
+ a->client.closer = client_closer;
324
+
325
+ filter = calloc(1, sizeof(*filter));
326
+ if (filter == NULL)
327
+ return (ARCHIVE_FATAL);
328
+ filter->bidder = NULL;
329
+ filter->upstream = NULL;
330
+ filter->archive = a;
331
+ filter->data = client_data;
332
+ filter->read = client_read_proxy;
333
+ filter->skip = client_skip_proxy;
334
+ filter->close = client_close_proxy;
335
+ filter->name = "none";
336
+ filter->code = ARCHIVE_COMPRESSION_NONE;
337
+ a->filter = filter;
338
+
339
+ /* Build out the input pipeline. */
340
+ e = build_stream(a);
341
+ if (e == ARCHIVE_OK)
342
+ a->archive.state = ARCHIVE_STATE_HEADER;
343
+
344
+ return (e);
345
+ }
346
+
347
+ /*
348
+ * Allow each registered stream transform to bid on whether
349
+ * it wants to handle this stream. Repeat until we've finished
350
+ * building the pipeline.
351
+ */
352
+ static int
353
+ build_stream(struct archive_read *a)
354
+ {
355
+ int number_bidders, i, bid, best_bid;
356
+ struct archive_read_filter_bidder *bidder, *best_bidder;
357
+ struct archive_read_filter *filter;
358
+ ssize_t avail;
359
+ int r;
360
+
361
+ for (;;) {
362
+ number_bidders = sizeof(a->bidders) / sizeof(a->bidders[0]);
363
+
364
+ best_bid = 0;
365
+ best_bidder = NULL;
366
+
367
+ bidder = a->bidders;
368
+ for (i = 0; i < number_bidders; i++, bidder++) {
369
+ if (bidder->bid != NULL) {
370
+ bid = (bidder->bid)(bidder, a->filter);
371
+ if (bid > best_bid) {
372
+ best_bid = bid;
373
+ best_bidder = bidder;
374
+ }
375
+ }
376
+ }
377
+
378
+ /* If no bidder, we're done. */
379
+ if (best_bidder == NULL) {
380
+ a->archive.compression_name = a->filter->name;
381
+ a->archive.compression_code = a->filter->code;
382
+ return (ARCHIVE_OK);
383
+ }
384
+
385
+ filter
386
+ = (struct archive_read_filter *)calloc(1, sizeof(*filter));
387
+ if (filter == NULL)
388
+ return (ARCHIVE_FATAL);
389
+ filter->bidder = best_bidder;
390
+ filter->archive = a;
391
+ filter->upstream = a->filter;
392
+ r = (best_bidder->init)(filter);
393
+ if (r != ARCHIVE_OK) {
394
+ free(filter);
395
+ return (r);
396
+ }
397
+ a->filter = filter;
398
+ /* Verify the filter by asking it for some data. */
399
+ __archive_read_filter_ahead(filter, 1, &avail);
400
+ if (avail < 0) {
401
+ cleanup_filters(a);
402
+ return (ARCHIVE_FATAL);
403
+ }
404
+ }
405
+ }
406
+
407
+ /*
408
+ * Read header of next entry.
409
+ */
410
+ int
411
+ archive_read_next_header2(struct archive *_a, struct archive_entry *entry)
412
+ {
413
+ struct archive_read *a = (struct archive_read *)_a;
414
+ int slot, ret;
415
+
416
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC,
417
+ ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
418
+ "archive_read_next_header");
419
+
420
+ ++_a->file_count;
421
+ archive_entry_clear(entry);
422
+ archive_clear_error(&a->archive);
423
+
424
+ /*
425
+ * If no format has yet been chosen, choose one.
426
+ */
427
+ if (a->format == NULL) {
428
+ slot = choose_format(a);
429
+ if (slot < 0) {
430
+ a->archive.state = ARCHIVE_STATE_FATAL;
431
+ return (ARCHIVE_FATAL);
432
+ }
433
+ a->format = &(a->formats[slot]);
434
+ }
435
+
436
+ /*
437
+ * If client didn't consume entire data, skip any remainder
438
+ * (This is especially important for GNU incremental directories.)
439
+ */
440
+ if (a->archive.state == ARCHIVE_STATE_DATA) {
441
+ ret = archive_read_data_skip(&a->archive);
442
+ if (ret == ARCHIVE_EOF) {
443
+ archive_set_error(&a->archive, EIO, "Premature end-of-file.");
444
+ a->archive.state = ARCHIVE_STATE_FATAL;
445
+ return (ARCHIVE_FATAL);
446
+ }
447
+ if (ret != ARCHIVE_OK)
448
+ return (ret);
449
+ }
450
+
451
+ /* Record start-of-header. */
452
+ a->header_position = a->archive.file_position;
453
+
454
+ ret = (a->format->read_header)(a, entry);
455
+
456
+ /*
457
+ * EOF and FATAL are persistent at this layer. By
458
+ * modifying the state, we guarantee that future calls to
459
+ * read a header or read data will fail.
460
+ */
461
+ switch (ret) {
462
+ case ARCHIVE_EOF:
463
+ a->archive.state = ARCHIVE_STATE_EOF;
464
+ break;
465
+ case ARCHIVE_OK:
466
+ a->archive.state = ARCHIVE_STATE_DATA;
467
+ break;
468
+ case ARCHIVE_WARN:
469
+ a->archive.state = ARCHIVE_STATE_DATA;
470
+ break;
471
+ case ARCHIVE_RETRY:
472
+ break;
473
+ case ARCHIVE_FATAL:
474
+ a->archive.state = ARCHIVE_STATE_FATAL;
475
+ break;
476
+ }
477
+
478
+ a->read_data_output_offset = 0;
479
+ a->read_data_remaining = 0;
480
+ return (ret);
481
+ }
482
+
483
+ int
484
+ archive_read_next_header(struct archive *_a, struct archive_entry **entryp)
485
+ {
486
+ int ret;
487
+ struct archive_read *a = (struct archive_read *)_a;
488
+ *entryp = NULL;
489
+ ret = archive_read_next_header2(_a, a->entry);
490
+ *entryp = a->entry;
491
+ return ret;
492
+ }
493
+
494
+ /*
495
+ * Allow each registered format to bid on whether it wants to handle
496
+ * the next entry. Return index of winning bidder.
497
+ */
498
+ static int
499
+ choose_format(struct archive_read *a)
500
+ {
501
+ int slots;
502
+ int i;
503
+ int bid, best_bid;
504
+ int best_bid_slot;
505
+
506
+ slots = sizeof(a->formats) / sizeof(a->formats[0]);
507
+ best_bid = -1;
508
+ best_bid_slot = -1;
509
+
510
+ /* Set up a->format and a->pformat_data for convenience of bidders. */
511
+ a->format = &(a->formats[0]);
512
+ for (i = 0; i < slots; i++, a->format++) {
513
+ if (a->format->bid) {
514
+ bid = (a->format->bid)(a);
515
+ if (bid == ARCHIVE_FATAL)
516
+ return (ARCHIVE_FATAL);
517
+ if ((bid > best_bid) || (best_bid_slot < 0)) {
518
+ best_bid = bid;
519
+ best_bid_slot = i;
520
+ }
521
+ }
522
+ }
523
+
524
+ /*
525
+ * There were no bidders; this is a serious programmer error
526
+ * and demands a quick and definitive abort.
527
+ */
528
+ if (best_bid_slot < 0)
529
+ __archive_errx(1, "No formats were registered; you must "
530
+ "invoke at least one archive_read_support_format_XXX "
531
+ "function in order to successfully read an archive.");
532
+
533
+ /*
534
+ * There were bidders, but no non-zero bids; this means we
535
+ * can't support this stream.
536
+ */
537
+ if (best_bid < 1) {
538
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
539
+ "Unrecognized archive format");
540
+ return (ARCHIVE_FATAL);
541
+ }
542
+
543
+ return (best_bid_slot);
544
+ }
545
+
546
+ /*
547
+ * Return the file offset (within the uncompressed data stream) where
548
+ * the last header started.
549
+ */
550
+ int64_t
551
+ archive_read_header_position(struct archive *_a)
552
+ {
553
+ struct archive_read *a = (struct archive_read *)_a;
554
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC,
555
+ ARCHIVE_STATE_ANY, "archive_read_header_position");
556
+ return (a->header_position);
557
+ }
558
+
559
+ /*
560
+ * Read data from an archive entry, using a read(2)-style interface.
561
+ * This is a convenience routine that just calls
562
+ * archive_read_data_block and copies the results into the client
563
+ * buffer, filling any gaps with zero bytes. Clients using this
564
+ * API can be completely ignorant of sparse-file issues; sparse files
565
+ * will simply be padded with nulls.
566
+ *
567
+ * DO NOT intermingle calls to this function and archive_read_data_block
568
+ * to read a single entry body.
569
+ */
570
+ ssize_t
571
+ archive_read_data(struct archive *_a, void *buff, size_t s)
572
+ {
573
+ struct archive_read *a = (struct archive_read *)_a;
574
+ char *dest;
575
+ const void *read_buf;
576
+ size_t bytes_read;
577
+ size_t len;
578
+ int r;
579
+
580
+ bytes_read = 0;
581
+ dest = (char *)buff;
582
+
583
+ while (s > 0) {
584
+ if (a->read_data_remaining == 0) {
585
+ read_buf = a->read_data_block;
586
+ r = archive_read_data_block(&a->archive, &read_buf,
587
+ &a->read_data_remaining, &a->read_data_offset);
588
+ a->read_data_block = read_buf;
589
+ if (r == ARCHIVE_EOF)
590
+ return (bytes_read);
591
+ /*
592
+ * Error codes are all negative, so the status
593
+ * return here cannot be confused with a valid
594
+ * byte count. (ARCHIVE_OK is zero.)
595
+ */
596
+ if (r < ARCHIVE_OK)
597
+ return (r);
598
+ }
599
+
600
+ if (a->read_data_offset < a->read_data_output_offset) {
601
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
602
+ "Encountered out-of-order sparse blocks");
603
+ return (ARCHIVE_RETRY);
604
+ }
605
+
606
+ /* Compute the amount of zero padding needed. */
607
+ if (a->read_data_output_offset + (off_t)s <
608
+ a->read_data_offset) {
609
+ len = s;
610
+ } else if (a->read_data_output_offset <
611
+ a->read_data_offset) {
612
+ len = a->read_data_offset -
613
+ a->read_data_output_offset;
614
+ } else
615
+ len = 0;
616
+
617
+ /* Add zeroes. */
618
+ memset(dest, 0, len);
619
+ s -= len;
620
+ a->read_data_output_offset += len;
621
+ dest += len;
622
+ bytes_read += len;
623
+
624
+ /* Copy data if there is any space left. */
625
+ if (s > 0) {
626
+ len = a->read_data_remaining;
627
+ if (len > s)
628
+ len = s;
629
+ memcpy(dest, a->read_data_block, len);
630
+ s -= len;
631
+ a->read_data_block += len;
632
+ a->read_data_remaining -= len;
633
+ a->read_data_output_offset += len;
634
+ a->read_data_offset += len;
635
+ dest += len;
636
+ bytes_read += len;
637
+ }
638
+ }
639
+ return (bytes_read);
640
+ }
641
+
642
+ #if ARCHIVE_API_VERSION < 3
643
+ /*
644
+ * Obsolete function provided for compatibility only. Note that the API
645
+ * of this function doesn't allow the caller to detect if the remaining
646
+ * data from the archive entry is shorter than the buffer provided, or
647
+ * even if an error occurred while reading data.
648
+ */
649
+ int
650
+ archive_read_data_into_buffer(struct archive *a, void *d, ssize_t len)
651
+ {
652
+
653
+ archive_read_data(a, d, len);
654
+ return (ARCHIVE_OK);
655
+ }
656
+ #endif
657
+
658
+ /*
659
+ * Skip over all remaining data in this entry.
660
+ */
661
+ int
662
+ archive_read_data_skip(struct archive *_a)
663
+ {
664
+ struct archive_read *a = (struct archive_read *)_a;
665
+ int r;
666
+ const void *buff;
667
+ size_t size;
668
+ off_t offset;
669
+
670
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_DATA,
671
+ "archive_read_data_skip");
672
+
673
+ if (a->format->read_data_skip != NULL)
674
+ r = (a->format->read_data_skip)(a);
675
+ else {
676
+ while ((r = archive_read_data_block(&a->archive,
677
+ &buff, &size, &offset))
678
+ == ARCHIVE_OK)
679
+ ;
680
+ }
681
+
682
+ if (r == ARCHIVE_EOF)
683
+ r = ARCHIVE_OK;
684
+
685
+ a->archive.state = ARCHIVE_STATE_HEADER;
686
+ return (r);
687
+ }
688
+
689
+ /*
690
+ * Read the next block of entry data from the archive.
691
+ * This is a zero-copy interface; the client receives a pointer,
692
+ * size, and file offset of the next available block of data.
693
+ *
694
+ * Returns ARCHIVE_OK if the operation is successful, ARCHIVE_EOF if
695
+ * the end of entry is encountered.
696
+ */
697
+ int
698
+ archive_read_data_block(struct archive *_a,
699
+ const void **buff, size_t *size, off_t *offset)
700
+ {
701
+ struct archive_read *a = (struct archive_read *)_a;
702
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_DATA,
703
+ "archive_read_data_block");
704
+
705
+ if (a->format->read_data == NULL) {
706
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
707
+ "Internal error: "
708
+ "No format_read_data_block function registered");
709
+ return (ARCHIVE_FATAL);
710
+ }
711
+
712
+ return (a->format->read_data)(a, buff, size, offset);
713
+ }
714
+
715
+ /*
716
+ * Close the file and release most resources.
717
+ *
718
+ * Be careful: client might just call read_new and then read_finish.
719
+ * Don't assume we actually read anything or performed any non-trivial
720
+ * initialization.
721
+ */
722
+ static int
723
+ _archive_read_close(struct archive *_a)
724
+ {
725
+ struct archive_read *a = (struct archive_read *)_a;
726
+ int r = ARCHIVE_OK, r1 = ARCHIVE_OK;
727
+ size_t i, n;
728
+
729
+ __archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC,
730
+ ARCHIVE_STATE_ANY, "archive_read_close");
731
+ archive_clear_error(&a->archive);
732
+ a->archive.state = ARCHIVE_STATE_CLOSED;
733
+
734
+
735
+ /* Call cleanup functions registered by optional components. */
736
+ if (a->cleanup_archive_extract != NULL)
737
+ r = (a->cleanup_archive_extract)(a);
738
+
739
+ /* TODO: Clean up the formatters. */
740
+
741
+ /* Release the filter objects. */
742
+ r1 = cleanup_filters(a);
743
+ if (r1 < r)
744
+ r = r1;
745
+
746
+ /* Release the bidder objects. */
747
+ n = sizeof(a->bidders)/sizeof(a->bidders[0]);
748
+ for (i = 0; i < n; i++) {
749
+ if (a->bidders[i].free != NULL) {
750
+ r1 = (a->bidders[i].free)(&a->bidders[i]);
751
+ if (r1 < r)
752
+ r = r1;
753
+ }
754
+ }
755
+
756
+ return (r);
757
+ }
758
+
759
+ static int
760
+ cleanup_filters(struct archive_read *a)
761
+ {
762
+ int r = ARCHIVE_OK;
763
+ /* Clean up the filter pipeline. */
764
+ while (a->filter != NULL) {
765
+ struct archive_read_filter *t = a->filter->upstream;
766
+ if (a->filter->close != NULL) {
767
+ int r1 = (a->filter->close)(a->filter);
768
+ if (r1 < r)
769
+ r = r1;
770
+ }
771
+ free(a->filter->buffer);
772
+ free(a->filter);
773
+ a->filter = t;
774
+ }
775
+ return r;
776
+ }
777
+
778
+ /*
779
+ * Release memory and other resources.
780
+ */
781
+ static int
782
+ _archive_read_finish(struct archive *_a)
783
+ {
784
+ struct archive_read *a = (struct archive_read *)_a;
785
+ int i;
786
+ int slots;
787
+ int r = ARCHIVE_OK;
788
+
789
+ __archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_ANY,
790
+ "archive_read_finish");
791
+ if (a->archive.state != ARCHIVE_STATE_CLOSED)
792
+ r = archive_read_close(&a->archive);
793
+
794
+ /* Cleanup format-specific data. */
795
+ slots = sizeof(a->formats) / sizeof(a->formats[0]);
796
+ for (i = 0; i < slots; i++) {
797
+ a->format = &(a->formats[i]);
798
+ if (a->formats[i].cleanup)
799
+ (a->formats[i].cleanup)(a);
800
+ }
801
+
802
+ archive_string_free(&a->archive.error_string);
803
+ if (a->entry)
804
+ archive_entry_free(a->entry);
805
+ a->archive.magic = 0;
806
+ free(a);
807
+ #if ARCHIVE_API_VERSION > 1
808
+ return (r);
809
+ #endif
810
+ }
811
+
812
+ /*
813
+ * Used internally by read format handlers to register their bid and
814
+ * initialization functions.
815
+ */
816
+ int
817
+ __archive_read_register_format(struct archive_read *a,
818
+ void *format_data,
819
+ const char *name,
820
+ int (*bid)(struct archive_read *),
821
+ int (*options)(struct archive_read *, const char *, const char *),
822
+ int (*read_header)(struct archive_read *, struct archive_entry *),
823
+ int (*read_data)(struct archive_read *, const void **, size_t *, off_t *),
824
+ int (*read_data_skip)(struct archive_read *),
825
+ int (*cleanup)(struct archive_read *))
826
+ {
827
+ int i, number_slots;
828
+
829
+ __archive_check_magic(&a->archive,
830
+ ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
831
+ "__archive_read_register_format");
832
+
833
+ number_slots = sizeof(a->formats) / sizeof(a->formats[0]);
834
+
835
+ for (i = 0; i < number_slots; i++) {
836
+ if (a->formats[i].bid == bid)
837
+ return (ARCHIVE_WARN); /* We've already installed */
838
+ if (a->formats[i].bid == NULL) {
839
+ a->formats[i].bid = bid;
840
+ a->formats[i].options = options;
841
+ a->formats[i].read_header = read_header;
842
+ a->formats[i].read_data = read_data;
843
+ a->formats[i].read_data_skip = read_data_skip;
844
+ a->formats[i].cleanup = cleanup;
845
+ a->formats[i].data = format_data;
846
+ a->formats[i].name = name;
847
+ return (ARCHIVE_OK);
848
+ }
849
+ }
850
+
851
+ __archive_errx(1, "Not enough slots for format registration");
852
+ return (ARCHIVE_FATAL); /* Never actually called. */
853
+ }
854
+
855
+ /*
856
+ * Used internally by decompression routines to register their bid and
857
+ * initialization functions.
858
+ */
859
+ struct archive_read_filter_bidder *
860
+ __archive_read_get_bidder(struct archive_read *a)
861
+ {
862
+ int i, number_slots;
863
+
864
+ __archive_check_magic(&a->archive,
865
+ ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
866
+ "__archive_read_get_bidder");
867
+
868
+ number_slots = sizeof(a->bidders) / sizeof(a->bidders[0]);
869
+
870
+ for (i = 0; i < number_slots; i++) {
871
+ if (a->bidders[i].bid == NULL) {
872
+ memset(a->bidders + i, 0, sizeof(a->bidders[0]));
873
+ return (a->bidders + i);
874
+ }
875
+ }
876
+
877
+ __archive_errx(1, "Not enough slots for compression registration");
878
+ return (NULL); /* Never actually executed. */
879
+ }
880
+
881
+ /*
882
+ * The next three functions comprise the peek/consume internal I/O
883
+ * system used by archive format readers. This system allows fairly
884
+ * flexible read-ahead and allows the I/O code to operate in a
885
+ * zero-copy manner most of the time.
886
+ *
887
+ * In the ideal case, filters generate blocks of data
888
+ * and __archive_read_ahead() just returns pointers directly into
889
+ * those blocks. Then __archive_read_consume() just bumps those
890
+ * pointers. Only if your request would span blocks does the I/O
891
+ * layer use a copy buffer to provide you with a contiguous block of
892
+ * data. The __archive_read_skip() is an optimization; it scans ahead
893
+ * very quickly (it usually translates into a seek() operation if
894
+ * you're reading uncompressed disk files).
895
+ *
896
+ * A couple of useful idioms:
897
+ * * "I just want some data." Ask for 1 byte and pay attention to
898
+ * the "number of bytes available" from __archive_read_ahead().
899
+ * You can consume more than you asked for; you just can't consume
900
+ * more than is available. If you consume everything that's
901
+ * immediately available, the next read_ahead() call will pull
902
+ * the next block.
903
+ * * "I want to output a large block of data." As above, ask for 1 byte,
904
+ * emit all that's available (up to whatever limit you have), then
905
+ * repeat until you're done.
906
+ * * "I want to peek ahead by a large amount." Ask for 4k or so, then
907
+ * double and repeat until you get an error or have enough. Note
908
+ * that the I/O layer will likely end up expanding its copy buffer
909
+ * to fit your request, so use this technique cautiously. This
910
+ * technique is used, for example, by some of the format tasting
911
+ * code that has uncertain look-ahead needs.
912
+ *
913
+ * TODO: Someday, provide a more generic __archive_read_seek() for
914
+ * those cases where it's useful. This is tricky because there are lots
915
+ * of cases where seek() is not available (reading gzip data from a
916
+ * network socket, for instance), so there needs to be a good way to
917
+ * communicate whether seek() is available and users of that interface
918
+ * need to use non-seeking strategies whenever seek() is not available.
919
+ */
920
+
921
+ /*
922
+ * Looks ahead in the input stream:
923
+ * * If 'avail' pointer is provided, that returns number of bytes available
924
+ * in the current buffer, which may be much larger than requested.
925
+ * * If end-of-file, *avail gets set to zero.
926
+ * * If error, *avail gets error code.
927
+ * * If request can be met, returns pointer to data, returns NULL
928
+ * if request is not met.
929
+ *
930
+ * Note: If you just want "some data", ask for 1 byte and pay attention
931
+ * to *avail, which will have the actual amount available. If you
932
+ * know exactly how many bytes you need, just ask for that and treat
933
+ * a NULL return as an error.
934
+ *
935
+ * Important: This does NOT move the file pointer. See
936
+ * __archive_read_consume() below.
937
+ */
938
+
939
+ /*
940
+ * This is tricky. We need to provide our clients with pointers to
941
+ * contiguous blocks of memory but we want to avoid copying whenever
942
+ * possible.
943
+ *
944
+ * Mostly, this code returns pointers directly into the block of data
945
+ * provided by the client_read routine. It can do this unless the
946
+ * request would split across blocks. In that case, we have to copy
947
+ * into an internal buffer to combine reads.
948
+ */
949
+ const void *
950
+ __archive_read_ahead(struct archive_read *a, size_t min, ssize_t *avail)
951
+ {
952
+ return (__archive_read_filter_ahead(a->filter, min, avail));
953
+ }
954
+
955
+ const void *
956
+ __archive_read_filter_ahead(struct archive_read_filter *filter,
957
+ size_t min, ssize_t *avail)
958
+ {
959
+ ssize_t bytes_read;
960
+ size_t tocopy;
961
+
962
+ if (filter->fatal) {
963
+ if (avail)
964
+ *avail = ARCHIVE_FATAL;
965
+ return (NULL);
966
+ }
967
+
968
+ /*
969
+ * Keep pulling more data until we can satisfy the request.
970
+ */
971
+ for (;;) {
972
+
973
+ /*
974
+ * If we can satisfy from the copy buffer (and the
975
+ * copy buffer isn't empty), we're done. In particular,
976
+ * note that min == 0 is a perfectly well-defined
977
+ * request.
978
+ */
979
+ if (filter->avail >= min && filter->avail > 0) {
980
+ if (avail != NULL)
981
+ *avail = filter->avail;
982
+ return (filter->next);
983
+ }
984
+
985
+ /*
986
+ * We can satisfy directly from client buffer if everything
987
+ * currently in the copy buffer is still in the client buffer.
988
+ */
989
+ if (filter->client_total >= filter->client_avail + filter->avail
990
+ && filter->client_avail + filter->avail >= min) {
991
+ /* "Roll back" to client buffer. */
992
+ filter->client_avail += filter->avail;
993
+ filter->client_next -= filter->avail;
994
+ /* Copy buffer is now empty. */
995
+ filter->avail = 0;
996
+ filter->next = filter->buffer;
997
+ /* Return data from client buffer. */
998
+ if (avail != NULL)
999
+ *avail = filter->client_avail;
1000
+ return (filter->client_next);
1001
+ }
1002
+
1003
+ /* Move data forward in copy buffer if necessary. */
1004
+ if (filter->next > filter->buffer &&
1005
+ filter->next + min > filter->buffer + filter->buffer_size) {
1006
+ if (filter->avail > 0)
1007
+ memmove(filter->buffer, filter->next, filter->avail);
1008
+ filter->next = filter->buffer;
1009
+ }
1010
+
1011
+ /* If we've used up the client data, get more. */
1012
+ if (filter->client_avail <= 0) {
1013
+ if (filter->end_of_file) {
1014
+ if (avail != NULL)
1015
+ *avail = 0;
1016
+ return (NULL);
1017
+ }
1018
+ bytes_read = (filter->read)(filter,
1019
+ &filter->client_buff);
1020
+ if (bytes_read < 0) { /* Read error. */
1021
+ filter->client_total = filter->client_avail = 0;
1022
+ filter->client_next = filter->client_buff = NULL;
1023
+ filter->fatal = 1;
1024
+ if (avail != NULL)
1025
+ *avail = ARCHIVE_FATAL;
1026
+ return (NULL);
1027
+ }
1028
+ if (bytes_read == 0) { /* Premature end-of-file. */
1029
+ filter->client_total = filter->client_avail = 0;
1030
+ filter->client_next = filter->client_buff = NULL;
1031
+ filter->end_of_file = 1;
1032
+ /* Return whatever we do have. */
1033
+ if (avail != NULL)
1034
+ *avail = filter->avail;
1035
+ return (NULL);
1036
+ }
1037
+ filter->position += bytes_read;
1038
+ filter->client_total = bytes_read;
1039
+ filter->client_avail = filter->client_total;
1040
+ filter->client_next = filter->client_buff;
1041
+ }
1042
+ else
1043
+ {
1044
+ /*
1045
+ * We can't satisfy the request from the copy
1046
+ * buffer or the existing client data, so we
1047
+ * need to copy more client data over to the
1048
+ * copy buffer.
1049
+ */
1050
+
1051
+ /* Ensure the buffer is big enough. */
1052
+ if (min > filter->buffer_size) {
1053
+ size_t s, t;
1054
+ char *p;
1055
+
1056
+ /* Double the buffer; watch for overflow. */
1057
+ s = t = filter->buffer_size;
1058
+ if (s == 0)
1059
+ s = min;
1060
+ while (s < min) {
1061
+ t *= 2;
1062
+ if (t <= s) { /* Integer overflow! */
1063
+ archive_set_error(
1064
+ &filter->archive->archive,
1065
+ ENOMEM,
1066
+ "Unable to allocate copy buffer");
1067
+ filter->fatal = 1;
1068
+ if (avail != NULL)
1069
+ *avail = ARCHIVE_FATAL;
1070
+ return (NULL);
1071
+ }
1072
+ s = t;
1073
+ }
1074
+ /* Now s >= min, so allocate a new buffer. */
1075
+ p = (char *)malloc(s);
1076
+ if (p == NULL) {
1077
+ archive_set_error(
1078
+ &filter->archive->archive,
1079
+ ENOMEM,
1080
+ "Unable to allocate copy buffer");
1081
+ filter->fatal = 1;
1082
+ if (avail != NULL)
1083
+ *avail = ARCHIVE_FATAL;
1084
+ return (NULL);
1085
+ }
1086
+ /* Move data into newly-enlarged buffer. */
1087
+ if (filter->avail > 0)
1088
+ memmove(p, filter->next, filter->avail);
1089
+ free(filter->buffer);
1090
+ filter->next = filter->buffer = p;
1091
+ filter->buffer_size = s;
1092
+ }
1093
+
1094
+ /* We can add client data to copy buffer. */
1095
+ /* First estimate: copy to fill rest of buffer. */
1096
+ tocopy = (filter->buffer + filter->buffer_size)
1097
+ - (filter->next + filter->avail);
1098
+ /* Don't waste time buffering more than we need to. */
1099
+ if (tocopy + filter->avail > min)
1100
+ tocopy = min - filter->avail;
1101
+ /* Don't copy more than is available. */
1102
+ if (tocopy > filter->client_avail)
1103
+ tocopy = filter->client_avail;
1104
+
1105
+ memcpy(filter->next + filter->avail, filter->client_next,
1106
+ tocopy);
1107
+ /* Remove this data from client buffer. */
1108
+ filter->client_next += tocopy;
1109
+ filter->client_avail -= tocopy;
1110
+ /* add it to copy buffer. */
1111
+ filter->avail += tocopy;
1112
+ }
1113
+ }
1114
+ }
1115
+
1116
+ /*
1117
+ * Move the file pointer forward. This should be called after
1118
+ * __archive_read_ahead() returns data to you. Don't try to move
1119
+ * ahead by more than the amount of data available according to
1120
+ * __archive_read_ahead().
1121
+ */
1122
+ /*
1123
+ * Mark the appropriate data as used. Note that the request here will
1124
+ * often be much smaller than the size of the previous read_ahead
1125
+ * request.
1126
+ */
1127
+ ssize_t
1128
+ __archive_read_consume(struct archive_read *a, size_t request)
1129
+ {
1130
+ ssize_t r;
1131
+ r = __archive_read_filter_consume(a->filter, request);
1132
+ a->archive.file_position += r;
1133
+ return (r);
1134
+ }
1135
+
1136
+ ssize_t
1137
+ __archive_read_filter_consume(struct archive_read_filter * filter,
1138
+ size_t request)
1139
+ {
1140
+ if (filter->avail > 0) {
1141
+ /* Read came from copy buffer. */
1142
+ filter->next += request;
1143
+ filter->avail -= request;
1144
+ } else {
1145
+ /* Read came from client buffer. */
1146
+ filter->client_next += request;
1147
+ filter->client_avail -= request;
1148
+ }
1149
+ return (request);
1150
+ }
1151
+
1152
+ /*
1153
+ * Move the file pointer ahead by an arbitrary amount. If you're
1154
+ * reading uncompressed data from a disk file, this will actually
1155
+ * translate into a seek() operation. Even in cases where seek()
1156
+ * isn't feasible, this at least pushes the read-and-discard loop
1157
+ * down closer to the data source.
1158
+ */
1159
+ int64_t
1160
+ __archive_read_skip(struct archive_read *a, int64_t request)
1161
+ {
1162
+ int64_t skipped = __archive_read_skip_lenient(a, request);
1163
+ if (skipped == request)
1164
+ return (skipped);
1165
+ /* We hit EOF before we satisfied the skip request. */
1166
+ if (skipped < 0) // Map error code to 0 for error message below.
1167
+ skipped = 0;
1168
+ archive_set_error(&a->archive,
1169
+ ARCHIVE_ERRNO_MISC,
1170
+ "Truncated input file (needed %jd bytes, only %jd available)",
1171
+ (intmax_t)request, (intmax_t)skipped);
1172
+ return (ARCHIVE_FATAL);
1173
+ }
1174
+
1175
+ int64_t
1176
+ __archive_read_skip_lenient(struct archive_read *a, int64_t request)
1177
+ {
1178
+ int64_t skipped = __archive_read_filter_skip(a->filter, request);
1179
+ if (skipped > 0)
1180
+ a->archive.file_position += skipped;
1181
+ return (skipped);
1182
+ }
1183
+
1184
+ int64_t
1185
+ __archive_read_filter_skip(struct archive_read_filter *filter, int64_t request)
1186
+ {
1187
+ int64_t bytes_skipped, total_bytes_skipped = 0;
1188
+ size_t min;
1189
+
1190
+ if (filter->fatal)
1191
+ return (-1);
1192
+ /*
1193
+ * If there is data in the buffers already, use that first.
1194
+ */
1195
+ if (filter->avail > 0) {
1196
+ min = minimum(request, (off_t)filter->avail);
1197
+ bytes_skipped = __archive_read_filter_consume(filter, min);
1198
+ request -= bytes_skipped;
1199
+ total_bytes_skipped += bytes_skipped;
1200
+ }
1201
+ if (filter->client_avail > 0) {
1202
+ min = minimum(request, (int64_t)filter->client_avail);
1203
+ bytes_skipped = __archive_read_filter_consume(filter, min);
1204
+ request -= bytes_skipped;
1205
+ total_bytes_skipped += bytes_skipped;
1206
+ }
1207
+ if (request == 0)
1208
+ return (total_bytes_skipped);
1209
+ /*
1210
+ * If a client_skipper was provided, try that first.
1211
+ */
1212
+ #if ARCHIVE_API_VERSION < 2
1213
+ if ((filter->skip != NULL) && (request < SSIZE_MAX)) {
1214
+ #else
1215
+ if (filter->skip != NULL) {
1216
+ #endif
1217
+ bytes_skipped = (filter->skip)(filter, request);
1218
+ if (bytes_skipped < 0) { /* error */
1219
+ filter->client_total = filter->client_avail = 0;
1220
+ filter->client_next = filter->client_buff = NULL;
1221
+ filter->fatal = 1;
1222
+ return (bytes_skipped);
1223
+ }
1224
+ total_bytes_skipped += bytes_skipped;
1225
+ request -= bytes_skipped;
1226
+ filter->client_next = filter->client_buff;
1227
+ filter->client_avail = filter->client_total = 0;
1228
+ }
1229
+ /*
1230
+ * Note that client_skipper will usually not satisfy the
1231
+ * full request (due to low-level blocking concerns),
1232
+ * so even if client_skipper is provided, we may still
1233
+ * have to use ordinary reads to finish out the request.
1234
+ */
1235
+ while (request > 0) {
1236
+ ssize_t bytes_read;
1237
+ (void)__archive_read_filter_ahead(filter, 1, &bytes_read);
1238
+ if (bytes_read < 0)
1239
+ return (bytes_read);
1240
+ if (bytes_read == 0) {
1241
+ return (total_bytes_skipped);
1242
+ }
1243
+ min = (size_t)(minimum(bytes_read, request));
1244
+ bytes_read = __archive_read_filter_consume(filter, min);
1245
+ total_bytes_skipped += bytes_read;
1246
+ request -= bytes_read;
1247
+ }
1248
+ return (total_bytes_skipped);
1249
+ }