- Call map_file() with the new block_size arg (had to delay the
[rsync/rsync.git] / receiver.c
index 2eca4f6..6f2e2f5 100644 (file)
@@ -50,6 +50,9 @@ extern int keep_partial;
 extern int checksum_seed;
 extern int inplace;
 
+extern struct exclude_list_struct server_exclude_list;
+
+
 static void delete_one(char *fn, int is_dir)
 {
        if (!is_dir) {
@@ -300,6 +303,12 @@ static int receive_data(int f_in,struct map_struct *mapbuf,int fd,char *fname,
 }
 
 
+static void discard_receive_data(int f_in, OFF_T length)
+{
+       receive_data(f_in, NULL, -1, NULL, length);
+}
+
+
 /**
  * main routine for receiver process.
  *
@@ -334,6 +343,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                if (i == -1) {
                        if (phase)
                                break;
+
                        phase = 1;
                        csum_length = SUM_LENGTH;
                        if (verbose > 2)
@@ -375,6 +385,18 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
 
                fnamecmp = fname;
 
+               if (server_exclude_list.head
+                   && check_exclude(&server_exclude_list, fname,
+                                    S_ISDIR(file->mode)) < 0) {
+                       if (verbose) {
+                               rprintf(FINFO,
+                                       "skipping server-excluded update for \"%s\"\n",
+                                       fname);
+                       }
+                       discard_receive_data(f_in, file->length);
+                       continue;
+               }
+
                /* open the file */
                fd1 = do_open(fnamecmp, O_RDONLY, 0);
 
@@ -389,7 +411,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
                        rsyserr(FERROR, errno, "fstat %s failed",
                                full_fname(fnamecmp));
-                       receive_data(f_in,NULL,-1,NULL,file->length);
+                       discard_receive_data(f_in, file->length);
                        close(fd1);
                        continue;
                }
@@ -402,7 +424,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                         */
                        rprintf(FERROR,"recv_files: %s is a directory\n",
                                full_fname(fnamecmp));
-                       receive_data(f_in, NULL, -1, NULL, file->length);
+                       discard_receive_data(f_in, file->length);
                        close(fd1);
                        continue;
                }
@@ -435,7 +457,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        if (fd2 == -1) {
                                rsyserr(FERROR, errno, "open %s failed",
                                        full_fname(fnamecmp));
-                               receive_data(f_in,mapbuf,-1,NULL,file->length);
+                               discard_receive_data(f_in, file->length);
                                if (mapbuf)
                                        unmap_file(mapbuf);
                                if (fd1 != -1)
@@ -444,6 +466,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        }
                } else {
                        if (!get_tmpname(fnametmp,fname)) {
+                               discard_receive_data(f_in, file->length);
                                if (mapbuf)
                                        unmap_file(mapbuf);
                                if (fd1 != -1)
@@ -472,7 +495,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name)
                        if (fd2 == -1) {
                                rsyserr(FERROR, errno, "mkstemp %s failed",
                                        full_fname(fnametmp));
-                               receive_data(f_in,mapbuf,-1,NULL,file->length);
+                               discard_receive_data(f_in, file->length);
                                if (mapbuf)
                                        unmap_file(mapbuf);
                                if (fd1 != -1)