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,405 @@
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_entry_link_resolver.c 201100 2009-12-28 03:05:31Z kientzle $");
28
+
29
+ #ifdef HAVE_SYS_STAT_H
30
+ #include <sys/stat.h>
31
+ #endif
32
+ #ifdef HAVE_ERRNO_H
33
+ #include <errno.h>
34
+ #endif
35
+ #include <stdio.h>
36
+ #ifdef HAVE_STDLIB_H
37
+ #include <stdlib.h>
38
+ #endif
39
+ #ifdef HAVE_STRING_H
40
+ #include <string.h>
41
+ #endif
42
+
43
+ #include "archive.h"
44
+ #include "archive_entry.h"
45
+
46
+ /*
47
+ * This is mostly a pretty straightforward hash table implementation.
48
+ * The only interesting bit is the different strategies used to
49
+ * match up links. These strategies match those used by various
50
+ * archiving formats:
51
+ * tar - content stored with first link, remainder refer back to it.
52
+ * This requires us to match each subsequent link up with the
53
+ * first appearance.
54
+ * cpio - Old cpio just stored body with each link, match-ups were
55
+ * implicit. This is trivial.
56
+ * new cpio - New cpio only stores body with last link, match-ups
57
+ * are implicit. This is actually quite tricky; see the notes
58
+ * below.
59
+ */
60
+
61
+ /* Users pass us a format code, we translate that into a strategy here. */
62
+ #define ARCHIVE_ENTRY_LINKIFY_LIKE_TAR 0
63
+ #define ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE 1
64
+ #define ARCHIVE_ENTRY_LINKIFY_LIKE_OLD_CPIO 2
65
+ #define ARCHIVE_ENTRY_LINKIFY_LIKE_NEW_CPIO 3
66
+
67
+ /* Initial size of link cache. */
68
+ #define links_cache_initial_size 1024
69
+
70
+ struct links_entry {
71
+ struct links_entry *next;
72
+ struct links_entry *previous;
73
+ int links; /* # links not yet seen */
74
+ int hash;
75
+ struct archive_entry *canonical;
76
+ struct archive_entry *entry;
77
+ };
78
+
79
+ struct archive_entry_linkresolver {
80
+ struct links_entry **buckets;
81
+ struct links_entry *spare;
82
+ unsigned long number_entries;
83
+ size_t number_buckets;
84
+ int strategy;
85
+ };
86
+
87
+ static struct links_entry *find_entry(struct archive_entry_linkresolver *,
88
+ struct archive_entry *);
89
+ static void grow_hash(struct archive_entry_linkresolver *);
90
+ static struct links_entry *insert_entry(struct archive_entry_linkresolver *,
91
+ struct archive_entry *);
92
+ static struct links_entry *next_entry(struct archive_entry_linkresolver *);
93
+
94
+ struct archive_entry_linkresolver *
95
+ archive_entry_linkresolver_new(void)
96
+ {
97
+ struct archive_entry_linkresolver *res;
98
+ size_t i;
99
+
100
+ res = malloc(sizeof(struct archive_entry_linkresolver));
101
+ if (res == NULL)
102
+ return (NULL);
103
+ memset(res, 0, sizeof(struct archive_entry_linkresolver));
104
+ res->number_buckets = links_cache_initial_size;
105
+ res->buckets = malloc(res->number_buckets *
106
+ sizeof(res->buckets[0]));
107
+ if (res->buckets == NULL) {
108
+ free(res);
109
+ return (NULL);
110
+ }
111
+ for (i = 0; i < res->number_buckets; i++)
112
+ res->buckets[i] = NULL;
113
+ return (res);
114
+ }
115
+
116
+ void
117
+ archive_entry_linkresolver_set_strategy(struct archive_entry_linkresolver *res,
118
+ int fmt)
119
+ {
120
+ int fmtbase = fmt & ARCHIVE_FORMAT_BASE_MASK;
121
+
122
+ switch (fmtbase) {
123
+ case ARCHIVE_FORMAT_CPIO:
124
+ switch (fmt) {
125
+ case ARCHIVE_FORMAT_CPIO_SVR4_NOCRC:
126
+ case ARCHIVE_FORMAT_CPIO_SVR4_CRC:
127
+ res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_NEW_CPIO;
128
+ break;
129
+ default:
130
+ res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_OLD_CPIO;
131
+ break;
132
+ }
133
+ break;
134
+ case ARCHIVE_FORMAT_MTREE:
135
+ res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE;
136
+ break;
137
+ case ARCHIVE_FORMAT_TAR:
138
+ res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_TAR;
139
+ break;
140
+ default:
141
+ res->strategy = ARCHIVE_ENTRY_LINKIFY_LIKE_TAR;
142
+ break;
143
+ }
144
+ }
145
+
146
+ void
147
+ archive_entry_linkresolver_free(struct archive_entry_linkresolver *res)
148
+ {
149
+ struct links_entry *le;
150
+
151
+ if (res == NULL)
152
+ return;
153
+
154
+ if (res->buckets != NULL) {
155
+ while ((le = next_entry(res)) != NULL)
156
+ archive_entry_free(le->entry);
157
+ free(res->buckets);
158
+ res->buckets = NULL;
159
+ }
160
+ free(res);
161
+ }
162
+
163
+ void
164
+ archive_entry_linkify(struct archive_entry_linkresolver *res,
165
+ struct archive_entry **e, struct archive_entry **f)
166
+ {
167
+ struct links_entry *le;
168
+ struct archive_entry *t;
169
+
170
+ *f = NULL; /* Default: Don't return a second entry. */
171
+
172
+ if (*e == NULL) {
173
+ le = next_entry(res);
174
+ if (le != NULL) {
175
+ *e = le->entry;
176
+ le->entry = NULL;
177
+ }
178
+ return;
179
+ }
180
+
181
+ /* If it has only one link, then we're done. */
182
+ if (archive_entry_nlink(*e) == 1)
183
+ return;
184
+ /* Directories, devices never have hardlinks. */
185
+ if (archive_entry_filetype(*e) == AE_IFDIR
186
+ || archive_entry_filetype(*e) == AE_IFBLK
187
+ || archive_entry_filetype(*e) == AE_IFCHR)
188
+ return;
189
+
190
+ switch (res->strategy) {
191
+ case ARCHIVE_ENTRY_LINKIFY_LIKE_TAR:
192
+ le = find_entry(res, *e);
193
+ if (le != NULL) {
194
+ archive_entry_unset_size(*e);
195
+ archive_entry_copy_hardlink(*e,
196
+ archive_entry_pathname(le->canonical));
197
+ } else
198
+ insert_entry(res, *e);
199
+ return;
200
+ case ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE:
201
+ le = find_entry(res, *e);
202
+ if (le != NULL) {
203
+ archive_entry_copy_hardlink(*e,
204
+ archive_entry_pathname(le->canonical));
205
+ } else
206
+ insert_entry(res, *e);
207
+ return;
208
+ case ARCHIVE_ENTRY_LINKIFY_LIKE_OLD_CPIO:
209
+ /* This one is trivial. */
210
+ return;
211
+ case ARCHIVE_ENTRY_LINKIFY_LIKE_NEW_CPIO:
212
+ le = find_entry(res, *e);
213
+ if (le != NULL) {
214
+ /*
215
+ * Put the new entry in le, return the
216
+ * old entry from le.
217
+ */
218
+ t = *e;
219
+ *e = le->entry;
220
+ le->entry = t;
221
+ /* Make the old entry into a hardlink. */
222
+ archive_entry_unset_size(*e);
223
+ archive_entry_copy_hardlink(*e,
224
+ archive_entry_pathname(le->canonical));
225
+ /* If we ran out of links, return the
226
+ * final entry as well. */
227
+ if (le->links == 0) {
228
+ *f = le->entry;
229
+ le->entry = NULL;
230
+ }
231
+ } else {
232
+ /*
233
+ * If we haven't seen it, tuck it away
234
+ * for future use.
235
+ */
236
+ le = insert_entry(res, *e);
237
+ le->entry = *e;
238
+ *e = NULL;
239
+ }
240
+ return;
241
+ default:
242
+ break;
243
+ }
244
+ return;
245
+ }
246
+
247
+ static struct links_entry *
248
+ find_entry(struct archive_entry_linkresolver *res,
249
+ struct archive_entry *entry)
250
+ {
251
+ struct links_entry *le;
252
+ int hash, bucket;
253
+ dev_t dev;
254
+ int64_t ino;
255
+
256
+ /* Free a held entry. */
257
+ if (res->spare != NULL) {
258
+ archive_entry_free(res->spare->canonical);
259
+ archive_entry_free(res->spare->entry);
260
+ free(res->spare);
261
+ res->spare = NULL;
262
+ }
263
+
264
+ /* If the links cache overflowed and got flushed, don't bother. */
265
+ if (res->buckets == NULL)
266
+ return (NULL);
267
+
268
+ dev = archive_entry_dev(entry);
269
+ ino = archive_entry_ino64(entry);
270
+ hash = (int)(dev ^ ino);
271
+
272
+ /* Try to locate this entry in the links cache. */
273
+ bucket = hash % res->number_buckets;
274
+ for (le = res->buckets[bucket]; le != NULL; le = le->next) {
275
+ if (le->hash == hash
276
+ && dev == archive_entry_dev(le->canonical)
277
+ && ino == archive_entry_ino64(le->canonical)) {
278
+ /*
279
+ * Decrement link count each time and release
280
+ * the entry if it hits zero. This saves
281
+ * memory and is necessary for detecting
282
+ * missed links.
283
+ */
284
+ --le->links;
285
+ if (le->links > 0)
286
+ return (le);
287
+ /* Remove it from this hash bucket. */
288
+ if (le->previous != NULL)
289
+ le->previous->next = le->next;
290
+ if (le->next != NULL)
291
+ le->next->previous = le->previous;
292
+ if (res->buckets[bucket] == le)
293
+ res->buckets[bucket] = le->next;
294
+ res->number_entries--;
295
+ /* Defer freeing this entry. */
296
+ res->spare = le;
297
+ return (le);
298
+ }
299
+ }
300
+ return (NULL);
301
+ }
302
+
303
+ static struct links_entry *
304
+ next_entry(struct archive_entry_linkresolver *res)
305
+ {
306
+ struct links_entry *le;
307
+ size_t bucket;
308
+
309
+ /* Free a held entry. */
310
+ if (res->spare != NULL) {
311
+ archive_entry_free(res->spare->canonical);
312
+ free(res->spare);
313
+ res->spare = NULL;
314
+ }
315
+
316
+ /* If the links cache overflowed and got flushed, don't bother. */
317
+ if (res->buckets == NULL)
318
+ return (NULL);
319
+
320
+ /* Look for next non-empty bucket in the links cache. */
321
+ for (bucket = 0; bucket < res->number_buckets; bucket++) {
322
+ le = res->buckets[bucket];
323
+ if (le != NULL) {
324
+ /* Remove it from this hash bucket. */
325
+ if (le->next != NULL)
326
+ le->next->previous = le->previous;
327
+ res->buckets[bucket] = le->next;
328
+ res->number_entries--;
329
+ /* Defer freeing this entry. */
330
+ res->spare = le;
331
+ return (le);
332
+ }
333
+ }
334
+ return (NULL);
335
+ }
336
+
337
+ static struct links_entry *
338
+ insert_entry(struct archive_entry_linkresolver *res,
339
+ struct archive_entry *entry)
340
+ {
341
+ struct links_entry *le;
342
+ int hash, bucket;
343
+
344
+ /* Add this entry to the links cache. */
345
+ le = malloc(sizeof(struct links_entry));
346
+ if (le == NULL)
347
+ return (NULL);
348
+ memset(le, 0, sizeof(*le));
349
+ le->canonical = archive_entry_clone(entry);
350
+
351
+ /* If the links cache is getting too full, enlarge the hash table. */
352
+ if (res->number_entries > res->number_buckets * 2)
353
+ grow_hash(res);
354
+
355
+ hash = archive_entry_dev(entry) ^ archive_entry_ino64(entry);
356
+ bucket = hash % res->number_buckets;
357
+
358
+ /* If we could allocate the entry, record it. */
359
+ if (res->buckets[bucket] != NULL)
360
+ res->buckets[bucket]->previous = le;
361
+ res->number_entries++;
362
+ le->next = res->buckets[bucket];
363
+ le->previous = NULL;
364
+ res->buckets[bucket] = le;
365
+ le->hash = hash;
366
+ le->links = archive_entry_nlink(entry) - 1;
367
+ return (le);
368
+ }
369
+
370
+ static void
371
+ grow_hash(struct archive_entry_linkresolver *res)
372
+ {
373
+ struct links_entry *le, **new_buckets;
374
+ size_t new_size;
375
+ size_t i, bucket;
376
+
377
+ /* Try to enlarge the bucket list. */
378
+ new_size = res->number_buckets * 2;
379
+ new_buckets = malloc(new_size * sizeof(struct links_entry *));
380
+
381
+ if (new_buckets != NULL) {
382
+ memset(new_buckets, 0,
383
+ new_size * sizeof(struct links_entry *));
384
+ for (i = 0; i < res->number_buckets; i++) {
385
+ while (res->buckets[i] != NULL) {
386
+ /* Remove entry from old bucket. */
387
+ le = res->buckets[i];
388
+ res->buckets[i] = le->next;
389
+
390
+ /* Add entry to new bucket. */
391
+ bucket = le->hash % new_size;
392
+
393
+ if (new_buckets[bucket] != NULL)
394
+ new_buckets[bucket]->previous =
395
+ le;
396
+ le->next = new_buckets[bucket];
397
+ le->previous = NULL;
398
+ new_buckets[bucket] = le;
399
+ }
400
+ }
401
+ free(res->buckets);
402
+ res->buckets = new_buckets;
403
+ res->number_buckets = new_size;
404
+ }
405
+ }
@@ -0,0 +1,184 @@
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
+ * $FreeBSD: head/lib/libarchive/archive_entry_private.h 201096 2009-12-28 02:41:27Z kientzle $
26
+ */
27
+
28
+ #ifndef __LIBARCHIVE_BUILD
29
+ #error This header is only to be used internally to libarchive.
30
+ #endif
31
+
32
+ #ifndef ARCHIVE_ENTRY_PRIVATE_H_INCLUDED
33
+ #define ARCHIVE_ENTRY_PRIVATE_H_INCLUDED
34
+
35
+ #include "archive_string.h"
36
+
37
+ /*
38
+ * Handle wide character (i.e., Unicode) and non-wide character
39
+ * strings transparently.
40
+ */
41
+
42
+ struct aes {
43
+ struct archive_string aes_mbs;
44
+ struct archive_string aes_utf8;
45
+ const wchar_t *aes_wcs;
46
+ /* Bitmap of which of the above are valid. Because we're lazy
47
+ * about malloc-ing and reusing the underlying storage, we
48
+ * can't rely on NULL pointers to indicate whether a string
49
+ * has been set. */
50
+ int aes_set;
51
+ #define AES_SET_MBS 1
52
+ #define AES_SET_UTF8 2
53
+ #define AES_SET_WCS 4
54
+ };
55
+
56
+ struct ae_acl {
57
+ struct ae_acl *next;
58
+ int type; /* E.g., access or default */
59
+ int tag; /* E.g., user/group/other/mask */
60
+ int permset; /* r/w/x bits */
61
+ int id; /* uid/gid for user/group */
62
+ struct aes name; /* uname/gname */
63
+ };
64
+
65
+ struct ae_xattr {
66
+ struct ae_xattr *next;
67
+
68
+ char *name;
69
+ void *value;
70
+ size_t size;
71
+ };
72
+
73
+ /*
74
+ * Description of an archive entry.
75
+ *
76
+ * Basically, this is a "struct stat" with a few text fields added in.
77
+ *
78
+ * TODO: Add "comment", "charset", and possibly other entries
79
+ * that are supported by "pax interchange" format. However, GNU, ustar,
80
+ * cpio, and other variants don't support these features, so they're not an
81
+ * excruciatingly high priority right now.
82
+ *
83
+ * TODO: "pax interchange" format allows essentially arbitrary
84
+ * key/value attributes to be attached to any entry. Supporting
85
+ * such extensions may make this library useful for special
86
+ * applications (e.g., a package manager could attach special
87
+ * package-management attributes to each entry). There are tricky
88
+ * API issues involved, so this is not going to happen until
89
+ * there's a real demand for it.
90
+ *
91
+ * TODO: Design a good API for handling sparse files.
92
+ */
93
+ struct archive_entry {
94
+ /*
95
+ * Note that ae_stat.st_mode & AE_IFMT can be 0!
96
+ *
97
+ * This occurs when the actual file type of the object is not
98
+ * in the archive. For example, 'tar' archives store
99
+ * hardlinks without marking the type of the underlying
100
+ * object.
101
+ */
102
+
103
+ /*
104
+ * Read archive_entry_copy_stat.c for an explanation of why I
105
+ * don't just use "struct stat" instead of "struct aest" here
106
+ * and why I have this odd pointer to a separately-allocated
107
+ * struct stat.
108
+ */
109
+ void *stat;
110
+ int stat_valid; /* Set to 0 whenever a field in aest changes. */
111
+
112
+ struct aest {
113
+ int64_t aest_atime;
114
+ uint32_t aest_atime_nsec;
115
+ int64_t aest_ctime;
116
+ uint32_t aest_ctime_nsec;
117
+ int64_t aest_mtime;
118
+ uint32_t aest_mtime_nsec;
119
+ int64_t aest_birthtime;
120
+ uint32_t aest_birthtime_nsec;
121
+ gid_t aest_gid;
122
+ int64_t aest_ino;
123
+ mode_t aest_mode;
124
+ uint32_t aest_nlink;
125
+ uint64_t aest_size;
126
+ uid_t aest_uid;
127
+ /*
128
+ * Because converting between device codes and
129
+ * major/minor values is platform-specific and
130
+ * inherently a bit risky, we only do that conversion
131
+ * lazily. That way, we will do a better job of
132
+ * preserving information in those cases where no
133
+ * conversion is actually required.
134
+ */
135
+ int aest_dev_is_broken_down;
136
+ dev_t aest_dev;
137
+ dev_t aest_devmajor;
138
+ dev_t aest_devminor;
139
+ int aest_rdev_is_broken_down;
140
+ dev_t aest_rdev;
141
+ dev_t aest_rdevmajor;
142
+ dev_t aest_rdevminor;
143
+ } ae_stat;
144
+
145
+ int ae_set; /* bitmap of fields that are currently set */
146
+ #define AE_SET_HARDLINK 1
147
+ #define AE_SET_SYMLINK 2
148
+ #define AE_SET_ATIME 4
149
+ #define AE_SET_CTIME 8
150
+ #define AE_SET_MTIME 16
151
+ #define AE_SET_BIRTHTIME 32
152
+ #define AE_SET_SIZE 64
153
+
154
+ /*
155
+ * Use aes here so that we get transparent mbs<->wcs conversions.
156
+ */
157
+ struct aes ae_fflags_text; /* Text fflags per fflagstostr(3) */
158
+ unsigned long ae_fflags_set; /* Bitmap fflags */
159
+ unsigned long ae_fflags_clear;
160
+ struct aes ae_gname; /* Name of owning group */
161
+ struct aes ae_hardlink; /* Name of target for hardlink */
162
+ struct aes ae_pathname; /* Name of entry */
163
+ struct aes ae_symlink; /* symlink contents */
164
+ struct aes ae_uname; /* Name of owner */
165
+
166
+ /* Not used within libarchive; useful for some clients. */
167
+ struct aes ae_sourcepath; /* Path this entry is sourced from. */
168
+
169
+ /* ACL support. */
170
+ struct ae_acl *acl_head;
171
+ struct ae_acl *acl_p;
172
+ int acl_state; /* See acl_next for details. */
173
+ wchar_t *acl_text_w;
174
+
175
+ /* extattr support. */
176
+ struct ae_xattr *xattr_head;
177
+ struct ae_xattr *xattr_p;
178
+
179
+ /* Miscellaneous. */
180
+ char strmode[12];
181
+ };
182
+
183
+
184
+ #endif /* ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */
@@ -0,0 +1,118 @@
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_entry_stat.c 201100 2009-12-28 03:05:31Z kientzle $");
28
+
29
+ #ifdef HAVE_SYS_STAT_H
30
+ #include <sys/stat.h>
31
+ #endif
32
+ #ifdef HAVE_STDLIB_H
33
+ #include <stdlib.h>
34
+ #endif
35
+
36
+ #include "archive_entry.h"
37
+ #include "archive_entry_private.h"
38
+
39
+ const struct stat *
40
+ archive_entry_stat(struct archive_entry *entry)
41
+ {
42
+ struct stat *st;
43
+ if (entry->stat == NULL) {
44
+ entry->stat = malloc(sizeof(*st));
45
+ if (entry->stat == NULL)
46
+ return (NULL);
47
+ entry->stat_valid = 0;
48
+ }
49
+
50
+ /*
51
+ * If none of the underlying fields have been changed, we
52
+ * don't need to regenerate. In theory, we could use a bitmap
53
+ * here to flag only those items that have changed, but the
54
+ * extra complexity probably isn't worth it. It will be very
55
+ * rare for anyone to change just one field then request a new
56
+ * stat structure.
57
+ */
58
+ if (entry->stat_valid)
59
+ return (entry->stat);
60
+
61
+ st = entry->stat;
62
+ /*
63
+ * Use the public interfaces to extract items, so that
64
+ * the appropriate conversions get invoked.
65
+ */
66
+ st->st_atime = archive_entry_atime(entry);
67
+ #if HAVE_STRUCT_STAT_ST_BIRTHTIME
68
+ st->st_birthtime = archive_entry_birthtime(entry);
69
+ #endif
70
+ st->st_ctime = archive_entry_ctime(entry);
71
+ st->st_mtime = archive_entry_mtime(entry);
72
+ st->st_dev = archive_entry_dev(entry);
73
+ st->st_gid = archive_entry_gid(entry);
74
+ st->st_uid = archive_entry_uid(entry);
75
+ st->st_ino = archive_entry_ino64(entry);
76
+ st->st_nlink = archive_entry_nlink(entry);
77
+ st->st_rdev = archive_entry_rdev(entry);
78
+ st->st_size = archive_entry_size(entry);
79
+ st->st_mode = archive_entry_mode(entry);
80
+
81
+ /*
82
+ * On systems that support high-res timestamps, copy that
83
+ * information into struct stat.
84
+ */
85
+ #if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
86
+ st->st_atimespec.tv_nsec = archive_entry_atime_nsec(entry);
87
+ st->st_ctimespec.tv_nsec = archive_entry_ctime_nsec(entry);
88
+ st->st_mtimespec.tv_nsec = archive_entry_mtime_nsec(entry);
89
+ #elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
90
+ st->st_atim.tv_nsec = archive_entry_atime_nsec(entry);
91
+ st->st_ctim.tv_nsec = archive_entry_ctime_nsec(entry);
92
+ st->st_mtim.tv_nsec = archive_entry_mtime_nsec(entry);
93
+ #elif HAVE_STRUCT_STAT_ST_MTIME_N
94
+ st->st_atime_n = archive_entry_atime_nsec(entry);
95
+ st->st_ctime_n = archive_entry_ctime_nsec(entry);
96
+ st->st_mtime_n = archive_entry_mtime_nsec(entry);
97
+ #elif HAVE_STRUCT_STAT_ST_UMTIME
98
+ st->st_uatime = archive_entry_atime_nsec(entry) / 1000;
99
+ st->st_uctime = archive_entry_ctime_nsec(entry) / 1000;
100
+ st->st_umtime = archive_entry_mtime_nsec(entry) / 1000;
101
+ #elif HAVE_STRUCT_STAT_ST_MTIME_USEC
102
+ st->st_atime_usec = archive_entry_atime_nsec(entry) / 1000;
103
+ st->st_ctime_usec = archive_entry_ctime_nsec(entry) / 1000;
104
+ st->st_mtime_usec = archive_entry_mtime_nsec(entry) / 1000;
105
+ #endif
106
+ #if HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
107
+ st->st_birthtimespec.tv_nsec = archive_entry_birthtime_nsec(entry);
108
+ #endif
109
+
110
+ /*
111
+ * TODO: On Linux, store 32 or 64 here depending on whether
112
+ * the cached stat structure is a stat32 or a stat64. This
113
+ * will allow us to support both variants interchangably.
114
+ */
115
+ entry->stat_valid = 1;
116
+
117
+ return (st);
118
+ }