]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Don't try to hardlink dirs for -pl; this always fails
authorTim Kientzle <kientzle@gmail.com>
Mon, 30 Jun 2008 22:42:49 +0000 (18:42 -0400)
committerTim Kientzle <kientzle@gmail.com>
Mon, 30 Jun 2008 22:42:49 +0000 (18:42 -0400)
and generated an annoying warning for every directory.

SVN-Revision: 145

cpio/cpio.c

index a92cd3e866bf5ae362926077582e9d451f70d904..515e9921d058ac835990ea5eb97f183036b4ac78 100644 (file)
@@ -535,16 +535,23 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
                fprintf(stderr,"%s", destpath);
 
        /*
-        * Obviously, this only gets invoked in pass mode.
+        * Obviously, this only gets invoked in pass mode, since
+        * option_link is nonsense otherwise.  Note that we can't
+        * hardlink dirs, and that if a link operation fails (because
+        * of cross-device restrictions), we'll fall back to copy mode
+        * for that entry.
         */
-       if (cpio->option_link) {
+       if (cpio->option_link
+           && archive_entry_filetype(entry) != AE_IFDIR)
+       {
                struct archive_entry *t;
                /* Save the original entry in case we need it later. */
                t = archive_entry_clone(entry);
                if (t == NULL)
                        cpio_errc(1, ENOMEM, "Can't create link");
                /* Note: link(2) doesn't create parent directories,
-                * so we use archive_write_header() instead. */
+                * so we use archive_write_header() instead as a
+                * convenience. */
                archive_entry_set_hardlink(t, srcpath);
                archive_entry_set_size(t, 0);
                r = archive_write_header(cpio->archive, t);