Changed most instances of "remote_version" to "protocol_version", and
[rsync/rsync.git] / receiver.c
index 0016064..28f631e 100644 (file)
@@ -23,7 +23,7 @@
 extern int verbose;
 extern int recurse;
 extern int delete_mode;
-extern int remote_version;
+extern int protocol_version;
 extern int csum_length;
 extern struct stats stats;
 extern int dry_run;
@@ -59,7 +59,7 @@ static int delete_already_done(struct file_list *flist,int j)
 
        for (i=0;i<dlist_len;i++) {
                if (st.st_ino == delete_list[i].inode &&
-                   st.st_dev == delete_list[i].dev)
+                   (DEV64_T)st.st_dev == delete_list[i].dev)
                        return 1;
        }
 
@@ -136,7 +136,7 @@ void delete_files(struct file_list *flist)
                if (!S_ISDIR(flist->files[j]->mode) || 
                    !(flist->files[j]->flags & FLAG_DELETE)) continue;
 
-               if (remote_version < 19 &&
+               if (protocol_version < 19 &&
                    delete_already_done(flist, j)) continue;
 
                name = strdup(f_name(flist->files[j]));
@@ -152,7 +152,7 @@ void delete_files(struct file_list *flist)
                for (i=local_file_list->count-1;i>=0;i--) {
                        if (max_delete && deletion_count > max_delete) break;
                        if (!local_file_list->files[i]->basename) continue;
-                       if (remote_version < 19 &&
+                       if (protocol_version < 19 &&
                            S_ISDIR(local_file_list->files[i]->mode))
                                add_delete_entry(local_file_list->files[i]);
                        if (-1 == flist_find(flist,local_file_list->files[i])) {
@@ -419,13 +419,25 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                        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) {
                        /* if the file exists already and we aren't preserving
                           permissions then act as though the remote end sent