Michael Stone <[EMAIL PROTECTED]> wrote:
> Have you seen this bug report?
>
> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=329451

Yes.
I've just dealt with it on the upstream trunk:

2006-06-03  Jim Meyering  <[EMAIL PROTECTED]>

        Make `cp --link --no-dereference' work also on systems where the
        link system call cannot create a hard link to a symbolic link.
        * src/copy.c (copy_internal) [LINK_FOLLOWS_SYMLINKS]: Don't use
        the link syscall on a symlink when it would do the wrong thing.
        Based on the patch by Aurelien Jarno: <http://bugs.debian.org/329451>
        * tests/cp/link-no-deref: New file/test for the above.
        * tests/cp/Makefile.am (TESTS): Add link-no-deref.
        * NEWS: Mention the change (doesn't affect Linux).

Index: src/copy.c
===================================================================
RCS file: /fetish/cu/src/copy.c,v
retrieving revision 1.199
retrieving revision 1.200
diff -u -p -u -r1.199 -r1.200
--- src/copy.c  11 May 2006 08:55:04 -0000      1.199
+++ src/copy.c  3 Jun 2006 09:04:22 -0000       1.200
@@ -1594,7 +1594,22 @@ copy_internal (char const *src_name, cha
        }
     }
 #endif
-  else if (x->hard_link)
+
+  else if (x->hard_link
+#ifdef LINK_FOLLOWS_SYMLINKS
+  /* A POSIX-conforming link syscall dereferences a symlink, yet cp,
+     invoked with `--link --no-dereference', should not.  Thus, with
+     a POSIX-conforming link system call, we can't use link() here,
+     since that would create a hard link to the referent (effectively
+     dereferencing the symlink), rather than to the symlink itself.
+     We can approximate the desired behavior by skipping this hard-link
+     creating block and instead copying the symlink, via the `S_ISLNK'-
+     copying code below.
+     When link operates on the symlinks themselves, we use this block
+     and just call link().  */
+          && !(S_ISLNK (src_mode) && x->dereference == DEREF_NEVER)
+#endif
+          )
     {
       preserve_metadata = false;
       if (link (src_name, dst_name))


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to