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,438 @@
1
+ /*-
2
+ * Copyright (c) 2009 Michihiro NAKAJIMA
3
+ * Copyright (c) 2003-2007 Tim Kientzle
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions
8
+ * are met:
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * 2. Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ *
15
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ */
26
+
27
+ #include "archive_platform.h"
28
+
29
+ __FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_xz.c 201108 2009-12-28 03:28:21Z kientzle $");
30
+
31
+ #ifdef HAVE_ERRNO_H
32
+ #include <errno.h>
33
+ #endif
34
+ #ifdef HAVE_STDLIB_H
35
+ #include <stdlib.h>
36
+ #endif
37
+ #ifdef HAVE_STRING_H
38
+ #include <string.h>
39
+ #endif
40
+ #include <time.h>
41
+ #ifdef HAVE_LZMA_H
42
+ #include <lzma.h>
43
+ #endif
44
+
45
+ #include "archive.h"
46
+ #include "archive_private.h"
47
+ #include "archive_write_private.h"
48
+
49
+ #ifndef HAVE_LZMA_H
50
+ int
51
+ archive_write_set_compression_xz(struct archive *a)
52
+ {
53
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
54
+ "xz compression not supported on this platform");
55
+ return (ARCHIVE_FATAL);
56
+ }
57
+
58
+ int
59
+ archive_write_set_compression_lzma(struct archive *a)
60
+ {
61
+ archive_set_error(a, ARCHIVE_ERRNO_MISC,
62
+ "lzma compression not supported on this platform");
63
+ return (ARCHIVE_FATAL);
64
+ }
65
+ #else
66
+ /* Don't compile this if we don't have liblzma. */
67
+
68
+ struct private_data {
69
+ lzma_stream stream;
70
+ lzma_filter lzmafilters[2];
71
+ lzma_options_lzma lzma_opt;
72
+ int64_t total_in;
73
+ unsigned char *compressed;
74
+ size_t compressed_buffer_size;
75
+ };
76
+
77
+ struct private_config {
78
+ int compression_level;
79
+ };
80
+
81
+ static int archive_compressor_xz_init(struct archive_write *);
82
+ static int archive_compressor_xz_options(struct archive_write *,
83
+ const char *, const char *);
84
+ static int archive_compressor_xz_finish(struct archive_write *);
85
+ static int archive_compressor_xz_write(struct archive_write *,
86
+ const void *, size_t);
87
+ static int drive_compressor(struct archive_write *, struct private_data *,
88
+ int finishing);
89
+
90
+
91
+ /*
92
+ * Allocate, initialize and return a archive object.
93
+ */
94
+ int
95
+ archive_write_set_compression_xz(struct archive *_a)
96
+ {
97
+ struct private_config *config;
98
+ struct archive_write *a = (struct archive_write *)_a;
99
+ __archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC,
100
+ ARCHIVE_STATE_NEW, "archive_write_set_compression_xz");
101
+ config = calloc(1, sizeof(*config));
102
+ if (config == NULL) {
103
+ archive_set_error(&a->archive, ENOMEM, "Out of memory");
104
+ return (ARCHIVE_FATAL);
105
+ }
106
+ a->compressor.config = config;
107
+ a->compressor.finish = archive_compressor_xz_finish;
108
+ config->compression_level = LZMA_PRESET_DEFAULT;
109
+ a->compressor.init = &archive_compressor_xz_init;
110
+ a->compressor.options = &archive_compressor_xz_options;
111
+ a->archive.compression_code = ARCHIVE_COMPRESSION_XZ;
112
+ a->archive.compression_name = "xz";
113
+ return (ARCHIVE_OK);
114
+ }
115
+
116
+ /* LZMA is handled identically, we just need a different compression
117
+ * code set. (The liblzma setup looks at the code to determine
118
+ * the one place that XZ and LZMA require different handling.) */
119
+ int
120
+ archive_write_set_compression_lzma(struct archive *_a)
121
+ {
122
+ struct archive_write *a = (struct archive_write *)_a;
123
+ int r = archive_write_set_compression_xz(_a);
124
+ if (r != ARCHIVE_OK)
125
+ return (r);
126
+ a->archive.compression_code = ARCHIVE_COMPRESSION_LZMA;
127
+ a->archive.compression_name = "lzma";
128
+ return (ARCHIVE_OK);
129
+ }
130
+
131
+ static int
132
+ archive_compressor_xz_init_stream(struct archive_write *a,
133
+ struct private_data *state)
134
+ {
135
+ int ret;
136
+
137
+ state->stream = (lzma_stream)LZMA_STREAM_INIT;
138
+ state->stream.next_out = state->compressed;
139
+ state->stream.avail_out = state->compressed_buffer_size;
140
+ if (a->archive.compression_code == ARCHIVE_COMPRESSION_XZ)
141
+ ret = lzma_stream_encoder(&(state->stream),
142
+ state->lzmafilters, LZMA_CHECK_CRC64);
143
+ else
144
+ ret = lzma_alone_encoder(&(state->stream), &state->lzma_opt);
145
+ if (ret == LZMA_OK)
146
+ return (ARCHIVE_OK);
147
+
148
+ switch (ret) {
149
+ case LZMA_MEM_ERROR:
150
+ archive_set_error(&a->archive, ENOMEM,
151
+ "Internal error initializing compression library: "
152
+ "Cannot allocate memory");
153
+ break;
154
+ default:
155
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
156
+ "Internal error initializing compression library: "
157
+ "It's a bug in liblzma");
158
+ break;
159
+ }
160
+ return (ARCHIVE_FATAL);
161
+ }
162
+
163
+ /*
164
+ * Setup callback.
165
+ */
166
+ static int
167
+ archive_compressor_xz_init(struct archive_write *a)
168
+ {
169
+ int ret;
170
+ struct private_data *state;
171
+ struct private_config *config;
172
+
173
+ if (a->client_opener != NULL) {
174
+ ret = (a->client_opener)(&a->archive, a->client_data);
175
+ if (ret != ARCHIVE_OK)
176
+ return (ret);
177
+ }
178
+
179
+ state = (struct private_data *)malloc(sizeof(*state));
180
+ if (state == NULL) {
181
+ archive_set_error(&a->archive, ENOMEM,
182
+ "Can't allocate data for compression");
183
+ return (ARCHIVE_FATAL);
184
+ }
185
+ memset(state, 0, sizeof(*state));
186
+ config = a->compressor.config;
187
+
188
+ /*
189
+ * See comment above. We should set compressed_buffer_size to
190
+ * max(bytes_per_block, 65536), but the code can't handle that yet.
191
+ */
192
+ state->compressed_buffer_size = a->bytes_per_block;
193
+ state->compressed = (unsigned char *)malloc(state->compressed_buffer_size);
194
+ if (state->compressed == NULL) {
195
+ archive_set_error(&a->archive, ENOMEM,
196
+ "Can't allocate data for compression buffer");
197
+ free(state);
198
+ return (ARCHIVE_FATAL);
199
+ }
200
+ a->compressor.write = archive_compressor_xz_write;
201
+
202
+ /* Initialize compression library. */
203
+ if (lzma_lzma_preset(&state->lzma_opt, config->compression_level)) {
204
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
205
+ "Internal error initializing compression library");
206
+ free(state->compressed);
207
+ free(state);
208
+ }
209
+ state->lzmafilters[0].id = LZMA_FILTER_LZMA2;
210
+ state->lzmafilters[0].options = &state->lzma_opt;
211
+ state->lzmafilters[1].id = LZMA_VLI_UNKNOWN;/* Terminate */
212
+ ret = archive_compressor_xz_init_stream(a, state);
213
+ if (ret == LZMA_OK) {
214
+ a->compressor.data = state;
215
+ return (0);
216
+ }
217
+ /* Library setup failed: clean up. */
218
+ free(state->compressed);
219
+ free(state);
220
+
221
+ return (ARCHIVE_FATAL);
222
+ }
223
+
224
+ /*
225
+ * Set write options.
226
+ */
227
+ static int
228
+ archive_compressor_xz_options(struct archive_write *a, const char *key,
229
+ const char *value)
230
+ {
231
+ struct private_config *config;
232
+
233
+ config = (struct private_config *)a->compressor.config;
234
+ if (strcmp(key, "compression-level") == 0) {
235
+ if (value == NULL || !(value[0] >= '0' && value[0] <= '9') ||
236
+ value[1] != '\0')
237
+ return (ARCHIVE_WARN);
238
+ config->compression_level = value[0] - '0';
239
+ if (config->compression_level > 6)
240
+ config->compression_level = 6;
241
+ return (ARCHIVE_OK);
242
+ }
243
+
244
+ return (ARCHIVE_WARN);
245
+ }
246
+
247
+ /*
248
+ * Write data to the compressed stream.
249
+ */
250
+ static int
251
+ archive_compressor_xz_write(struct archive_write *a, const void *buff,
252
+ size_t length)
253
+ {
254
+ struct private_data *state;
255
+ int ret;
256
+
257
+ state = (struct private_data *)a->compressor.data;
258
+ if (a->client_writer == NULL) {
259
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
260
+ "No write callback is registered? "
261
+ "This is probably an internal programming error.");
262
+ return (ARCHIVE_FATAL);
263
+ }
264
+
265
+ /* Update statistics */
266
+ state->total_in += length;
267
+
268
+ /* Compress input data to output buffer */
269
+ state->stream.next_in = buff;
270
+ state->stream.avail_in = length;
271
+ if ((ret = drive_compressor(a, state, 0)) != ARCHIVE_OK)
272
+ return (ret);
273
+
274
+ a->archive.file_position += length;
275
+ return (ARCHIVE_OK);
276
+ }
277
+
278
+
279
+ /*
280
+ * Finish the compression...
281
+ */
282
+ static int
283
+ archive_compressor_xz_finish(struct archive_write *a)
284
+ {
285
+ ssize_t block_length, target_block_length, bytes_written;
286
+ int ret;
287
+ struct private_data *state;
288
+ unsigned tocopy;
289
+
290
+ ret = ARCHIVE_OK;
291
+ state = (struct private_data *)a->compressor.data;
292
+ if (state != NULL) {
293
+ if (a->client_writer == NULL) {
294
+ archive_set_error(&a->archive,
295
+ ARCHIVE_ERRNO_PROGRAMMER,
296
+ "No write callback is registered? "
297
+ "This is probably an internal programming error.");
298
+ ret = ARCHIVE_FATAL;
299
+ goto cleanup;
300
+ }
301
+
302
+ /* By default, always pad the uncompressed data. */
303
+ if (a->pad_uncompressed) {
304
+ tocopy = a->bytes_per_block -
305
+ (state->total_in % a->bytes_per_block);
306
+ while (tocopy > 0 && tocopy < (unsigned)a->bytes_per_block) {
307
+ state->stream.next_in = a->nulls;
308
+ state->stream.avail_in = tocopy < a->null_length ?
309
+ tocopy : a->null_length;
310
+ state->total_in += state->stream.avail_in;
311
+ tocopy -= state->stream.avail_in;
312
+ ret = drive_compressor(a, state, 0);
313
+ if (ret != ARCHIVE_OK)
314
+ goto cleanup;
315
+ }
316
+ }
317
+
318
+ /* Finish compression cycle */
319
+ if (((ret = drive_compressor(a, state, 1))) != ARCHIVE_OK)
320
+ goto cleanup;
321
+
322
+ /* Optionally, pad the final compressed block. */
323
+ block_length = state->stream.next_out - state->compressed;
324
+
325
+ /* Tricky calculation to determine size of last block. */
326
+ if (a->bytes_in_last_block <= 0)
327
+ /* Default or Zero: pad to full block */
328
+ target_block_length = a->bytes_per_block;
329
+ else
330
+ /* Round length to next multiple of bytes_in_last_block. */
331
+ target_block_length = a->bytes_in_last_block *
332
+ ( (block_length + a->bytes_in_last_block - 1) /
333
+ a->bytes_in_last_block);
334
+ if (target_block_length > a->bytes_per_block)
335
+ target_block_length = a->bytes_per_block;
336
+ if (block_length < target_block_length) {
337
+ memset(state->stream.next_out, 0,
338
+ target_block_length - block_length);
339
+ block_length = target_block_length;
340
+ }
341
+
342
+ /* Write the last block */
343
+ bytes_written = (a->client_writer)(&a->archive, a->client_data,
344
+ state->compressed, block_length);
345
+ if (bytes_written <= 0) {
346
+ ret = ARCHIVE_FATAL;
347
+ goto cleanup;
348
+ }
349
+ a->archive.raw_position += bytes_written;
350
+
351
+ /* Cleanup: shut down compressor, release memory, etc. */
352
+ cleanup:
353
+ lzma_end(&(state->stream));
354
+ free(state->compressed);
355
+ free(state);
356
+ }
357
+ free(a->compressor.config);
358
+ a->compressor.config = NULL;
359
+ return (ret);
360
+ }
361
+
362
+ /*
363
+ * Utility function to push input data through compressor,
364
+ * writing full output blocks as necessary.
365
+ *
366
+ * Note that this handles both the regular write case (finishing ==
367
+ * false) and the end-of-archive case (finishing == true).
368
+ */
369
+ static int
370
+ drive_compressor(struct archive_write *a, struct private_data *state, int finishing)
371
+ {
372
+ ssize_t bytes_written;
373
+ int ret;
374
+
375
+ for (;;) {
376
+ if (state->stream.avail_out == 0) {
377
+ bytes_written = (a->client_writer)(&a->archive,
378
+ a->client_data, state->compressed,
379
+ state->compressed_buffer_size);
380
+ if (bytes_written <= 0) {
381
+ /* TODO: Handle this write failure */
382
+ return (ARCHIVE_FATAL);
383
+ } else if ((size_t)bytes_written < state->compressed_buffer_size) {
384
+ /* Short write: Move remaining to
385
+ * front of block and keep filling */
386
+ memmove(state->compressed,
387
+ state->compressed + bytes_written,
388
+ state->compressed_buffer_size - bytes_written);
389
+ }
390
+ a->archive.raw_position += bytes_written;
391
+ state->stream.next_out
392
+ = state->compressed +
393
+ state->compressed_buffer_size - bytes_written;
394
+ state->stream.avail_out = bytes_written;
395
+ }
396
+
397
+ /* If there's nothing to do, we're done. */
398
+ if (!finishing && state->stream.avail_in == 0)
399
+ return (ARCHIVE_OK);
400
+
401
+ ret = lzma_code(&(state->stream),
402
+ finishing ? LZMA_FINISH : LZMA_RUN );
403
+
404
+ switch (ret) {
405
+ case LZMA_OK:
406
+ /* In non-finishing case, check if compressor
407
+ * consumed everything */
408
+ if (!finishing && state->stream.avail_in == 0)
409
+ return (ARCHIVE_OK);
410
+ /* In finishing case, this return always means
411
+ * there's more work */
412
+ break;
413
+ case LZMA_STREAM_END:
414
+ /* This return can only occur in finishing case. */
415
+ if (finishing)
416
+ return (ARCHIVE_OK);
417
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
418
+ "lzma compression data error");
419
+ return (ARCHIVE_FATAL);
420
+ case LZMA_MEMLIMIT_ERROR:
421
+ archive_set_error(&a->archive, ENOMEM,
422
+ "lzma compression error: "
423
+ "%ju MiB would have been needed",
424
+ (lzma_memusage(&(state->stream)) + 1024 * 1024 -1)
425
+ / (1024 * 1024));
426
+ return (ARCHIVE_FATAL);
427
+ default:
428
+ /* Any other return value indicates an error. */
429
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
430
+ "lzma compression failed:"
431
+ " lzma_code() call returned status %d",
432
+ ret);
433
+ return (ARCHIVE_FATAL);
434
+ }
435
+ }
436
+ }
437
+
438
+ #endif /* HAVE_LZMA_H */
@@ -0,0 +1,72 @@
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
+ #include "archive_platform.h"
27
+ __FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format.c 201168 2009-12-29 06:15:32Z kientzle $");
28
+
29
+ #ifdef HAVE_SYS_TYPES_H
30
+ #include <sys/types.h>
31
+ #endif
32
+
33
+ #ifdef HAVE_ERRNO_H
34
+ #include <errno.h>
35
+ #endif
36
+
37
+ #include "archive.h"
38
+ #include "archive_private.h"
39
+
40
+ /* A table that maps format codes to functions. */
41
+ static
42
+ struct { int code; int (*setter)(struct archive *); } codes[] =
43
+ {
44
+ { ARCHIVE_FORMAT_CPIO, archive_write_set_format_cpio },
45
+ { ARCHIVE_FORMAT_CPIO_SVR4_NOCRC, archive_write_set_format_cpio_newc },
46
+ { ARCHIVE_FORMAT_CPIO_POSIX, archive_write_set_format_cpio },
47
+ { ARCHIVE_FORMAT_MTREE, archive_write_set_format_mtree },
48
+ { ARCHIVE_FORMAT_SHAR, archive_write_set_format_shar },
49
+ { ARCHIVE_FORMAT_SHAR_BASE, archive_write_set_format_shar },
50
+ { ARCHIVE_FORMAT_SHAR_DUMP, archive_write_set_format_shar_dump },
51
+ { ARCHIVE_FORMAT_TAR, archive_write_set_format_pax_restricted },
52
+ { ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE, archive_write_set_format_pax },
53
+ { ARCHIVE_FORMAT_TAR_PAX_RESTRICTED,
54
+ archive_write_set_format_pax_restricted },
55
+ { ARCHIVE_FORMAT_TAR_USTAR, archive_write_set_format_ustar },
56
+ { ARCHIVE_FORMAT_ZIP, archive_write_set_format_zip },
57
+ { 0, NULL }
58
+ };
59
+
60
+ int
61
+ archive_write_set_format(struct archive *a, int code)
62
+ {
63
+ int i;
64
+
65
+ for (i = 0; codes[i].code != 0; i++) {
66
+ if (code == codes[i].code)
67
+ return ((codes[i].setter)(a));
68
+ }
69
+
70
+ archive_set_error(a, EINVAL, "No such format");
71
+ return (ARCHIVE_FATAL);
72
+ }