From e81d02baf15b7132b2b28439e81c71652f4667cf Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sat, 29 Jun 1996 03:58:48 +0000 Subject: (do_link): Allow `ln -sf --backup k k' to succeed in creating the self-referential symlink, doing so doesn't remove the source but merely renames it. --- src/ln.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'src/ln.c') diff --git a/src/ln.c b/src/ln.c index c193bd52c..ee3e793fc 100644 --- a/src/ln.c +++ b/src/ln.c @@ -190,11 +190,19 @@ do_link (const char *source, const char *dest) return 1; } - /* If --force (-f) has been specified, before making a link ln must - remove the destination file if it exists. But if the source and - destination are the same, don't remove anything and fail right here. */ + /* If --force (-f) has been specified without --backup, then before + making a link ln must remove the destination file if it exists. + (with --backup, it just renames any existing destination file) + But if the source and destination are the same, don't remove + anything and fail right here. */ if (remove_existing_files && lstat_status == 0 + /* Allow `ln -sf --backup k k' to succeed in creating the + self-referential symlink, but don't allow the hard-linking + equivalent: `ln -f k k' (with or without --backup) to get + beyond this point, because the error message you'd get is + misleading. */ + && (backup_type == none || !symlink) && (!symlink || stat (source, &source_stats) == 0) && source_stats.st_dev == dest_stats.st_dev && source_stats.st_ino == dest_stats.st_ino -- cgit v1.2.3-54-g00ecf