summaryrefslogtreecommitdiffstats
path: root/lib/backup-files.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/backup-files.c')
-rw-r--r--lib/backup-files.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/lib/backup-files.c b/lib/backup-files.c
index b989bde..c7c716d 100644
--- a/lib/backup-files.c
+++ b/lib/backup-files.c
@@ -320,10 +320,13 @@ process_file(const char *file)
} else {
if (!opt_silent)
printf("Copying %s\n", file);
- if (link_or_copy_file(file, &st, backup))
- goto fail;
- if (opt_nolinks) {
- if (ensure_nolinks(file))
+ if (opt_nolinks && st.st_nlink == 1) {
+ if (copy_file(file, &st, backup))
+ goto fail;
+ } else {
+ if (link_or_copy_file(file, &st, backup))
+ goto fail;
+ if (opt_nolinks && ensure_nolinks(file))
goto fail;
}
if (opt_touch)
@@ -356,14 +359,17 @@ process_file(const char *file)
if (!opt_silent)
printf("Restoring %s\n", file);
unlink(file);
- if (link_or_copy_file(backup, &st, file))
- goto fail;
- unlink(backup);
- remove_parents(backup);
- if (opt_nolinks) {
- if (ensure_nolinks(file))
+ if (opt_nolinks && st.st_nlink != 1) {
+ if (copy_file(backup, &st, file))
+ goto fail;
+ } else {
+ if (link_or_copy_file(backup, &st, file))
+ goto fail;
+ if (opt_nolinks && ensure_nolinks(file))
goto fail;
}
+ unlink(backup);
+ remove_parents(backup);
if (opt_touch)
(void) utime(file, NULL);
else {