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@pegasys.ws
Remember Cernan and Schmitt