fixed mdfour code on Cray (64 bit problems)
[rsync/rsync.git] / receiver.c
index 49d1bf2..3cd7f9e 100644 (file)
@@ -303,14 +303,18 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
        int phase=0;
        int recv_ok;
        extern struct stats stats;              
+       extern int preserve_perms;
+       extern int delete_after;
        struct stats initial_stats;
 
        if (verbose > 2) {
                rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
        }
 
-       if (recurse && delete_mode && !local_name && flist->count>0) {
-               delete_files(flist);
+       if (!delete_after) {
+               if (recurse && delete_mode && !local_name && flist->count>0) {
+                       delete_files(flist);
+               }
        }
 
        while (1) {      
@@ -383,6 +387,13 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                        continue;
                }
 
+               if (fd1 != -1 && !preserve_perms) {
+                       /* if the file exists already and we aren't perserving
+                          presmissions then act as though the remote end sent
+                          us the file permissions we already have */
+                       file->mode = st.st_mode;
+               }
+
                if (fd1 != -1 && st.st_size > 0) {
                        buf = map_file(fd1,st.st_size);
                        if (verbose > 2)
@@ -457,7 +468,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                finish_transfer(fname, fnametmp, file);
 
                cleanup_disable();
-                               
+
                if (!recv_ok) {
                        if (csum_length == SUM_LENGTH) {
                                rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
@@ -470,6 +481,12 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                }
        }
 
+       if (delete_after) {
+               if (recurse && delete_mode && !local_name && flist->count>0) {
+                       delete_files(flist);
+               }
+       }
+
        if (preserve_hard_links)
                do_hard_links(flist);