[patch] Make robust_rename() handle EXDEV.

Shinichi Maruyama marya at st.jip.co.jp
Mon Feb 23 05:21:35 GMT 2004


wayned> On Tue, Feb 17, 2004 at 10:28:20AM -0500, Jason M. Felice wrote:
wayned> > All callers of robust_rename() call copy_file() if EXDEV is received.
wayned> > This patch moves the copy_file() call into robust_rename().
wayned> 
wayned> Seems like a good simplification.  I did a refinement pass on your
wayned> changes, and also added back a do_unlink() call that should not have
wayned> been dropped.  So, here's my version of the patch.

	I use rsync 2.6.1cvs.
	With --backup --backup-dir=... , rsync sometimes says some
errors like "No such file or directory".
	I made a little fixes.

Index: backup.c
===================================================================
RCS file: /cvsroot/rsync/backup.c,v
retrieving revision 1.26
diff -u -r1.26 backup.c
--- backup.c	17 Feb 2004 23:13:10 -0000	1.26
+++ backup.c	23 Feb 2004 05:05:07 -0000
@@ -130,8 +130,8 @@
 /* robustly move a file, creating new directory structures if necessary */
 static int robust_move(char *src, char *dst)
 {
-	if (robust_rename(src, dst, 0755) != 0 || errno != ENOENT
-	    || make_bak_dir(dst) < 0 || robust_rename(src, dst, 0755) != 0)
+	if (robust_rename(src, dst, 0755) != 0 && (errno != ENOENT
+	    || make_bak_dir(dst) < 0 || robust_rename(src, dst, 0755) != 0))
 		return -1;
 	return 0;
 }
@@ -224,7 +224,7 @@
 
 	/* move to keep tree if a file */
 	if (!kept) {
-		if (!robust_move(fname, backup_dir_buf)) {
+		if (robust_move(fname, backup_dir_buf) != 0) {
 			rprintf(FERROR, "keep_backup failed: %s -> \"%s\": %s\n",
 				full_fname(fname), backup_dir_buf, strerror(errno));
 		}

-- 
Yes, I'm in panic.
Shinichi Maruyama (marya at st.jip.co.jp)


More information about the rsync mailing list