fixed man page typo
[rsync/rsync.git] / generator.c
index 8afc8f7..886c672 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 = st.st_mode;
+       }
+
        if (S_ISDIR(file->mode)) {
                if (dry_run) return;
                if (statret == 0 && !S_ISDIR(st.st_mode)) {
@@ -224,7 +234,7 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
                        l = readlink(fname,lnk,MAXPATHLEN-1);
                        if (l > 0) {
                                lnk[l] = 0;
-                               if (strcmp(lnk,file->link) == 0) {
+                               if (file->link && strcmp(lnk,file->link) == 0) {
                                        set_perms(fname,file,&st,1);
                                        return;
                                }