make --address work for a client connecting to a server
[rsync/rsync.git] / generator.c
index bbc328d..3f6322f 100644 (file)
@@ -177,6 +177,7 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
        char fnamecmpbuf[MAXPATHLEN];
        extern char *compare_dest;
        extern int list_only;
+       extern int preserve_perms;
 
        if (list_only) return;
 
@@ -185,6 +186,15 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
 
        statret = link_stat(fname,&st);
 
+       if (statret == 0 && 
+           !preserve_perms && 
+           (S_ISDIR(st.st_mode) == S_ISDIR(file->mode))) {
+               /* 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 = (file->mode & _S_IFMT) | (st.st_mode & ~_S_IFMT);
+       }
+
        if (S_ISDIR(file->mode)) {
                if (dry_run) return;
                if (statret == 0 && !S_ISDIR(st.st_mode)) {
@@ -340,11 +350,13 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
        }
 
        /* open the file */  
-       fd = open(fnamecmp,O_RDONLY);
+       fd = do_open(fnamecmp, O_RDONLY, 0);
 
        if (fd == -1) {
-               rprintf(FERROR,"failed to open %s : %s\n",fnamecmp,strerror(errno));
-               rprintf(FERROR,"skipping %s\n",fname);
+               rprintf(FERROR,"failed to open %s, continuing : %s\n",fnamecmp,strerror(errno));
+               /* pretend the file didn't exist */
+               write_int(f_out,i);
+               send_sums(NULL,f_out);
                return;
        }