diff options
author | Jim Meyering <jim@meyering.net> | 2003-02-28 21:36:18 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-02-28 21:36:18 +0000 |
commit | a1d2e330ec2202dbefd07c123d360bb700cee254 (patch) | |
tree | d208d763ee23b4e2950ca7992fea891da2e9f68c /src | |
parent | 1fce29ae9355f55a419cded1d4be4fd2361641a0 (diff) | |
download | coreutils-a1d2e330ec2202dbefd07c123d360bb700cee254.tar.xz |
(copy_internal): When link fails because of an
existing destination file, unlink that file and try again.
Diffstat (limited to 'src')
-rw-r--r-- | src/copy.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/copy.c b/src/copy.c index 862ce466f..fcb4854cc 100644 --- a/src/copy.c +++ b/src/copy.c @@ -1,5 +1,5 @@ /* copy.c -- core functions for copying files and directories - Copyright (C) 89, 90, 91, 1995-2002 Free Software Foundation. + Copyright (C) 89, 90, 91, 1995-2003 Free Software Foundation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1110,14 +1110,32 @@ copy_internal (const char *src_path, const char *dst_path, goto un_backup; } - if (link (earlier_file, dst_path)) - { - error (0, errno, _("cannot create hard link %s to %s"), - quote_n (0, dst_path), quote_n (1, earlier_file)); - goto un_backup; - } + { + int link_failed; + + link_failed = link (earlier_file, dst_path); + + /* If the link failed because of an existing destination, + remove that file and then call link again. */ + if (link_failed && errno == EEXIST) + { + if (unlink (dst_path)) + { + error (0, errno, _("cannot remove %s"), quote (dst_path)); + goto un_backup; + } + link_failed = link (earlier_file, dst_path); + } + + if (link_failed) + { + error (0, errno, _("cannot create hard link %s to %s"), + quote_n (0, dst_path), quote_n (1, earlier_file)); + goto un_backup; + } - return 0; + return 0; + } } if (x->move_mode) |