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,550 @@
1
+ /*-
2
+ * Copyright (c) 2007 Kai Wang
3
+ * Copyright (c) 2007 Tim Kientzle
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions
8
+ * are met:
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer
11
+ * in this position and unchanged.
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #include "archive_platform.h"
29
+ __FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_ar.c 201108 2009-12-28 03:28:21Z kientzle $");
30
+
31
+ #ifdef HAVE_ERRNO_H
32
+ #include <errno.h>
33
+ #endif
34
+ #ifdef HAVE_STDLIB_H
35
+ #include <stdlib.h>
36
+ #endif
37
+ #ifdef HAVE_STRING_H
38
+ #include <string.h>
39
+ #endif
40
+
41
+ #include "archive.h"
42
+ #include "archive_entry.h"
43
+ #include "archive_private.h"
44
+ #include "archive_write_private.h"
45
+
46
+ struct ar_w {
47
+ uint64_t entry_bytes_remaining;
48
+ uint64_t entry_padding;
49
+ int is_strtab;
50
+ int has_strtab;
51
+ char *strtab;
52
+ };
53
+
54
+ /*
55
+ * Define structure of the "ar" header.
56
+ */
57
+ #define AR_name_offset 0
58
+ #define AR_name_size 16
59
+ #define AR_date_offset 16
60
+ #define AR_date_size 12
61
+ #define AR_uid_offset 28
62
+ #define AR_uid_size 6
63
+ #define AR_gid_offset 34
64
+ #define AR_gid_size 6
65
+ #define AR_mode_offset 40
66
+ #define AR_mode_size 8
67
+ #define AR_size_offset 48
68
+ #define AR_size_size 10
69
+ #define AR_fmag_offset 58
70
+ #define AR_fmag_size 2
71
+
72
+ static int archive_write_set_format_ar(struct archive_write *);
73
+ static int archive_write_ar_header(struct archive_write *,
74
+ struct archive_entry *);
75
+ static ssize_t archive_write_ar_data(struct archive_write *,
76
+ const void *buff, size_t s);
77
+ static int archive_write_ar_destroy(struct archive_write *);
78
+ static int archive_write_ar_finish(struct archive_write *);
79
+ static int archive_write_ar_finish_entry(struct archive_write *);
80
+ static const char *ar_basename(const char *path);
81
+ static int format_octal(int64_t v, char *p, int s);
82
+ static int format_decimal(int64_t v, char *p, int s);
83
+
84
+ int
85
+ archive_write_set_format_ar_bsd(struct archive *_a)
86
+ {
87
+ struct archive_write *a = (struct archive_write *)_a;
88
+ int r = archive_write_set_format_ar(a);
89
+ if (r == ARCHIVE_OK) {
90
+ a->archive.archive_format = ARCHIVE_FORMAT_AR_BSD;
91
+ a->archive.archive_format_name = "ar (BSD)";
92
+ }
93
+ return (r);
94
+ }
95
+
96
+ int
97
+ archive_write_set_format_ar_svr4(struct archive *_a)
98
+ {
99
+ struct archive_write *a = (struct archive_write *)_a;
100
+ int r = archive_write_set_format_ar(a);
101
+ if (r == ARCHIVE_OK) {
102
+ a->archive.archive_format = ARCHIVE_FORMAT_AR_GNU;
103
+ a->archive.archive_format_name = "ar (GNU/SVR4)";
104
+ }
105
+ return (r);
106
+ }
107
+
108
+ /*
109
+ * Generic initialization.
110
+ */
111
+ static int
112
+ archive_write_set_format_ar(struct archive_write *a)
113
+ {
114
+ struct ar_w *ar;
115
+
116
+ /* If someone else was already registered, unregister them. */
117
+ if (a->format_destroy != NULL)
118
+ (a->format_destroy)(a);
119
+
120
+ ar = (struct ar_w *)malloc(sizeof(*ar));
121
+ if (ar == NULL) {
122
+ archive_set_error(&a->archive, ENOMEM, "Can't allocate ar data");
123
+ return (ARCHIVE_FATAL);
124
+ }
125
+ memset(ar, 0, sizeof(*ar));
126
+ a->format_data = ar;
127
+
128
+ a->format_name = "ar";
129
+ a->format_write_header = archive_write_ar_header;
130
+ a->format_write_data = archive_write_ar_data;
131
+ a->format_finish = archive_write_ar_finish;
132
+ a->format_destroy = archive_write_ar_destroy;
133
+ a->format_finish_entry = archive_write_ar_finish_entry;
134
+ return (ARCHIVE_OK);
135
+ }
136
+
137
+ static int
138
+ archive_write_ar_header(struct archive_write *a, struct archive_entry *entry)
139
+ {
140
+ int ret, append_fn;
141
+ char buff[60];
142
+ char *ss, *se;
143
+ struct ar_w *ar;
144
+ const char *pathname;
145
+ const char *filename;
146
+ int64_t size;
147
+
148
+ append_fn = 0;
149
+ ar = (struct ar_w *)a->format_data;
150
+ ar->is_strtab = 0;
151
+ filename = NULL;
152
+ size = archive_entry_size(entry);
153
+
154
+
155
+ /*
156
+ * Reject files with empty name.
157
+ */
158
+ pathname = archive_entry_pathname(entry);
159
+ if (*pathname == '\0') {
160
+ archive_set_error(&a->archive, EINVAL,
161
+ "Invalid filename");
162
+ return (ARCHIVE_WARN);
163
+ }
164
+
165
+ /*
166
+ * If we are now at the beginning of the archive,
167
+ * we need first write the ar global header.
168
+ */
169
+ if (a->archive.file_position == 0)
170
+ (a->compressor.write)(a, "!<arch>\n", 8);
171
+
172
+ memset(buff, ' ', 60);
173
+ strncpy(&buff[AR_fmag_offset], "`\n", 2);
174
+
175
+ if (strcmp(pathname, "/") == 0 ) {
176
+ /* Entry is archive symbol table in GNU format */
177
+ buff[AR_name_offset] = '/';
178
+ goto stat;
179
+ }
180
+ if (strcmp(pathname, "__.SYMDEF") == 0) {
181
+ /* Entry is archive symbol table in BSD format */
182
+ strncpy(buff + AR_name_offset, "__.SYMDEF", 9);
183
+ goto stat;
184
+ }
185
+ if (strcmp(pathname, "//") == 0) {
186
+ /*
187
+ * Entry is archive filename table, inform that we should
188
+ * collect strtab in next _data call.
189
+ */
190
+ ar->is_strtab = 1;
191
+ buff[AR_name_offset] = buff[AR_name_offset + 1] = '/';
192
+ /*
193
+ * For archive string table, only ar_size filed should
194
+ * be set.
195
+ */
196
+ goto size;
197
+ }
198
+
199
+ /*
200
+ * Otherwise, entry is a normal archive member.
201
+ * Strip leading paths from filenames, if any.
202
+ */
203
+ if ((filename = ar_basename(pathname)) == NULL) {
204
+ /* Reject filenames with trailing "/" */
205
+ archive_set_error(&a->archive, EINVAL,
206
+ "Invalid filename");
207
+ return (ARCHIVE_WARN);
208
+ }
209
+
210
+ if (a->archive.archive_format == ARCHIVE_FORMAT_AR_GNU) {
211
+ /*
212
+ * SVR4/GNU variant use a "/" to mark then end of the filename,
213
+ * make it possible to have embedded spaces in the filename.
214
+ * So, the longest filename here (without extension) is
215
+ * actually 15 bytes.
216
+ */
217
+ if (strlen(filename) <= 15) {
218
+ strncpy(&buff[AR_name_offset],
219
+ filename, strlen(filename));
220
+ buff[AR_name_offset + strlen(filename)] = '/';
221
+ } else {
222
+ /*
223
+ * For filename longer than 15 bytes, GNU variant
224
+ * makes use of a string table and instead stores the
225
+ * offset of the real filename to in the ar_name field.
226
+ * The string table should have been written before.
227
+ */
228
+ if (ar->has_strtab <= 0) {
229
+ archive_set_error(&a->archive, EINVAL,
230
+ "Can't find string table");
231
+ return (ARCHIVE_WARN);
232
+ }
233
+
234
+ se = (char *)malloc(strlen(filename) + 3);
235
+ if (se == NULL) {
236
+ archive_set_error(&a->archive, ENOMEM,
237
+ "Can't allocate filename buffer");
238
+ return (ARCHIVE_FATAL);
239
+ }
240
+
241
+ strncpy(se, filename, strlen(filename));
242
+ strcpy(se + strlen(filename), "/\n");
243
+
244
+ ss = strstr(ar->strtab, se);
245
+ free(se);
246
+
247
+ if (ss == NULL) {
248
+ archive_set_error(&a->archive, EINVAL,
249
+ "Invalid string table");
250
+ return (ARCHIVE_WARN);
251
+ }
252
+
253
+ /*
254
+ * GNU variant puts "/" followed by digits into
255
+ * ar_name field. These digits indicates the real
256
+ * filename string's offset to the string table.
257
+ */
258
+ buff[AR_name_offset] = '/';
259
+ if (format_decimal(ss - ar->strtab,
260
+ buff + AR_name_offset + 1,
261
+ AR_name_size - 1)) {
262
+ archive_set_error(&a->archive, ERANGE,
263
+ "string table offset too large");
264
+ return (ARCHIVE_WARN);
265
+ }
266
+ }
267
+ } else if (a->archive.archive_format == ARCHIVE_FORMAT_AR_BSD) {
268
+ /*
269
+ * BSD variant: for any file name which is more than
270
+ * 16 chars or contains one or more embedded space(s), the
271
+ * string "#1/" followed by the ASCII length of the name is
272
+ * put into the ar_name field. The file size (stored in the
273
+ * ar_size field) is incremented by the length of the name.
274
+ * The name is then written immediately following the
275
+ * archive header.
276
+ */
277
+ if (strlen(filename) <= 16 && strchr(filename, ' ') == NULL) {
278
+ strncpy(&buff[AR_name_offset], filename, strlen(filename));
279
+ buff[AR_name_offset + strlen(filename)] = ' ';
280
+ }
281
+ else {
282
+ strncpy(buff + AR_name_offset, "#1/", 3);
283
+ if (format_decimal(strlen(filename),
284
+ buff + AR_name_offset + 3,
285
+ AR_name_size - 3)) {
286
+ archive_set_error(&a->archive, ERANGE,
287
+ "File name too long");
288
+ return (ARCHIVE_WARN);
289
+ }
290
+ append_fn = 1;
291
+ size += strlen(filename);
292
+ }
293
+ }
294
+
295
+ stat:
296
+ if (format_decimal(archive_entry_mtime(entry), buff + AR_date_offset, AR_date_size)) {
297
+ archive_set_error(&a->archive, ERANGE,
298
+ "File modification time too large");
299
+ return (ARCHIVE_WARN);
300
+ }
301
+ if (format_decimal(archive_entry_uid(entry), buff + AR_uid_offset, AR_uid_size)) {
302
+ archive_set_error(&a->archive, ERANGE,
303
+ "Numeric user ID too large");
304
+ return (ARCHIVE_WARN);
305
+ }
306
+ if (format_decimal(archive_entry_gid(entry), buff + AR_gid_offset, AR_gid_size)) {
307
+ archive_set_error(&a->archive, ERANGE,
308
+ "Numeric group ID too large");
309
+ return (ARCHIVE_WARN);
310
+ }
311
+ if (format_octal(archive_entry_mode(entry), buff + AR_mode_offset, AR_mode_size)) {
312
+ archive_set_error(&a->archive, ERANGE,
313
+ "Numeric mode too large");
314
+ return (ARCHIVE_WARN);
315
+ }
316
+ /*
317
+ * Sanity Check: A non-pseudo archive member should always be
318
+ * a regular file.
319
+ */
320
+ if (filename != NULL && archive_entry_filetype(entry) != AE_IFREG) {
321
+ archive_set_error(&a->archive, EINVAL,
322
+ "Regular file required for non-pseudo member");
323
+ return (ARCHIVE_WARN);
324
+ }
325
+
326
+ size:
327
+ if (format_decimal(size, buff + AR_size_offset, AR_size_size)) {
328
+ archive_set_error(&a->archive, ERANGE,
329
+ "File size out of range");
330
+ return (ARCHIVE_WARN);
331
+ }
332
+
333
+ ret = (a->compressor.write)(a, buff, 60);
334
+ if (ret != ARCHIVE_OK)
335
+ return (ret);
336
+
337
+ ar->entry_bytes_remaining = size;
338
+ ar->entry_padding = ar->entry_bytes_remaining % 2;
339
+
340
+ if (append_fn > 0) {
341
+ ret = (a->compressor.write)(a, filename, strlen(filename));
342
+ if (ret != ARCHIVE_OK)
343
+ return (ret);
344
+ ar->entry_bytes_remaining -= strlen(filename);
345
+ }
346
+
347
+ return (ARCHIVE_OK);
348
+ }
349
+
350
+ static ssize_t
351
+ archive_write_ar_data(struct archive_write *a, const void *buff, size_t s)
352
+ {
353
+ struct ar_w *ar;
354
+ int ret;
355
+
356
+ ar = (struct ar_w *)a->format_data;
357
+ if (s > ar->entry_bytes_remaining)
358
+ s = ar->entry_bytes_remaining;
359
+
360
+ if (ar->is_strtab > 0) {
361
+ if (ar->has_strtab > 0) {
362
+ archive_set_error(&a->archive, EINVAL,
363
+ "More than one string tables exist");
364
+ return (ARCHIVE_WARN);
365
+ }
366
+
367
+ ar->strtab = (char *)malloc(s);
368
+ if (ar->strtab == NULL) {
369
+ archive_set_error(&a->archive, ENOMEM,
370
+ "Can't allocate strtab buffer");
371
+ return (ARCHIVE_FATAL);
372
+ }
373
+ strncpy(ar->strtab, buff, s);
374
+ ar->has_strtab = 1;
375
+ }
376
+
377
+ ret = (a->compressor.write)(a, buff, s);
378
+ if (ret != ARCHIVE_OK)
379
+ return (ret);
380
+
381
+ ar->entry_bytes_remaining -= s;
382
+ return (s);
383
+ }
384
+
385
+ static int
386
+ archive_write_ar_destroy(struct archive_write *a)
387
+ {
388
+ struct ar_w *ar;
389
+
390
+ ar = (struct ar_w *)a->format_data;
391
+
392
+ if (ar == NULL)
393
+ return (ARCHIVE_OK);
394
+
395
+ if (ar->has_strtab > 0) {
396
+ free(ar->strtab);
397
+ ar->strtab = NULL;
398
+ }
399
+
400
+ free(ar);
401
+ a->format_data = NULL;
402
+ return (ARCHIVE_OK);
403
+ }
404
+
405
+ static int
406
+ archive_write_ar_finish(struct archive_write *a)
407
+ {
408
+ int ret;
409
+
410
+ /*
411
+ * If we haven't written anything yet, we need to write
412
+ * the ar global header now to make it a valid ar archive.
413
+ */
414
+ if (a->archive.file_position == 0) {
415
+ ret = (a->compressor.write)(a, "!<arch>\n", 8);
416
+ return (ret);
417
+ }
418
+
419
+ return (ARCHIVE_OK);
420
+ }
421
+
422
+ static int
423
+ archive_write_ar_finish_entry(struct archive_write *a)
424
+ {
425
+ struct ar_w *ar;
426
+ int ret;
427
+
428
+ ar = (struct ar_w *)a->format_data;
429
+
430
+ if (ar->entry_bytes_remaining != 0) {
431
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
432
+ "Entry remaining bytes larger than 0");
433
+ return (ARCHIVE_WARN);
434
+ }
435
+
436
+ if (ar->entry_padding == 0) {
437
+ return (ARCHIVE_OK);
438
+ }
439
+
440
+ if (ar->entry_padding != 1) {
441
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
442
+ "Padding wrong size: %d should be 1 or 0",
443
+ ar->entry_padding);
444
+ return (ARCHIVE_WARN);
445
+ }
446
+
447
+ ret = (a->compressor.write)(a, "\n", 1);
448
+ return (ret);
449
+ }
450
+
451
+ /*
452
+ * Format a number into the specified field using base-8.
453
+ * NB: This version is slightly different from the one in
454
+ * _ustar.c
455
+ */
456
+ static int
457
+ format_octal(int64_t v, char *p, int s)
458
+ {
459
+ int len;
460
+ char *h;
461
+
462
+ len = s;
463
+ h = p;
464
+
465
+ /* Octal values can't be negative, so use 0. */
466
+ if (v < 0) {
467
+ while (len-- > 0)
468
+ *p++ = '0';
469
+ return (-1);
470
+ }
471
+
472
+ p += s; /* Start at the end and work backwards. */
473
+ do {
474
+ *--p = (char)('0' + (v & 7));
475
+ v >>= 3;
476
+ } while (--s > 0 && v > 0);
477
+
478
+ if (v == 0) {
479
+ memmove(h, p, len - s);
480
+ p = h + len - s;
481
+ while (s-- > 0)
482
+ *p++ = ' ';
483
+ return (0);
484
+ }
485
+ /* If it overflowed, fill field with max value. */
486
+ while (len-- > 0)
487
+ *p++ = '7';
488
+
489
+ return (-1);
490
+ }
491
+
492
+ /*
493
+ * Format a number into the specified field using base-10.
494
+ */
495
+ static int
496
+ format_decimal(int64_t v, char *p, int s)
497
+ {
498
+ int len;
499
+ char *h;
500
+
501
+ len = s;
502
+ h = p;
503
+
504
+ /* Negative values in ar header are meaningless , so use 0. */
505
+ if (v < 0) {
506
+ while (len-- > 0)
507
+ *p++ = '0';
508
+ return (-1);
509
+ }
510
+
511
+ p += s;
512
+ do {
513
+ *--p = (char)('0' + (v % 10));
514
+ v /= 10;
515
+ } while (--s > 0 && v > 0);
516
+
517
+ if (v == 0) {
518
+ memmove(h, p, len - s);
519
+ p = h + len - s;
520
+ while (s-- > 0)
521
+ *p++ = ' ';
522
+ return (0);
523
+ }
524
+ /* If it overflowed, fill field with max value. */
525
+ while (len-- > 0)
526
+ *p++ = '9';
527
+
528
+ return (-1);
529
+ }
530
+
531
+ static const char *
532
+ ar_basename(const char *path)
533
+ {
534
+ const char *endp, *startp;
535
+
536
+ endp = path + strlen(path) - 1;
537
+ /*
538
+ * For filename with trailing slash(es), we return
539
+ * NULL indicating an error.
540
+ */
541
+ if (*endp == '/')
542
+ return (NULL);
543
+
544
+ /* Find the start of the base */
545
+ startp = endp;
546
+ while (startp > path && *(startp - 1) != '/')
547
+ startp--;
548
+
549
+ return (startp);
550
+ }
@@ -0,0 +1,76 @@
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_by_name.c 201168 2009-12-29 06:15:32Z kientzle $");
28
+
29
+ #ifdef HAVE_SYS_TYPES_H
30
+ #include <sys/types.h>
31
+ #endif
32
+
33
+ #ifdef HAVE_ERRNO_H
34
+ #include <errno.h>
35
+ #endif
36
+ #ifdef HAVE_STRING_H
37
+ #include <string.h>
38
+ #endif
39
+
40
+ #include "archive.h"
41
+ #include "archive_private.h"
42
+
43
+ /* A table that maps names to functions. */
44
+ static
45
+ struct { const char *name; int (*setter)(struct archive *); } names[] =
46
+ {
47
+ { "ar", archive_write_set_format_ar_bsd },
48
+ { "arbsd", archive_write_set_format_ar_bsd },
49
+ { "argnu", archive_write_set_format_ar_svr4 },
50
+ { "arsvr4", archive_write_set_format_ar_svr4 },
51
+ { "cpio", archive_write_set_format_cpio },
52
+ { "mtree", archive_write_set_format_mtree },
53
+ { "newc", archive_write_set_format_cpio_newc },
54
+ { "odc", archive_write_set_format_cpio },
55
+ { "pax", archive_write_set_format_pax },
56
+ { "posix", archive_write_set_format_pax },
57
+ { "shar", archive_write_set_format_shar },
58
+ { "shardump", archive_write_set_format_shar_dump },
59
+ { "ustar", archive_write_set_format_ustar },
60
+ { "zip", archive_write_set_format_zip },
61
+ { NULL, NULL }
62
+ };
63
+
64
+ int
65
+ archive_write_set_format_by_name(struct archive *a, const char *name)
66
+ {
67
+ int i;
68
+
69
+ for (i = 0; names[i].name != NULL; i++) {
70
+ if (strcmp(name, names[i].name) == 0)
71
+ return ((names[i].setter)(a));
72
+ }
73
+
74
+ archive_set_error(a, EINVAL, "No such format '%s'", name);
75
+ return (ARCHIVE_FATAL);
76
+ }