[patch] replace dir with file error

jw schultz jw at pegasys.ws
Wed Sep 3 09:43:07 EST 2003


Hit the "not a regular file (recv_files)" error last night
having replaced a directory with a file.

The really dumb part is that this was hit doing a link-dest
on an empty destination so the robust_unlink would have
presented no problem anyway.

I can see no reason why non-directory special files should
have any problem being replaced so i've changed that logic too.

The new code simply treats old non-directory special files
as though they were non-existent and the same for
directories if they aren't in the destination (coming from
link-dest or compare-dest.

As the new comment in the patch indicates, we wouldn't have
this problem at all if robust_unlink could cope with
non-empty directories.

Barring comments or objections i'll commit this soon.


Index: receiver.c
===================================================================
RCS file: /data/cvs/rsync/receiver.c,v
retrieving revision 1.51
diff -u -r1.51 receiver.c
--- receiver.c	21 Aug 2003 23:45:49 -0000	1.51
+++ receiver.c	2 Sep 2003 23:29:13 -0000
@@ -419,11 +419,23 @@
 			continue;
 		}
 
-		if (fd1 != -1 && !S_ISREG(st.st_mode)) {
-			rprintf(FERROR,"%s : not a regular file (recv_files)\n",fnamecmp);
-			receive_data(f_in,NULL,-1,NULL,file->length);
+		if (fd1 != -1 && S_ISDIR(st.st_mode) && fnamecmp == fname) {
+			/* this special handling for directories
+			 * wouldn't be necessary if robust_rename()
+			 * and the underlying robust_unlink could cope
+			 * with directories
+			 */
+			rprintf(FERROR,"%s : is a directory (recv_files)\n",
+			    fnamecmp);
+			receive_data(f_in, NULL, -1, NULL, file->length);
 			close(fd1);
 			continue;
+		}
+
+		if (fd1 != -1 && !S_ISREG(st.st_mode)) {
+			close(fd1);
+			fd1 = -1;
+			buf = NULL;
 		}
 
 		if (fd1 != -1 && !preserve_perms) {
-- 
________________________________________________________________
	J.W. Schultz            Pegasystems Technologies
	email address:		jw at pegasys.ws

		Remember Cernan and Schmitt



More information about the rsync mailing list