| @@ -14,27 +14,27 @@ | | | @@ -14,27 +14,27 @@ |
14 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR | | 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 | | 15 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
16 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | | 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, | | 17 | * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, |
18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | | 18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
19 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | | 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 | | 20 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
21 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | | 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 | | 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. | | 23 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 | */ | | 24 | */ |
25 | | | 25 | |
26 | #include "archive_platform.h" | | 26 | #include "archive_platform.h" |
27 | __FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_link_resolver.c,v 1.1 2007/12/30 04:58:21 kientzle Exp $"); | | 27 | __FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_link_resolver.c,v 1.3 2008/06/15 04:31:43 kientzle Exp $"); |
28 | | | 28 | |
29 | #ifdef HAVE_SYS_STAT_H | | 29 | #ifdef HAVE_SYS_STAT_H |
30 | #include <sys/stat.h> | | 30 | #include <sys/stat.h> |
31 | #endif | | 31 | #endif |
32 | #ifdef HAVE_ERRNO_H | | 32 | #ifdef HAVE_ERRNO_H |
33 | #include <errno.h> | | 33 | #include <errno.h> |
34 | #endif | | 34 | #endif |
35 | #include <stdio.h> | | 35 | #include <stdio.h> |
36 | #ifdef HAVE_STDLIB_H | | 36 | #ifdef HAVE_STDLIB_H |
37 | #include <stdlib.h> | | 37 | #include <stdlib.h> |
38 | #endif | | 38 | #endif |
39 | #ifdef HAVE_STRING_H | | 39 | #ifdef HAVE_STRING_H |
40 | #include <string.h> | | 40 | #include <string.h> |
| @@ -173,26 +173,29 @@ archive_entry_linkify(struct archive_ent | | | @@ -173,26 +173,29 @@ archive_entry_linkify(struct archive_ent |
173 | | | 173 | |
174 | if (*e == NULL) { | | 174 | if (*e == NULL) { |
175 | le = next_entry(res); | | 175 | le = next_entry(res); |
176 | if (le != NULL) { | | 176 | if (le != NULL) { |
177 | *e = le->entry; | | 177 | *e = le->entry; |
178 | le->entry = NULL; | | 178 | le->entry = NULL; |
179 | } | | 179 | } |
180 | return; | | 180 | return; |
181 | } | | 181 | } |
182 | | | 182 | |
183 | /* If it has only one link, then we're done. */ | | 183 | /* If it has only one link, then we're done. */ |
184 | if (archive_entry_nlink(*e) == 1) | | 184 | if (archive_entry_nlink(*e) == 1) |
185 | return; | | 185 | return; |
| | | 186 | /* Directories never have hardlinks. */ |
| | | 187 | if (archive_entry_filetype(*e) == AE_IFDIR) |
| | | 188 | return; |
186 | | | 189 | |
187 | switch (res->strategy) { | | 190 | switch (res->strategy) { |
188 | case ARCHIVE_ENTRY_LINKIFY_LIKE_TAR: | | 191 | case ARCHIVE_ENTRY_LINKIFY_LIKE_TAR: |
189 | le = find_entry(res, *e); | | 192 | le = find_entry(res, *e); |
190 | if (le != NULL) { | | 193 | if (le != NULL) { |
191 | archive_entry_set_size(*e, 0); | | 194 | archive_entry_set_size(*e, 0); |
192 | archive_entry_copy_hardlink(*e, | | 195 | archive_entry_copy_hardlink(*e, |
193 | archive_entry_pathname(le->canonical)); | | 196 | archive_entry_pathname(le->canonical)); |
194 | } else | | 197 | } else |
195 | insert_entry(res, *e); | | 198 | insert_entry(res, *e); |
196 | return; | | 199 | return; |
197 | case ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE: | | 200 | case ARCHIVE_ENTRY_LINKIFY_LIKE_MTREE: |
198 | le = find_entry(res, *e); | | 201 | le = find_entry(res, *e); |