Document the latest changes.
[rsync/rsync.git] / generator.c
index de5e2bb..d8e80e0 100644 (file)
@@ -43,6 +43,16 @@ extern int protocol_version;
 extern int always_checksum;
 extern char *compare_dest;
 extern int link_dest;
+extern int whole_file;
+extern int local_server;
+extern int read_batch;
+extern int write_batch;
+extern int list_only;
+extern int only_existing;
+extern int orig_umask;
+extern int safe_symlinks;
+
+extern struct exclude_list_struct server_exclude_list;
 
 
 /* choose whether to skip a particular file */
@@ -53,7 +63,7 @@ static int skip_file(char *fname, struct file_struct *file, STRUCT_STAT *st)
        }
        if (link_dest) {
                if (preserve_perms
-                   && (st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT))
+                   && (st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
                        return 0;
 
                if (am_root && preserve_uid && st->st_uid != file->uid)
@@ -204,13 +214,9 @@ static void sum_sizes_sqroot(struct sum_struct *sum, uint64 len)
  * Whew. */
 static BOOL disable_deltas_p(void)
 {
-       extern int whole_file;
-       extern int local_server;
-       extern int write_batch;
-
        if (whole_file > 0)
                return True;
-       if (whole_file == 0 || write_batch)
+       if (whole_file == 0 || write_batch || read_batch)
                return False;
        return local_server;
 }
@@ -270,10 +276,6 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
        int statret;
        char *fnamecmp;
        char fnamecmpbuf[MAXPATHLEN];
-       extern char *compare_dest;
-       extern int list_only;
-       extern int only_existing;
-       extern int orig_umask;
 
        if (list_only)
                return;
@@ -281,6 +283,11 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
        if (verbose > 2)
                rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
 
+       if (server_exclude_list.head
+           && check_exclude(&server_exclude_list, fname,
+                            S_ISDIR(file->mode)) < 0)
+               return;
+
        statret = link_stat(fname,&st);
 
        if (only_existing && statret == -1 && errno == ENOENT) {
@@ -295,7 +302,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                /* if the file exists already and we aren't perserving
                 * permissions 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);
+               file->mode = (file->mode & ~CHMOD_BITS)
+                          | (st.st_mode & CHMOD_BITS);
        }
 
        if (S_ISDIR(file->mode)) {
@@ -308,19 +316,20 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                if (dry_run) return; /* XXXX -- might cause inaccuracies?? -- mbp */
                if (statret == 0 && !S_ISDIR(st.st_mode)) {
                        if (robust_unlink(fname) != 0) {
-                               rprintf(FERROR,
-                                       "recv_generator: unlink %s to make room for directory: %s\n",
-                                       full_fname(fname), strerror(errno));
+                               rsyserr(FERROR, errno,
+                                       "recv_generator: unlink %s to make room for directory",
+                                       full_fname(fname));
                                return;
                        }
                        statret = -1;
                }
                if (statret != 0 && do_mkdir(fname,file->mode) != 0 && errno != EEXIST) {
-                       if (!(relative_paths && errno==ENOENT &&
-                             create_directory_path(fname, orig_umask)==0 &&
-                             do_mkdir(fname,file->mode)==0)) {
-                               rprintf(FERROR, "recv_generator: mkdir %s failed: %s\n",
-                                       full_fname(fname), strerror(errno));
+                       if (!(relative_paths && errno == ENOENT
+                           && create_directory_path(fname, orig_umask) == 0
+                           && do_mkdir(fname, file->mode) == 0)) {
+                               rsyserr(FERROR, errno,
+                                       "recv_generator: mkdir %s failed",
+                                       full_fname(fname));
                        }
                }
                /* f_out is set to -1 when doing final directory
@@ -334,7 +343,6 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
 #if SUPPORT_LINKS
                char lnk[MAXPATHLEN];
                int l;
-               extern int safe_symlinks;
 
                if (safe_symlinks && unsafe_symlink(file->u.link, fname)) {
                        if (verbose) {
@@ -351,7 +359,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                                 * right place -- no further action
                                 * required. */
                                if (strcmp(lnk,file->u.link) == 0) {
-                                       set_perms(fname,file,&st,1);
+                                       set_perms(fname, file, &st,
+                                                 PERMS_REPORT);
                                        return;
                                }
                        }
@@ -361,8 +370,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                        delete_file(fname);
                }
                if (do_symlink(file->u.link,fname) != 0) {
-                       rprintf(FERROR, "symlink %s -> \"%s\" failed: %s\n",
-                               full_fname(fname), file->u.link, strerror(errno));
+                       rsyserr(FERROR, errno, "symlink %s -> \"%s\" failed",
+                               full_fname(fname), file->u.link);
                } else {
                        set_perms(fname,file,NULL,0);
                        if (verbose) {
@@ -377,21 +386,22 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
        if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
                if (statret != 0 ||
                    st.st_mode != file->mode ||
-                   (DEV64_T)st.st_rdev != file->u.rdev) {
+                   st.st_rdev != file->u.rdev) {
                        delete_file(fname);
-                       if (verbose > 2)
+                       if (verbose > 2) {
                                rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
                                        fname,(int)file->mode,(int)file->u.rdev);
+                       }
                        if (do_mknod(fname,file->mode,file->u.rdev) != 0) {
-                               rprintf(FERROR, "mknod %s failed: %s\n",
-                                       full_fname(fname), strerror(errno));
+                               rsyserr(FERROR, errno, "mknod %s failed",
+                                       full_fname(fname));
                        } else {
                                set_perms(fname,file,NULL,0);
                                if (verbose)
                                        rprintf(FINFO,"%s\n",fname);
                        }
                } else {
-                       set_perms(fname,file,&st,1);
+                       set_perms(fname, file, &st, PERMS_REPORT);
                }
                return;
        }
@@ -420,9 +430,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                else if (link_dest && !dry_run) {
                        if (do_link(fnamecmpbuf, fname) != 0) {
                                if (verbose > 0) {
-                                       rprintf(FINFO,"link %s => %s : %s\n",
-                                               fnamecmpbuf, fname,
-                                               strerror(errno));
+                                       rsyserr(FINFO, errno, "link %s => %s",
+                                               fnamecmpbuf, fname);
                                }
                        }
                        fnamecmp = fnamecmpbuf;
@@ -439,9 +448,9 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
                        write_int(f_out,i);
                        if (!dry_run) write_sum_head(f_out, NULL);
                } else if (verbose > 1) {
-                       rprintf(FERROR,
-                               "recv_generator: failed to open %s: %s\n",
-                               full_fname(fname), strerror(errno));
+                       rsyserr(FERROR, errno,
+                               "recv_generator: failed to open %s",
+                               full_fname(fname));
                }
                return;
        }
@@ -473,7 +482,7 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
 
        if (skip_file(fname, file, &st)) {
                if (fnamecmp == fname)
-                       set_perms(fname,file,&st,1);
+                       set_perms(fname, file, &st, PERMS_REPORT);
                return;
        }
 
@@ -492,8 +501,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
        fd = do_open(fnamecmp, O_RDONLY, 0);
 
        if (fd == -1) {
-               rprintf(FERROR, "failed to open %s, continuing: %s\n",
-                       full_fname(fnamecmp), strerror(errno));
+               rsyserr(FERROR, errno, "failed to open %s, continuing",
+                       full_fname(fnamecmp));
                /* pretend the file didn't exist */
                if (preserve_hard_links && hard_link_check(file, HL_SKIP))
                        return;