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,777 @@
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_read_support_format_cpio.c 201163 2009-12-29 05:50:34Z kientzle $");
28
+
29
+ #ifdef HAVE_ERRNO_H
30
+ #include <errno.h>
31
+ #endif
32
+ /* #include <stdint.h> */ /* See archive_platform.h */
33
+ #ifdef HAVE_STDLIB_H
34
+ #include <stdlib.h>
35
+ #endif
36
+ #ifdef HAVE_STRING_H
37
+ #include <string.h>
38
+ #endif
39
+
40
+ #include "archive.h"
41
+ #include "archive_entry.h"
42
+ #include "archive_private.h"
43
+ #include "archive_read_private.h"
44
+
45
+ struct cpio_bin_header {
46
+ unsigned char c_magic[2];
47
+ unsigned char c_dev[2];
48
+ unsigned char c_ino[2];
49
+ unsigned char c_mode[2];
50
+ unsigned char c_uid[2];
51
+ unsigned char c_gid[2];
52
+ unsigned char c_nlink[2];
53
+ unsigned char c_rdev[2];
54
+ unsigned char c_mtime[4];
55
+ unsigned char c_namesize[2];
56
+ unsigned char c_filesize[4];
57
+ };
58
+
59
+ struct cpio_odc_header {
60
+ char c_magic[6];
61
+ char c_dev[6];
62
+ char c_ino[6];
63
+ char c_mode[6];
64
+ char c_uid[6];
65
+ char c_gid[6];
66
+ char c_nlink[6];
67
+ char c_rdev[6];
68
+ char c_mtime[11];
69
+ char c_namesize[6];
70
+ char c_filesize[11];
71
+ };
72
+
73
+ struct cpio_newc_header {
74
+ char c_magic[6];
75
+ char c_ino[8];
76
+ char c_mode[8];
77
+ char c_uid[8];
78
+ char c_gid[8];
79
+ char c_nlink[8];
80
+ char c_mtime[8];
81
+ char c_filesize[8];
82
+ char c_devmajor[8];
83
+ char c_devminor[8];
84
+ char c_rdevmajor[8];
85
+ char c_rdevminor[8];
86
+ char c_namesize[8];
87
+ char c_crc[8];
88
+ };
89
+
90
+ struct links_entry {
91
+ struct links_entry *next;
92
+ struct links_entry *previous;
93
+ int links;
94
+ dev_t dev;
95
+ int64_t ino;
96
+ char *name;
97
+ };
98
+
99
+ #define CPIO_MAGIC 0x13141516
100
+ struct cpio {
101
+ int magic;
102
+ int (*read_header)(struct archive_read *, struct cpio *,
103
+ struct archive_entry *, size_t *, size_t *);
104
+ struct links_entry *links_head;
105
+ struct archive_string entry_name;
106
+ struct archive_string entry_linkname;
107
+ off_t entry_bytes_remaining;
108
+ off_t entry_offset;
109
+ off_t entry_padding;
110
+ };
111
+
112
+ static int64_t atol16(const char *, unsigned);
113
+ static int64_t atol8(const char *, unsigned);
114
+ static int archive_read_format_cpio_bid(struct archive_read *);
115
+ static int archive_read_format_cpio_cleanup(struct archive_read *);
116
+ static int archive_read_format_cpio_read_data(struct archive_read *,
117
+ const void **, size_t *, off_t *);
118
+ static int archive_read_format_cpio_read_header(struct archive_read *,
119
+ struct archive_entry *);
120
+ static int be4(const unsigned char *);
121
+ static int find_odc_header(struct archive_read *);
122
+ static int find_newc_header(struct archive_read *);
123
+ static int header_bin_be(struct archive_read *, struct cpio *,
124
+ struct archive_entry *, size_t *, size_t *);
125
+ static int header_bin_le(struct archive_read *, struct cpio *,
126
+ struct archive_entry *, size_t *, size_t *);
127
+ static int header_newc(struct archive_read *, struct cpio *,
128
+ struct archive_entry *, size_t *, size_t *);
129
+ static int header_odc(struct archive_read *, struct cpio *,
130
+ struct archive_entry *, size_t *, size_t *);
131
+ static int is_octal(const char *, size_t);
132
+ static int is_hex(const char *, size_t);
133
+ static int le4(const unsigned char *);
134
+ static void record_hardlink(struct cpio *cpio, struct archive_entry *entry);
135
+
136
+ int
137
+ archive_read_support_format_cpio(struct archive *_a)
138
+ {
139
+ struct archive_read *a = (struct archive_read *)_a;
140
+ struct cpio *cpio;
141
+ int r;
142
+
143
+ cpio = (struct cpio *)malloc(sizeof(*cpio));
144
+ if (cpio == NULL) {
145
+ archive_set_error(&a->archive, ENOMEM, "Can't allocate cpio data");
146
+ return (ARCHIVE_FATAL);
147
+ }
148
+ memset(cpio, 0, sizeof(*cpio));
149
+ cpio->magic = CPIO_MAGIC;
150
+
151
+ r = __archive_read_register_format(a,
152
+ cpio,
153
+ "cpio",
154
+ archive_read_format_cpio_bid,
155
+ NULL,
156
+ archive_read_format_cpio_read_header,
157
+ archive_read_format_cpio_read_data,
158
+ NULL,
159
+ archive_read_format_cpio_cleanup);
160
+
161
+ if (r != ARCHIVE_OK)
162
+ free(cpio);
163
+ return (ARCHIVE_OK);
164
+ }
165
+
166
+
167
+ static int
168
+ archive_read_format_cpio_bid(struct archive_read *a)
169
+ {
170
+ const void *h;
171
+ const unsigned char *p;
172
+ struct cpio *cpio;
173
+ int bid;
174
+
175
+ cpio = (struct cpio *)(a->format->data);
176
+
177
+ if ((h = __archive_read_ahead(a, 6, NULL)) == NULL)
178
+ return (-1);
179
+
180
+ p = (const unsigned char *)h;
181
+ bid = 0;
182
+ if (memcmp(p, "070707", 6) == 0) {
183
+ /* ASCII cpio archive (odc, POSIX.1) */
184
+ cpio->read_header = header_odc;
185
+ bid += 48;
186
+ /*
187
+ * XXX TODO: More verification; Could check that only octal
188
+ * digits appear in appropriate header locations. XXX
189
+ */
190
+ } else if (memcmp(p, "070701", 6) == 0) {
191
+ /* ASCII cpio archive (SVR4 without CRC) */
192
+ cpio->read_header = header_newc;
193
+ bid += 48;
194
+ /*
195
+ * XXX TODO: More verification; Could check that only hex
196
+ * digits appear in appropriate header locations. XXX
197
+ */
198
+ } else if (memcmp(p, "070702", 6) == 0) {
199
+ /* ASCII cpio archive (SVR4 with CRC) */
200
+ /* XXX TODO: Flag that we should check the CRC. XXX */
201
+ cpio->read_header = header_newc;
202
+ bid += 48;
203
+ /*
204
+ * XXX TODO: More verification; Could check that only hex
205
+ * digits appear in appropriate header locations. XXX
206
+ */
207
+ } else if (p[0] * 256 + p[1] == 070707) {
208
+ /* big-endian binary cpio archives */
209
+ cpio->read_header = header_bin_be;
210
+ bid += 16;
211
+ /* Is more verification possible here? */
212
+ } else if (p[0] + p[1] * 256 == 070707) {
213
+ /* little-endian binary cpio archives */
214
+ cpio->read_header = header_bin_le;
215
+ bid += 16;
216
+ /* Is more verification possible here? */
217
+ } else
218
+ return (ARCHIVE_WARN);
219
+
220
+ return (bid);
221
+ }
222
+
223
+ static int
224
+ archive_read_format_cpio_read_header(struct archive_read *a,
225
+ struct archive_entry *entry)
226
+ {
227
+ struct cpio *cpio;
228
+ const void *h;
229
+ size_t namelength;
230
+ size_t name_pad;
231
+ int r;
232
+
233
+ cpio = (struct cpio *)(a->format->data);
234
+ r = (cpio->read_header(a, cpio, entry, &namelength, &name_pad));
235
+
236
+ if (r < ARCHIVE_WARN)
237
+ return (r);
238
+
239
+ /* Read name from buffer. */
240
+ h = __archive_read_ahead(a, namelength + name_pad, NULL);
241
+ if (h == NULL)
242
+ return (ARCHIVE_FATAL);
243
+ __archive_read_consume(a, namelength + name_pad);
244
+ archive_strncpy(&cpio->entry_name, (const char *)h, namelength);
245
+ archive_entry_set_pathname(entry, cpio->entry_name.s);
246
+ cpio->entry_offset = 0;
247
+
248
+ /* If this is a symlink, read the link contents. */
249
+ if (archive_entry_filetype(entry) == AE_IFLNK) {
250
+ h = __archive_read_ahead(a, cpio->entry_bytes_remaining, NULL);
251
+ if (h == NULL)
252
+ return (ARCHIVE_FATAL);
253
+ __archive_read_consume(a, cpio->entry_bytes_remaining);
254
+ archive_strncpy(&cpio->entry_linkname, (const char *)h,
255
+ cpio->entry_bytes_remaining);
256
+ archive_entry_set_symlink(entry, cpio->entry_linkname.s);
257
+ cpio->entry_bytes_remaining = 0;
258
+ }
259
+
260
+ /* XXX TODO: If the full mode is 0160200, then this is a Solaris
261
+ * ACL description for the following entry. Read this body
262
+ * and parse it as a Solaris-style ACL, then read the next
263
+ * header. XXX */
264
+
265
+ /* Compare name to "TRAILER!!!" to test for end-of-archive. */
266
+ if (namelength == 11 && strcmp((const char *)h, "TRAILER!!!") == 0) {
267
+ /* TODO: Store file location of start of block. */
268
+ archive_set_error(&a->archive, 0, NULL);
269
+ return (ARCHIVE_EOF);
270
+ }
271
+
272
+ /* Detect and record hardlinks to previously-extracted entries. */
273
+ record_hardlink(cpio, entry);
274
+
275
+ return (r);
276
+ }
277
+
278
+ static int
279
+ archive_read_format_cpio_read_data(struct archive_read *a,
280
+ const void **buff, size_t *size, off_t *offset)
281
+ {
282
+ ssize_t bytes_read;
283
+ struct cpio *cpio;
284
+
285
+ cpio = (struct cpio *)(a->format->data);
286
+ if (cpio->entry_bytes_remaining > 0) {
287
+ *buff = __archive_read_ahead(a, 1, &bytes_read);
288
+ if (bytes_read <= 0)
289
+ return (ARCHIVE_FATAL);
290
+ if (bytes_read > cpio->entry_bytes_remaining)
291
+ bytes_read = cpio->entry_bytes_remaining;
292
+ *size = bytes_read;
293
+ *offset = cpio->entry_offset;
294
+ cpio->entry_offset += bytes_read;
295
+ cpio->entry_bytes_remaining -= bytes_read;
296
+ __archive_read_consume(a, bytes_read);
297
+ return (ARCHIVE_OK);
298
+ } else {
299
+ while (cpio->entry_padding > 0) {
300
+ *buff = __archive_read_ahead(a, 1, &bytes_read);
301
+ if (bytes_read <= 0)
302
+ return (ARCHIVE_FATAL);
303
+ if (bytes_read > cpio->entry_padding)
304
+ bytes_read = cpio->entry_padding;
305
+ __archive_read_consume(a, bytes_read);
306
+ cpio->entry_padding -= bytes_read;
307
+ }
308
+ *buff = NULL;
309
+ *size = 0;
310
+ *offset = cpio->entry_offset;
311
+ return (ARCHIVE_EOF);
312
+ }
313
+ }
314
+
315
+ /*
316
+ * Skip forward to the next cpio newc header by searching for the
317
+ * 07070[12] string. This should be generalized and merged with
318
+ * find_odc_header below.
319
+ */
320
+ static int
321
+ is_hex(const char *p, size_t len)
322
+ {
323
+ while (len-- > 0) {
324
+ if ((*p >= '0' && *p <= '9')
325
+ || (*p >= 'a' && *p <= 'f')
326
+ || (*p >= 'A' && *p <= 'F'))
327
+ ++p;
328
+ else
329
+ return (0);
330
+ }
331
+ return (1);
332
+ }
333
+
334
+ static int
335
+ find_newc_header(struct archive_read *a)
336
+ {
337
+ const void *h;
338
+ const char *p, *q;
339
+ size_t skip, skipped = 0;
340
+ ssize_t bytes;
341
+
342
+ for (;;) {
343
+ h = __archive_read_ahead(a, sizeof(struct cpio_newc_header), &bytes);
344
+ if (h == NULL)
345
+ return (ARCHIVE_FATAL);
346
+ p = h;
347
+ q = p + bytes;
348
+
349
+ /* Try the typical case first, then go into the slow search.*/
350
+ if (memcmp("07070", p, 5) == 0
351
+ && (p[5] == '1' || p[5] == '2')
352
+ && is_hex(p, sizeof(struct cpio_newc_header)))
353
+ return (ARCHIVE_OK);
354
+
355
+ /*
356
+ * Scan ahead until we find something that looks
357
+ * like an odc header.
358
+ */
359
+ while (p + sizeof(struct cpio_newc_header) <= q) {
360
+ switch (p[5]) {
361
+ case '1':
362
+ case '2':
363
+ if (memcmp("07070", p, 5) == 0
364
+ && is_hex(p, sizeof(struct cpio_newc_header))) {
365
+ skip = p - (const char *)h;
366
+ __archive_read_consume(a, skip);
367
+ skipped += skip;
368
+ if (skipped > 0) {
369
+ archive_set_error(&a->archive,
370
+ 0,
371
+ "Skipped %d bytes before "
372
+ "finding valid header",
373
+ (int)skipped);
374
+ return (ARCHIVE_WARN);
375
+ }
376
+ return (ARCHIVE_OK);
377
+ }
378
+ p += 2;
379
+ break;
380
+ case '0':
381
+ p++;
382
+ break;
383
+ default:
384
+ p += 6;
385
+ break;
386
+ }
387
+ }
388
+ skip = p - (const char *)h;
389
+ __archive_read_consume(a, skip);
390
+ skipped += skip;
391
+ }
392
+ }
393
+
394
+ static int
395
+ header_newc(struct archive_read *a, struct cpio *cpio,
396
+ struct archive_entry *entry, size_t *namelength, size_t *name_pad)
397
+ {
398
+ const void *h;
399
+ const struct cpio_newc_header *header;
400
+ int r;
401
+
402
+ r = find_newc_header(a);
403
+ if (r < ARCHIVE_WARN)
404
+ return (r);
405
+
406
+ /* Read fixed-size portion of header. */
407
+ h = __archive_read_ahead(a, sizeof(struct cpio_newc_header), NULL);
408
+ if (h == NULL)
409
+ return (ARCHIVE_FATAL);
410
+ __archive_read_consume(a, sizeof(struct cpio_newc_header));
411
+
412
+ /* Parse out hex fields. */
413
+ header = (const struct cpio_newc_header *)h;
414
+
415
+ if (memcmp(header->c_magic, "070701", 6) == 0) {
416
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_SVR4_NOCRC;
417
+ a->archive.archive_format_name = "ASCII cpio (SVR4 with no CRC)";
418
+ } else if (memcmp(header->c_magic, "070702", 6) == 0) {
419
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_SVR4_CRC;
420
+ a->archive.archive_format_name = "ASCII cpio (SVR4 with CRC)";
421
+ } else {
422
+ /* TODO: Abort here? */
423
+ }
424
+
425
+ archive_entry_set_devmajor(entry, atol16(header->c_devmajor, sizeof(header->c_devmajor)));
426
+ archive_entry_set_devminor(entry, atol16(header->c_devminor, sizeof(header->c_devminor)));
427
+ archive_entry_set_ino(entry, atol16(header->c_ino, sizeof(header->c_ino)));
428
+ archive_entry_set_mode(entry, atol16(header->c_mode, sizeof(header->c_mode)));
429
+ archive_entry_set_uid(entry, atol16(header->c_uid, sizeof(header->c_uid)));
430
+ archive_entry_set_gid(entry, atol16(header->c_gid, sizeof(header->c_gid)));
431
+ archive_entry_set_nlink(entry, atol16(header->c_nlink, sizeof(header->c_nlink)));
432
+ archive_entry_set_rdevmajor(entry, atol16(header->c_rdevmajor, sizeof(header->c_rdevmajor)));
433
+ archive_entry_set_rdevminor(entry, atol16(header->c_rdevminor, sizeof(header->c_rdevminor)));
434
+ archive_entry_set_mtime(entry, atol16(header->c_mtime, sizeof(header->c_mtime)), 0);
435
+ *namelength = atol16(header->c_namesize, sizeof(header->c_namesize));
436
+ /* Pad name to 2 more than a multiple of 4. */
437
+ *name_pad = (2 - *namelength) & 3;
438
+
439
+ /*
440
+ * Note: entry_bytes_remaining is at least 64 bits and
441
+ * therefore guaranteed to be big enough for a 33-bit file
442
+ * size.
443
+ */
444
+ cpio->entry_bytes_remaining =
445
+ atol16(header->c_filesize, sizeof(header->c_filesize));
446
+ archive_entry_set_size(entry, cpio->entry_bytes_remaining);
447
+ /* Pad file contents to a multiple of 4. */
448
+ cpio->entry_padding = 3 & -cpio->entry_bytes_remaining;
449
+ return (r);
450
+ }
451
+
452
+ /*
453
+ * Skip forward to the next cpio odc header by searching for the
454
+ * 070707 string. This is a hand-optimized search that could
455
+ * probably be easily generalized to handle all character-based
456
+ * cpio variants.
457
+ */
458
+ static int
459
+ is_octal(const char *p, size_t len)
460
+ {
461
+ while (len-- > 0) {
462
+ if (*p < '0' || *p > '7')
463
+ return (0);
464
+ ++p;
465
+ }
466
+ return (1);
467
+ }
468
+
469
+ static int
470
+ find_odc_header(struct archive_read *a)
471
+ {
472
+ const void *h;
473
+ const char *p, *q;
474
+ size_t skip, skipped = 0;
475
+ ssize_t bytes;
476
+
477
+ for (;;) {
478
+ h = __archive_read_ahead(a, sizeof(struct cpio_odc_header), &bytes);
479
+ if (h == NULL)
480
+ return (ARCHIVE_FATAL);
481
+ p = h;
482
+ q = p + bytes;
483
+
484
+ /* Try the typical case first, then go into the slow search.*/
485
+ if (memcmp("070707", p, 6) == 0
486
+ && is_octal(p, sizeof(struct cpio_odc_header)))
487
+ return (ARCHIVE_OK);
488
+
489
+ /*
490
+ * Scan ahead until we find something that looks
491
+ * like an odc header.
492
+ */
493
+ while (p + sizeof(struct cpio_odc_header) <= q) {
494
+ switch (p[5]) {
495
+ case '7':
496
+ if (memcmp("070707", p, 6) == 0
497
+ && is_octal(p, sizeof(struct cpio_odc_header))) {
498
+ skip = p - (const char *)h;
499
+ __archive_read_consume(a, skip);
500
+ skipped += skip;
501
+ if (skipped > 0) {
502
+ archive_set_error(&a->archive,
503
+ 0,
504
+ "Skipped %d bytes before "
505
+ "finding valid header",
506
+ (int)skipped);
507
+ return (ARCHIVE_WARN);
508
+ }
509
+ return (ARCHIVE_OK);
510
+ }
511
+ p += 2;
512
+ break;
513
+ case '0':
514
+ p++;
515
+ break;
516
+ default:
517
+ p += 6;
518
+ break;
519
+ }
520
+ }
521
+ skip = p - (const char *)h;
522
+ __archive_read_consume(a, skip);
523
+ skipped += skip;
524
+ }
525
+ }
526
+
527
+ static int
528
+ header_odc(struct archive_read *a, struct cpio *cpio,
529
+ struct archive_entry *entry, size_t *namelength, size_t *name_pad)
530
+ {
531
+ const void *h;
532
+ int r;
533
+ const struct cpio_odc_header *header;
534
+
535
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_POSIX;
536
+ a->archive.archive_format_name = "POSIX octet-oriented cpio";
537
+
538
+ /* Find the start of the next header. */
539
+ r = find_odc_header(a);
540
+ if (r < ARCHIVE_WARN)
541
+ return (r);
542
+
543
+ /* Read fixed-size portion of header. */
544
+ h = __archive_read_ahead(a, sizeof(struct cpio_odc_header), NULL);
545
+ if (h == NULL)
546
+ return (ARCHIVE_FATAL);
547
+ __archive_read_consume(a, sizeof(struct cpio_odc_header));
548
+
549
+ /* Parse out octal fields. */
550
+ header = (const struct cpio_odc_header *)h;
551
+
552
+ archive_entry_set_dev(entry, atol8(header->c_dev, sizeof(header->c_dev)));
553
+ archive_entry_set_ino(entry, atol8(header->c_ino, sizeof(header->c_ino)));
554
+ archive_entry_set_mode(entry, atol8(header->c_mode, sizeof(header->c_mode)));
555
+ archive_entry_set_uid(entry, atol8(header->c_uid, sizeof(header->c_uid)));
556
+ archive_entry_set_gid(entry, atol8(header->c_gid, sizeof(header->c_gid)));
557
+ archive_entry_set_nlink(entry, atol8(header->c_nlink, sizeof(header->c_nlink)));
558
+ archive_entry_set_rdev(entry, atol8(header->c_rdev, sizeof(header->c_rdev)));
559
+ archive_entry_set_mtime(entry, atol8(header->c_mtime, sizeof(header->c_mtime)), 0);
560
+ *namelength = atol8(header->c_namesize, sizeof(header->c_namesize));
561
+ *name_pad = 0; /* No padding of filename. */
562
+
563
+ /*
564
+ * Note: entry_bytes_remaining is at least 64 bits and
565
+ * therefore guaranteed to be big enough for a 33-bit file
566
+ * size.
567
+ */
568
+ cpio->entry_bytes_remaining =
569
+ atol8(header->c_filesize, sizeof(header->c_filesize));
570
+ archive_entry_set_size(entry, cpio->entry_bytes_remaining);
571
+ cpio->entry_padding = 0;
572
+ return (r);
573
+ }
574
+
575
+ static int
576
+ header_bin_le(struct archive_read *a, struct cpio *cpio,
577
+ struct archive_entry *entry, size_t *namelength, size_t *name_pad)
578
+ {
579
+ const void *h;
580
+ const struct cpio_bin_header *header;
581
+
582
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_BIN_LE;
583
+ a->archive.archive_format_name = "cpio (little-endian binary)";
584
+
585
+ /* Read fixed-size portion of header. */
586
+ h = __archive_read_ahead(a, sizeof(struct cpio_bin_header), NULL);
587
+ if (h == NULL)
588
+ return (ARCHIVE_FATAL);
589
+ __archive_read_consume(a, sizeof(struct cpio_bin_header));
590
+
591
+ /* Parse out binary fields. */
592
+ header = (const struct cpio_bin_header *)h;
593
+
594
+ archive_entry_set_dev(entry, header->c_dev[0] + header->c_dev[1] * 256);
595
+ archive_entry_set_ino(entry, header->c_ino[0] + header->c_ino[1] * 256);
596
+ archive_entry_set_mode(entry, header->c_mode[0] + header->c_mode[1] * 256);
597
+ archive_entry_set_uid(entry, header->c_uid[0] + header->c_uid[1] * 256);
598
+ archive_entry_set_gid(entry, header->c_gid[0] + header->c_gid[1] * 256);
599
+ archive_entry_set_nlink(entry, header->c_nlink[0] + header->c_nlink[1] * 256);
600
+ archive_entry_set_rdev(entry, header->c_rdev[0] + header->c_rdev[1] * 256);
601
+ archive_entry_set_mtime(entry, le4(header->c_mtime), 0);
602
+ *namelength = header->c_namesize[0] + header->c_namesize[1] * 256;
603
+ *name_pad = *namelength & 1; /* Pad to even. */
604
+
605
+ cpio->entry_bytes_remaining = le4(header->c_filesize);
606
+ archive_entry_set_size(entry, cpio->entry_bytes_remaining);
607
+ cpio->entry_padding = cpio->entry_bytes_remaining & 1; /* Pad to even. */
608
+ return (ARCHIVE_OK);
609
+ }
610
+
611
+ static int
612
+ header_bin_be(struct archive_read *a, struct cpio *cpio,
613
+ struct archive_entry *entry, size_t *namelength, size_t *name_pad)
614
+ {
615
+ const void *h;
616
+ const struct cpio_bin_header *header;
617
+
618
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_BIN_BE;
619
+ a->archive.archive_format_name = "cpio (big-endian binary)";
620
+
621
+ /* Read fixed-size portion of header. */
622
+ h = __archive_read_ahead(a, sizeof(struct cpio_bin_header), NULL);
623
+ if (h == NULL)
624
+ return (ARCHIVE_FATAL);
625
+ __archive_read_consume(a, sizeof(struct cpio_bin_header));
626
+
627
+ /* Parse out binary fields. */
628
+ header = (const struct cpio_bin_header *)h;
629
+ archive_entry_set_dev(entry, header->c_dev[0] * 256 + header->c_dev[1]);
630
+ archive_entry_set_ino(entry, header->c_ino[0] * 256 + header->c_ino[1]);
631
+ archive_entry_set_mode(entry, header->c_mode[0] * 256 + header->c_mode[1]);
632
+ archive_entry_set_uid(entry, header->c_uid[0] * 256 + header->c_uid[1]);
633
+ archive_entry_set_gid(entry, header->c_gid[0] * 256 + header->c_gid[1]);
634
+ archive_entry_set_nlink(entry, header->c_nlink[0] * 256 + header->c_nlink[1]);
635
+ archive_entry_set_rdev(entry, header->c_rdev[0] * 256 + header->c_rdev[1]);
636
+ archive_entry_set_mtime(entry, be4(header->c_mtime), 0);
637
+ *namelength = header->c_namesize[0] * 256 + header->c_namesize[1];
638
+ *name_pad = *namelength & 1; /* Pad to even. */
639
+
640
+ cpio->entry_bytes_remaining = be4(header->c_filesize);
641
+ archive_entry_set_size(entry, cpio->entry_bytes_remaining);
642
+ cpio->entry_padding = cpio->entry_bytes_remaining & 1; /* Pad to even. */
643
+ return (ARCHIVE_OK);
644
+ }
645
+
646
+ static int
647
+ archive_read_format_cpio_cleanup(struct archive_read *a)
648
+ {
649
+ struct cpio *cpio;
650
+
651
+ cpio = (struct cpio *)(a->format->data);
652
+ /* Free inode->name map */
653
+ while (cpio->links_head != NULL) {
654
+ struct links_entry *lp = cpio->links_head->next;
655
+
656
+ if (cpio->links_head->name)
657
+ free(cpio->links_head->name);
658
+ free(cpio->links_head);
659
+ cpio->links_head = lp;
660
+ }
661
+ archive_string_free(&cpio->entry_name);
662
+ free(cpio);
663
+ (a->format->data) = NULL;
664
+ return (ARCHIVE_OK);
665
+ }
666
+
667
+ static int
668
+ le4(const unsigned char *p)
669
+ {
670
+ return ((p[0]<<16) + (p[1]<<24) + (p[2]<<0) + (p[3]<<8));
671
+ }
672
+
673
+
674
+ static int
675
+ be4(const unsigned char *p)
676
+ {
677
+ return ((p[0]<<24) + (p[1]<<16) + (p[2]<<8) + (p[3]));
678
+ }
679
+
680
+ /*
681
+ * Note that this implementation does not (and should not!) obey
682
+ * locale settings; you cannot simply substitute strtol here, since
683
+ * it does obey locale.
684
+ */
685
+ static int64_t
686
+ atol8(const char *p, unsigned char_cnt)
687
+ {
688
+ int64_t l;
689
+ int digit;
690
+
691
+ l = 0;
692
+ while (char_cnt-- > 0) {
693
+ if (*p >= '0' && *p <= '7')
694
+ digit = *p - '0';
695
+ else
696
+ return (l);
697
+ p++;
698
+ l <<= 3;
699
+ l |= digit;
700
+ }
701
+ return (l);
702
+ }
703
+
704
+ static int64_t
705
+ atol16(const char *p, unsigned char_cnt)
706
+ {
707
+ int64_t l;
708
+ int digit;
709
+
710
+ l = 0;
711
+ while (char_cnt-- > 0) {
712
+ if (*p >= 'a' && *p <= 'f')
713
+ digit = *p - 'a' + 10;
714
+ else if (*p >= 'A' && *p <= 'F')
715
+ digit = *p - 'A' + 10;
716
+ else if (*p >= '0' && *p <= '9')
717
+ digit = *p - '0';
718
+ else
719
+ return (l);
720
+ p++;
721
+ l <<= 4;
722
+ l |= digit;
723
+ }
724
+ return (l);
725
+ }
726
+
727
+ static void
728
+ record_hardlink(struct cpio *cpio, struct archive_entry *entry)
729
+ {
730
+ struct links_entry *le;
731
+ dev_t dev;
732
+ int64_t ino;
733
+
734
+ if (archive_entry_nlink(entry) <= 1)
735
+ return;
736
+
737
+ dev = archive_entry_dev(entry);
738
+ ino = archive_entry_ino64(entry);
739
+
740
+ /*
741
+ * First look in the list of multiply-linked files. If we've
742
+ * already dumped it, convert this entry to a hard link entry.
743
+ */
744
+ for (le = cpio->links_head; le; le = le->next) {
745
+ if (le->dev == dev && le->ino == ino) {
746
+ archive_entry_copy_hardlink(entry, le->name);
747
+
748
+ if (--le->links <= 0) {
749
+ if (le->previous != NULL)
750
+ le->previous->next = le->next;
751
+ if (le->next != NULL)
752
+ le->next->previous = le->previous;
753
+ if (cpio->links_head == le)
754
+ cpio->links_head = le->next;
755
+ free(le->name);
756
+ free(le);
757
+ }
758
+
759
+ return;
760
+ }
761
+ }
762
+
763
+ le = (struct links_entry *)malloc(sizeof(struct links_entry));
764
+ if (le == NULL)
765
+ __archive_errx(1, "Out of memory adding file to list");
766
+ if (cpio->links_head != NULL)
767
+ cpio->links_head->previous = le;
768
+ le->next = cpio->links_head;
769
+ le->previous = NULL;
770
+ cpio->links_head = le;
771
+ le->dev = dev;
772
+ le->ino = ino;
773
+ le->links = archive_entry_nlink(entry) - 1;
774
+ le->name = strdup(archive_entry_pathname(entry));
775
+ if (le->name == NULL)
776
+ __archive_errx(1, "Out of memory adding file to list");
777
+ }