X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a3221d2ac14255c31109a617c4d62b949cd910de..6e45e1dd865180c6cb82f977698287daec6bffc6:/receiver.c diff --git a/receiver.c b/receiver.c index 2eca4f6f..6f2e2f56 100644 --- a/receiver.c +++ b/receiver.c @@ -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)