libarchive-static 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,344 @@
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_cpio.c 201170 2009-12-29 06:34:23Z kientzle $");
28
+
29
+ #ifdef HAVE_ERRNO_H
30
+ #include <errno.h>
31
+ #endif
32
+ #include <stdio.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_write_private.h"
44
+
45
+ static ssize_t archive_write_cpio_data(struct archive_write *,
46
+ const void *buff, size_t s);
47
+ static int archive_write_cpio_finish(struct archive_write *);
48
+ static int archive_write_cpio_destroy(struct archive_write *);
49
+ static int archive_write_cpio_finish_entry(struct archive_write *);
50
+ static int archive_write_cpio_header(struct archive_write *,
51
+ struct archive_entry *);
52
+ static int format_octal(int64_t, void *, int);
53
+ static int64_t format_octal_recursive(int64_t, char *, int);
54
+
55
+ struct cpio {
56
+ uint64_t entry_bytes_remaining;
57
+
58
+ int64_t ino_next;
59
+
60
+ struct { int64_t old; int new;} *ino_list;
61
+ size_t ino_list_size;
62
+ size_t ino_list_next;
63
+ };
64
+
65
+ struct cpio_header {
66
+ char c_magic[6];
67
+ char c_dev[6];
68
+ char c_ino[6];
69
+ char c_mode[6];
70
+ char c_uid[6];
71
+ char c_gid[6];
72
+ char c_nlink[6];
73
+ char c_rdev[6];
74
+ char c_mtime[11];
75
+ char c_namesize[6];
76
+ char c_filesize[11];
77
+ };
78
+
79
+ /*
80
+ * Set output format to 'cpio' format.
81
+ */
82
+ int
83
+ archive_write_set_format_cpio(struct archive *_a)
84
+ {
85
+ struct archive_write *a = (struct archive_write *)_a;
86
+ struct cpio *cpio;
87
+
88
+ /* If someone else was already registered, unregister them. */
89
+ if (a->format_destroy != NULL)
90
+ (a->format_destroy)(a);
91
+
92
+ cpio = (struct cpio *)malloc(sizeof(*cpio));
93
+ if (cpio == NULL) {
94
+ archive_set_error(&a->archive, ENOMEM, "Can't allocate cpio data");
95
+ return (ARCHIVE_FATAL);
96
+ }
97
+ memset(cpio, 0, sizeof(*cpio));
98
+ a->format_data = cpio;
99
+
100
+ a->pad_uncompressed = 1;
101
+ a->format_name = "cpio";
102
+ a->format_write_header = archive_write_cpio_header;
103
+ a->format_write_data = archive_write_cpio_data;
104
+ a->format_finish_entry = archive_write_cpio_finish_entry;
105
+ a->format_finish = archive_write_cpio_finish;
106
+ a->format_destroy = archive_write_cpio_destroy;
107
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_POSIX;
108
+ a->archive.archive_format_name = "POSIX cpio";
109
+ return (ARCHIVE_OK);
110
+ }
111
+
112
+ /*
113
+ * Ino values are as long as 64 bits on some systems; cpio format
114
+ * only allows 18 bits and relies on the ino values to identify hardlinked
115
+ * files. So, we can't merely "hash" the ino numbers since collisions
116
+ * would corrupt the archive. Instead, we generate synthetic ino values
117
+ * to store in the archive and maintain a map of original ino values to
118
+ * synthetic ones so we can preserve hardlink information.
119
+ *
120
+ * TODO: Make this more efficient. It's not as bad as it looks (most
121
+ * files don't have any hardlinks and we don't do any work here for those),
122
+ * but it wouldn't be hard to do better.
123
+ *
124
+ * TODO: Work with dev/ino pairs here instead of just ino values.
125
+ */
126
+ static int
127
+ synthesize_ino_value(struct cpio *cpio, struct archive_entry *entry)
128
+ {
129
+ int64_t ino = archive_entry_ino64(entry);
130
+ int ino_new;
131
+ size_t i;
132
+
133
+ /*
134
+ * If no index number was given, don't assign one. In
135
+ * particular, this handles the end-of-archive marker
136
+ * correctly by giving it a zero index value. (This is also
137
+ * why we start our synthetic index numbers with one below.)
138
+ */
139
+ if (ino == 0)
140
+ return (0);
141
+
142
+ /* Don't store a mapping if we don't need to. */
143
+ if (archive_entry_nlink(entry) < 2) {
144
+ return ++cpio->ino_next;
145
+ }
146
+
147
+ /* Look up old ino; if we have it, this is a hardlink
148
+ * and we reuse the same value. */
149
+ for (i = 0; i < cpio->ino_list_next; ++i) {
150
+ if (cpio->ino_list[i].old == ino)
151
+ return (cpio->ino_list[i].new);
152
+ }
153
+
154
+ /* Assign a new index number. */
155
+ ino_new = ++cpio->ino_next;
156
+
157
+ /* Ensure space for the new mapping. */
158
+ if (cpio->ino_list_size <= cpio->ino_list_next) {
159
+ size_t newsize = cpio->ino_list_size < 512
160
+ ? 512 : cpio->ino_list_size * 2;
161
+ void *newlist = realloc(cpio->ino_list,
162
+ sizeof(cpio->ino_list[0]) * newsize);
163
+ if (newlist == NULL)
164
+ return (-1);
165
+
166
+ cpio->ino_list_size = newsize;
167
+ cpio->ino_list = newlist;
168
+ }
169
+
170
+ /* Record and return the new value. */
171
+ cpio->ino_list[cpio->ino_list_next].old = ino;
172
+ cpio->ino_list[cpio->ino_list_next].new = ino_new;
173
+ ++cpio->ino_list_next;
174
+ return (ino_new);
175
+ }
176
+
177
+ static int
178
+ archive_write_cpio_header(struct archive_write *a, struct archive_entry *entry)
179
+ {
180
+ struct cpio *cpio;
181
+ const char *p, *path;
182
+ int pathlength, ret, ret2;
183
+ int64_t ino;
184
+ struct cpio_header h;
185
+
186
+ cpio = (struct cpio *)a->format_data;
187
+ ret2 = ARCHIVE_OK;
188
+
189
+ path = archive_entry_pathname(entry);
190
+ pathlength = (int)strlen(path) + 1; /* Include trailing null. */
191
+
192
+ memset(&h, 0, sizeof(h));
193
+ format_octal(070707, &h.c_magic, sizeof(h.c_magic));
194
+ format_octal(archive_entry_dev(entry), &h.c_dev, sizeof(h.c_dev));
195
+
196
+ ino = synthesize_ino_value(cpio, entry);
197
+ if (ino < 0) {
198
+ archive_set_error(&a->archive, ENOMEM,
199
+ "No memory for ino translation table");
200
+ return (ARCHIVE_FATAL);
201
+ } else if (ino > 0777777) {
202
+ archive_set_error(&a->archive, ERANGE,
203
+ "Too many files for this cpio format");
204
+ return (ARCHIVE_FATAL);
205
+ }
206
+ format_octal(ino & 0777777, &h.c_ino, sizeof(h.c_ino));
207
+
208
+ format_octal(archive_entry_mode(entry), &h.c_mode, sizeof(h.c_mode));
209
+ format_octal(archive_entry_uid(entry), &h.c_uid, sizeof(h.c_uid));
210
+ format_octal(archive_entry_gid(entry), &h.c_gid, sizeof(h.c_gid));
211
+ format_octal(archive_entry_nlink(entry), &h.c_nlink, sizeof(h.c_nlink));
212
+ if (archive_entry_filetype(entry) == AE_IFBLK
213
+ || archive_entry_filetype(entry) == AE_IFCHR)
214
+ format_octal(archive_entry_dev(entry), &h.c_rdev, sizeof(h.c_rdev));
215
+ else
216
+ format_octal(0, &h.c_rdev, sizeof(h.c_rdev));
217
+ format_octal(archive_entry_mtime(entry), &h.c_mtime, sizeof(h.c_mtime));
218
+ format_octal(pathlength, &h.c_namesize, sizeof(h.c_namesize));
219
+
220
+ /* Non-regular files don't store bodies. */
221
+ if (archive_entry_filetype(entry) != AE_IFREG)
222
+ archive_entry_set_size(entry, 0);
223
+
224
+ /* Symlinks get the link written as the body of the entry. */
225
+ p = archive_entry_symlink(entry);
226
+ if (p != NULL && *p != '\0')
227
+ format_octal(strlen(p), &h.c_filesize, sizeof(h.c_filesize));
228
+ else
229
+ format_octal(archive_entry_size(entry),
230
+ &h.c_filesize, sizeof(h.c_filesize));
231
+
232
+ ret = (a->compressor.write)(a, &h, sizeof(h));
233
+ if (ret != ARCHIVE_OK)
234
+ return (ARCHIVE_FATAL);
235
+
236
+ ret = (a->compressor.write)(a, path, pathlength);
237
+ if (ret != ARCHIVE_OK)
238
+ return (ARCHIVE_FATAL);
239
+
240
+ cpio->entry_bytes_remaining = archive_entry_size(entry);
241
+
242
+ /* Write the symlink now. */
243
+ if (p != NULL && *p != '\0')
244
+ ret = (a->compressor.write)(a, p, strlen(p));
245
+
246
+ if (ret == ARCHIVE_OK)
247
+ ret = ret2;
248
+ return (ret);
249
+ }
250
+
251
+ static ssize_t
252
+ archive_write_cpio_data(struct archive_write *a, const void *buff, size_t s)
253
+ {
254
+ struct cpio *cpio;
255
+ int ret;
256
+
257
+ cpio = (struct cpio *)a->format_data;
258
+ if (s > cpio->entry_bytes_remaining)
259
+ s = cpio->entry_bytes_remaining;
260
+
261
+ ret = (a->compressor.write)(a, buff, s);
262
+ cpio->entry_bytes_remaining -= s;
263
+ if (ret >= 0)
264
+ return (s);
265
+ else
266
+ return (ret);
267
+ }
268
+
269
+ /*
270
+ * Format a number into the specified field.
271
+ */
272
+ static int
273
+ format_octal(int64_t v, void *p, int digits)
274
+ {
275
+ int64_t max;
276
+ int ret;
277
+
278
+ max = (((int64_t)1) << (digits * 3)) - 1;
279
+ if (v >= 0 && v <= max) {
280
+ format_octal_recursive(v, (char *)p, digits);
281
+ ret = 0;
282
+ } else {
283
+ format_octal_recursive(max, (char *)p, digits);
284
+ ret = -1;
285
+ }
286
+ return (ret);
287
+ }
288
+
289
+ static int64_t
290
+ format_octal_recursive(int64_t v, char *p, int s)
291
+ {
292
+ if (s == 0)
293
+ return (v);
294
+ v = format_octal_recursive(v, p+1, s-1);
295
+ *p = '0' + (v & 7);
296
+ return (v >> 3);
297
+ }
298
+
299
+ static int
300
+ archive_write_cpio_finish(struct archive_write *a)
301
+ {
302
+ int er;
303
+ struct archive_entry *trailer;
304
+
305
+ trailer = archive_entry_new();
306
+ /* nlink = 1 here for GNU cpio compat. */
307
+ archive_entry_set_nlink(trailer, 1);
308
+ archive_entry_set_pathname(trailer, "TRAILER!!!");
309
+ er = archive_write_cpio_header(a, trailer);
310
+ archive_entry_free(trailer);
311
+ return (er);
312
+ }
313
+
314
+ static int
315
+ archive_write_cpio_destroy(struct archive_write *a)
316
+ {
317
+ struct cpio *cpio;
318
+
319
+ cpio = (struct cpio *)a->format_data;
320
+ free(cpio->ino_list);
321
+ free(cpio);
322
+ a->format_data = NULL;
323
+ return (ARCHIVE_OK);
324
+ }
325
+
326
+ static int
327
+ archive_write_cpio_finish_entry(struct archive_write *a)
328
+ {
329
+ struct cpio *cpio;
330
+ size_t to_write;
331
+ int ret;
332
+
333
+ cpio = (struct cpio *)a->format_data;
334
+ ret = ARCHIVE_OK;
335
+ while (cpio->entry_bytes_remaining > 0) {
336
+ to_write = cpio->entry_bytes_remaining < a->null_length ?
337
+ cpio->entry_bytes_remaining : a->null_length;
338
+ ret = (a->compressor.write)(a, a->nulls, to_write);
339
+ if (ret != ARCHIVE_OK)
340
+ return (ret);
341
+ cpio->entry_bytes_remaining -= to_write;
342
+ }
343
+ return (ret);
344
+ }
@@ -0,0 +1,295 @@
1
+ /*-
2
+ * Copyright (c) 2003-2007 Tim Kientzle
3
+ * Copyright (c) 2006 Rudolf Marek SYSGO s.r.o.
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
+ __FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio_newc.c 201160 2009-12-29 05:41:57Z kientzle $");
29
+
30
+ #ifdef HAVE_ERRNO_H
31
+ #include <errno.h>
32
+ #endif
33
+ #include <stdio.h>
34
+ #ifdef HAVE_STDLIB_H
35
+ #include <stdlib.h>
36
+ #endif
37
+ #ifdef HAVE_STRING_H
38
+ #include <string.h>
39
+ #endif
40
+
41
+ #include "archive.h"
42
+ #include "archive_entry.h"
43
+ #include "archive_private.h"
44
+ #include "archive_write_private.h"
45
+
46
+ static ssize_t archive_write_newc_data(struct archive_write *,
47
+ const void *buff, size_t s);
48
+ static int archive_write_newc_finish(struct archive_write *);
49
+ static int archive_write_newc_destroy(struct archive_write *);
50
+ static int archive_write_newc_finish_entry(struct archive_write *);
51
+ static int archive_write_newc_header(struct archive_write *,
52
+ struct archive_entry *);
53
+ static int format_hex(int64_t, void *, int);
54
+ static int64_t format_hex_recursive(int64_t, char *, int);
55
+
56
+ struct cpio {
57
+ uint64_t entry_bytes_remaining;
58
+ int padding;
59
+ };
60
+
61
+ struct cpio_header_newc {
62
+ char c_magic[6];
63
+ char c_ino[8];
64
+ char c_mode[8];
65
+ char c_uid[8];
66
+ char c_gid[8];
67
+ char c_nlink[8];
68
+ char c_mtime[8];
69
+ char c_filesize[8];
70
+ char c_devmajor[8];
71
+ char c_devminor[8];
72
+ char c_rdevmajor[8];
73
+ char c_rdevminor[8];
74
+ char c_namesize[8];
75
+ char c_checksum[8];
76
+ };
77
+
78
+ /* Logic trick: difference between 'n' and next multiple of 4 */
79
+ #define PAD4(n) (3 & (1 + ~(n)))
80
+
81
+ /*
82
+ * Set output format to 'cpio' format.
83
+ */
84
+ int
85
+ archive_write_set_format_cpio_newc(struct archive *_a)
86
+ {
87
+ struct archive_write *a = (struct archive_write *)_a;
88
+ struct cpio *cpio;
89
+
90
+ /* If someone else was already registered, unregister them. */
91
+ if (a->format_destroy != NULL)
92
+ (a->format_destroy)(a);
93
+
94
+ cpio = (struct cpio *)malloc(sizeof(*cpio));
95
+ if (cpio == NULL) {
96
+ archive_set_error(&a->archive, ENOMEM, "Can't allocate cpio data");
97
+ return (ARCHIVE_FATAL);
98
+ }
99
+ memset(cpio, 0, sizeof(*cpio));
100
+ a->format_data = cpio;
101
+
102
+ a->pad_uncompressed = 1;
103
+ a->format_name = "cpio";
104
+ a->format_write_header = archive_write_newc_header;
105
+ a->format_write_data = archive_write_newc_data;
106
+ a->format_finish_entry = archive_write_newc_finish_entry;
107
+ a->format_finish = archive_write_newc_finish;
108
+ a->format_destroy = archive_write_newc_destroy;
109
+ a->archive.archive_format = ARCHIVE_FORMAT_CPIO_SVR4_NOCRC;
110
+ a->archive.archive_format_name = "SVR4 cpio nocrc";
111
+ return (ARCHIVE_OK);
112
+ }
113
+
114
+ static int
115
+ archive_write_newc_header(struct archive_write *a, struct archive_entry *entry)
116
+ {
117
+ int64_t ino;
118
+ struct cpio *cpio;
119
+ const char *p, *path;
120
+ int pathlength, ret, ret2;
121
+ struct cpio_header_newc h;
122
+ int pad;
123
+
124
+ cpio = (struct cpio *)a->format_data;
125
+ ret2 = ARCHIVE_OK;
126
+
127
+ path = archive_entry_pathname(entry);
128
+ pathlength = (int)strlen(path) + 1; /* Include trailing null. */
129
+
130
+ memset(&h, 0, sizeof(h));
131
+ format_hex(0x070701, &h.c_magic, sizeof(h.c_magic));
132
+ format_hex(archive_entry_devmajor(entry), &h.c_devmajor,
133
+ sizeof(h.c_devmajor));
134
+ format_hex(archive_entry_devminor(entry), &h.c_devminor,
135
+ sizeof(h.c_devminor));
136
+
137
+ ino = archive_entry_ino64(entry);
138
+ if (ino > 0xffffffff) {
139
+ archive_set_error(&a->archive, ERANGE,
140
+ "large inode number truncated");
141
+ ret2 = ARCHIVE_WARN;
142
+ }
143
+
144
+ format_hex(ino & 0xffffffff, &h.c_ino, sizeof(h.c_ino));
145
+ format_hex(archive_entry_mode(entry), &h.c_mode, sizeof(h.c_mode));
146
+ format_hex(archive_entry_uid(entry), &h.c_uid, sizeof(h.c_uid));
147
+ format_hex(archive_entry_gid(entry), &h.c_gid, sizeof(h.c_gid));
148
+ format_hex(archive_entry_nlink(entry), &h.c_nlink, sizeof(h.c_nlink));
149
+ if (archive_entry_filetype(entry) == AE_IFBLK
150
+ || archive_entry_filetype(entry) == AE_IFCHR) {
151
+ format_hex(archive_entry_rdevmajor(entry), &h.c_rdevmajor, sizeof(h.c_rdevmajor));
152
+ format_hex(archive_entry_rdevminor(entry), &h.c_rdevminor, sizeof(h.c_rdevminor));
153
+ } else {
154
+ format_hex(0, &h.c_rdevmajor, sizeof(h.c_rdevmajor));
155
+ format_hex(0, &h.c_rdevminor, sizeof(h.c_rdevminor));
156
+ }
157
+ format_hex(archive_entry_mtime(entry), &h.c_mtime, sizeof(h.c_mtime));
158
+ format_hex(pathlength, &h.c_namesize, sizeof(h.c_namesize));
159
+ format_hex(0, &h.c_checksum, sizeof(h.c_checksum));
160
+
161
+ /* Non-regular files don't store bodies. */
162
+ if (archive_entry_filetype(entry) != AE_IFREG)
163
+ archive_entry_set_size(entry, 0);
164
+
165
+ /* Symlinks get the link written as the body of the entry. */
166
+ p = archive_entry_symlink(entry);
167
+ if (p != NULL && *p != '\0')
168
+ format_hex(strlen(p), &h.c_filesize, sizeof(h.c_filesize));
169
+ else
170
+ format_hex(archive_entry_size(entry),
171
+ &h.c_filesize, sizeof(h.c_filesize));
172
+
173
+ ret = (a->compressor.write)(a, &h, sizeof(h));
174
+ if (ret != ARCHIVE_OK)
175
+ return (ARCHIVE_FATAL);
176
+
177
+ /* Pad pathname to even length. */
178
+ ret = (a->compressor.write)(a, path, pathlength);
179
+ if (ret != ARCHIVE_OK)
180
+ return (ARCHIVE_FATAL);
181
+ pad = PAD4(pathlength + sizeof(struct cpio_header_newc));
182
+ if (pad)
183
+ ret = (a->compressor.write)(a, "\0\0\0", pad);
184
+ if (ret != ARCHIVE_OK)
185
+ return (ARCHIVE_FATAL);
186
+
187
+ cpio->entry_bytes_remaining = archive_entry_size(entry);
188
+ cpio->padding = PAD4(cpio->entry_bytes_remaining);
189
+
190
+ /* Write the symlink now. */
191
+ if (p != NULL && *p != '\0') {
192
+ ret = (a->compressor.write)(a, p, strlen(p));
193
+ if (ret != ARCHIVE_OK)
194
+ return (ARCHIVE_FATAL);
195
+ pad = PAD4(strlen(p));
196
+ ret = (a->compressor.write)(a, "\0\0\0", pad);
197
+ }
198
+
199
+ if (ret == ARCHIVE_OK)
200
+ ret = ret2;
201
+ return (ret);
202
+ }
203
+
204
+ static ssize_t
205
+ archive_write_newc_data(struct archive_write *a, const void *buff, size_t s)
206
+ {
207
+ struct cpio *cpio;
208
+ int ret;
209
+
210
+ cpio = (struct cpio *)a->format_data;
211
+ if (s > cpio->entry_bytes_remaining)
212
+ s = cpio->entry_bytes_remaining;
213
+
214
+ ret = (a->compressor.write)(a, buff, s);
215
+ cpio->entry_bytes_remaining -= s;
216
+ if (ret >= 0)
217
+ return (s);
218
+ else
219
+ return (ret);
220
+ }
221
+
222
+ /*
223
+ * Format a number into the specified field.
224
+ */
225
+ static int
226
+ format_hex(int64_t v, void *p, int digits)
227
+ {
228
+ int64_t max;
229
+ int ret;
230
+
231
+ max = (((int64_t)1) << (digits * 4)) - 1;
232
+ if (v >= 0 && v <= max) {
233
+ format_hex_recursive(v, (char *)p, digits);
234
+ ret = 0;
235
+ } else {
236
+ format_hex_recursive(max, (char *)p, digits);
237
+ ret = -1;
238
+ }
239
+ return (ret);
240
+ }
241
+
242
+ static int64_t
243
+ format_hex_recursive(int64_t v, char *p, int s)
244
+ {
245
+ if (s == 0)
246
+ return (v);
247
+ v = format_hex_recursive(v, p+1, s-1);
248
+ *p = "0123456789abcdef"[v & 0xf];
249
+ return (v >> 4);
250
+ }
251
+
252
+ static int
253
+ archive_write_newc_finish(struct archive_write *a)
254
+ {
255
+ int er;
256
+ struct archive_entry *trailer;
257
+
258
+ trailer = archive_entry_new();
259
+ archive_entry_set_nlink(trailer, 1);
260
+ archive_entry_set_pathname(trailer, "TRAILER!!!");
261
+ er = archive_write_newc_header(a, trailer);
262
+ archive_entry_free(trailer);
263
+ return (er);
264
+ }
265
+
266
+ static int
267
+ archive_write_newc_destroy(struct archive_write *a)
268
+ {
269
+ struct cpio *cpio;
270
+
271
+ cpio = (struct cpio *)a->format_data;
272
+ free(cpio);
273
+ a->format_data = NULL;
274
+ return (ARCHIVE_OK);
275
+ }
276
+
277
+ static int
278
+ archive_write_newc_finish_entry(struct archive_write *a)
279
+ {
280
+ struct cpio *cpio;
281
+ size_t to_write;
282
+ int ret;
283
+
284
+ cpio = (struct cpio *)a->format_data;
285
+ while (cpio->entry_bytes_remaining > 0) {
286
+ to_write = cpio->entry_bytes_remaining < a->null_length ?
287
+ cpio->entry_bytes_remaining : a->null_length;
288
+ ret = (a->compressor.write)(a, a->nulls, to_write);
289
+ if (ret != ARCHIVE_OK)
290
+ return (ret);
291
+ cpio->entry_bytes_remaining -= to_write;
292
+ }
293
+ ret = (a->compressor.write)(a, a->nulls, cpio->padding);
294
+ return (ret);
295
+ }