1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-04-20 18:56:39 +02:00

Make `cp --link --no-dereference' work also on systems where the

link system call cannot create a hard link to a symbolic link.

(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>
This commit is contained in:
Jim Meyering
2006-06-03 09:04:22 +00:00
parent 6293c4ae50
commit 4c7979f7c2

View File

@@ -1594,7 +1594,22 @@ copy_internal (char const *src_name, char const *dst_name,
}
}
#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))