summaryrefslogtreecommitdiff
path: root/backup.c
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2022-02-16 16:35:35 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2022-02-16 16:35:35 +0900
commitf06790ac116291bcef7fd6c9057b17306fc8f74b (patch)
tree5830eb26cd754cba21f0117f078eafb553851123 /backup.c
parent6128f56694623bf0ea09f4fc22f9a94996335e65 (diff)
downloadrsync-f06790ac116291bcef7fd6c9057b17306fc8f74b.tar.gz
rsync-f06790ac116291bcef7fd6c9057b17306fc8f74b.tar.bz2
rsync-f06790ac116291bcef7fd6c9057b17306fc8f74b.zip
Imported Upstream version 3.1.2upstream/3.1.2
Diffstat (limited to 'backup.c')
-rw-r--r--backup.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/backup.c b/backup.c
index 8987723c..bc5e9273 100644
--- a/backup.c
+++ b/backup.c
@@ -2,7 +2,7 @@
* Backup handling code.
*
* Copyright (C) 1999 Andrew Tridgell
- * Copyright (C) 2003-2014 Wayne Davison
+ * Copyright (C) 2003-2015 Wayne Davison
*
* 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
@@ -157,6 +157,18 @@ static BOOL copy_valid_path(const char *fname)
char *get_backup_name(const char *fname)
{
if (backup_dir) {
+ static int initialized = 0;
+ if (!initialized) {
+ int ret;
+ if (backup_dir_len > 1)
+ backup_dir_buf[backup_dir_len-1] = '\0';
+ ret = make_path(backup_dir_buf, 0);
+ if (backup_dir_len > 1)
+ backup_dir_buf[backup_dir_len-1] = '/';
+ if (ret < 0)
+ return NULL;
+ initialized = 1;
+ }
/* copy fname into backup_dir_buf while validating the dirs. */
if (copy_valid_path(fname))
return backup_dir_buf;
@@ -208,23 +220,24 @@ static inline int link_or_rename(const char *from, const char *to,
return 0;
}
-/* Hard-link, rename, or copy an item to the backup name. Returns 2 if item
- * was duplicated into backup area, 1 if item was moved, or 0 for failure.*/
+/* Hard-link, rename, or copy an item to the backup name. Returns 0 for
+ * failure, 1 if item was moved, 2 if item was duplicated or hard linked
+ * into backup area, or 3 if item doesn't exist or isn't a regular file. */
int make_backup(const char *fname, BOOL prefer_rename)
{
stat_x sx;
struct file_struct *file;
int save_preserve_xattrs;
- char *buf = get_backup_name(fname);
+ char *buf;
int ret = 0;
- if (!buf)
- return 0;
-
init_stat_x(&sx);
/* Return success if no file to keep. */
if (x_lstat(fname, &sx.st, NULL) < 0)
- return 1;
+ return 3;
+
+ if (!(buf = get_backup_name(fname)))
+ return 0;
/* Try a hard-link or a rename first. Using rename is not atomic, but
* is more efficient than forcing a copy for larger files when no hard-
@@ -244,7 +257,7 @@ int make_backup(const char *fname, BOOL prefer_rename)
/* Fall back to making a copy. */
if (!(file = make_file(fname, NULL, &sx.st, 0, NO_FILTERS)))
- return 1; /* the file could have disappeared */
+ return 3; /* the file could have disappeared */
#ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode)) {
@@ -299,7 +312,7 @@ int make_backup(const char *fname, BOOL prefer_rename)
#ifdef SUPPORT_XATTRS
uncache_tmp_xattrs();
#endif
- return 2;
+ return 3;
}
/* Copy to backup tree if a file. */