diff options
author | Wayne Davison <wayned@samba.org> | 2007-12-31 10:18:22 -0800 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2007-12-31 10:31:43 -0800 |
commit | 83235dbc546d74ee325bb09b602bd62313fea793 (patch) | |
tree | 0a783fa5a842ea5b63474bd0bc17eb2dd95b66c6 /receiver.c | |
parent | c78cb8f349d74dbb19abbc4edeef12655bdcdf23 (diff) | |
download | android_external_rsync-83235dbc546d74ee325bb09b602bd62313fea793.tar.gz android_external_rsync-83235dbc546d74ee325bb09b602bd62313fea793.tar.bz2 android_external_rsync-83235dbc546d74ee325bb09b602bd62313fea793.zip |
Fixed a case where the receiver indicates a successful update when the
transfer succeeded, but the final rename failed.
Diffstat (limited to 'receiver.c')
-rw-r--r-- | receiver.c | 35 |
1 files changed, 20 insertions, 15 deletions
@@ -688,26 +688,23 @@ int recv_files(int f_in, char *local_name) } if ((recv_ok && (!delay_updates || !partialptr)) || inplace) { - char *temp_copy_name; if (partialptr == fname) - partialptr = temp_copy_name = NULL; - else if (*partial_dir == '/') - temp_copy_name = NULL; - else - temp_copy_name = partialptr; - finish_transfer(fname, fnametmp, fnamecmp, - temp_copy_name, file, recv_ok, 1); - if (fnamecmp == partialptr) { + partialptr = NULL; + if (!finish_transfer(fname, fnametmp, fnamecmp, + partialptr, file, recv_ok, 1)) + recv_ok = -1; + else if (fnamecmp == partialptr) { do_unlink(partialptr); handle_partial_dir(partialptr, PDIR_DELETE); } } else if (keep_partial && partialptr && handle_partial_dir(partialptr, PDIR_CREATE)) { - finish_transfer(partialptr, fnametmp, fnamecmp, NULL, - file, recv_ok, !partial_dir); - if (delay_updates && recv_ok) { - bitbag_set_bit(delayed_bits, ndx); + if (!finish_transfer(partialptr, fnametmp, fnamecmp, NULL, + file, recv_ok, !partial_dir)) recv_ok = -1; + else if (delay_updates && recv_ok) { + bitbag_set_bit(delayed_bits, ndx); + recv_ok = 2; } } else { partialptr = NULL; @@ -716,11 +713,13 @@ int recv_files(int f_in, char *local_name) cleanup_disable(); - if (recv_ok > 0) { + switch (recv_ok) { + case 1: if (remove_source_files || inc_recurse || (preserve_hard_links && F_IS_HLINKED(file))) send_msg_int(MSG_SUCCESS, ndx); - } else if (!recv_ok) { + break; + case 0: { enum logcode msgtype = redoing || read_batch ? FERROR : FWARNING; if (msgtype == FERROR || verbose) { char *errstr, *redostr, *keptstr; @@ -746,6 +745,12 @@ int recv_files(int f_in, char *local_name) file->flags |= FLAG_FILE_SENT; } else if (inc_recurse) send_msg_int(MSG_NO_SEND, ndx); + break; + } + case -1: + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); + break; } } if (make_backups < 0) |