diff options
author | Wayne Davison <wayned@samba.org> | 2009-04-10 23:16:41 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2009-04-10 23:33:08 -0700 |
commit | d735fe20146bc4deedd0b23f3f489240ea9b5a7f (patch) | |
tree | 34c39c1ec7721bb1ad6a513692ed84acf082de31 /backup.c | |
parent | 7e6c8ad6534075c93b0b43360a93d4728e52b67f (diff) | |
download | android_external_rsync-d735fe20146bc4deedd0b23f3f489240ea9b5a7f.tar.gz android_external_rsync-d735fe20146bc4deedd0b23f3f489240ea9b5a7f.tar.bz2 android_external_rsync-d735fe20146bc4deedd0b23f3f489240ea9b5a7f.zip |
Improved link_or_rename() to handle prefer_rename better.
Diffstat (limited to 'backup.c')
-rw-r--r-- | backup.c | 29 |
1 files changed, 12 insertions, 17 deletions
@@ -145,28 +145,23 @@ int make_bak_dir(const char *fullpath) static inline int link_or_rename(const char *from, const char *to, BOOL prefer_rename, STRUCT_STAT *stp) { - if (S_ISLNK(stp->st_mode)) { - if (prefer_rename) - goto do_rename; +#ifdef SUPPORT_HARD_LINKS + if (!prefer_rename) { #ifndef CAN_HARDLINK_SYMLINK - return 0; /* Use copy code. */ + if (S_ISLNK(stp->st_mode)) + return 0; /* Use copy code. */ #endif - } - if (IS_SPECIAL(stp->st_mode) || IS_DEVICE(stp->st_mode)) { - if (prefer_rename) - goto do_rename; #ifndef CAN_HARDLINK_SPECIAL - return 0; /* Use copy code. */ + if (IS_SPECIAL(stp->st_mode) || IS_DEVICE(stp->st_mode)) + return 0; /* Use copy code. */ #endif - } -#ifdef SUPPORT_HARD_LINKS - if (!S_ISDIR(stp->st_mode)) { - if (do_link(from, to) == 0) - return 2; - return 0; + if (!S_ISDIR(stp->st_mode)) { + if (do_link(from, to) == 0) + return 2; + return 0; + } } #endif - do_rename: if (do_rename(from, to) == 0) { if (stp->st_nlink > 1 && !S_ISDIR(stp->st_mode)) { /* If someone has hard-linked the file into the backup @@ -201,7 +196,7 @@ int make_backup(const char *fname, BOOL prefer_rename) * linking is possible. */ if ((ret = link_or_rename(fname, buf, prefer_rename, &sx.st)) != 0) goto success; - if (errno == EEXIST) { + if (errno == EEXIST || errno == EISDIR) { STRUCT_STAT bakst; if (do_lstat(buf, &bakst) == 0) { int flags = get_del_for_flag(bakst.st_mode) | DEL_FOR_BACKUP | DEL_RECURSE; |