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,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
+ }