diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2022-02-16 16:35:35 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2022-02-16 16:35:35 +0900 |
commit | f06790ac116291bcef7fd6c9057b17306fc8f74b (patch) | |
tree | 5830eb26cd754cba21f0117f078eafb553851123 /backup.c | |
parent | 6128f56694623bf0ea09f4fc22f9a94996335e65 (diff) | |
download | rsync-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.c | 33 |
1 files changed, 23 insertions, 10 deletions
@@ -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. */ |