X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7e5fa372cf2464c1cb5cce2b9c50a3bbf03f4245..e2bc4126691bdbc8ab78e6e56c72bf1d8bc51168:/receiver.c diff --git a/receiver.c b/receiver.c index 847d436a..1fe97335 100644 --- a/receiver.c +++ b/receiver.c @@ -28,6 +28,8 @@ extern int max_delete; extern int csum_length; extern struct stats stats; extern int dry_run; +extern int read_batch; +extern int batch_gen_fd; extern int am_server; extern int relative_paths; extern int keep_dirlinks; @@ -330,6 +332,7 @@ static void discard_receive_data(int f_in, OFF_T length) * Receiver process runs on the same host as the generator process. */ int recv_files(int f_in, struct file_list *flist, char *local_name) { + int next_gen_i = -1; int fd1,fd2; STRUCT_STAT st; char *fname, fbuf[MAXPATHLEN]; @@ -355,6 +358,12 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) i = read_int(f_in); if (i == -1) { + if (read_batch) { + if (next_gen_i != flist->count) + while (read_int(batch_gen_fd) != -1) {} + next_gen_i = -1; + } + if (phase) break; @@ -399,6 +408,20 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) fnamecmp = fname; + if (read_batch) { + while (i > next_gen_i) { + next_gen_i = read_int(batch_gen_fd); + if (next_gen_i == -1) + next_gen_i = flist->count; + } + if (i < next_gen_i) { + rprintf(FINFO, "skipping update for \"%s\"\n", + fname); + discard_receive_data(f_in, file->length); + continue; + } + } + if (server_exclude_list.head && check_exclude(&server_exclude_list, fname, S_ISDIR(file->mode)) < 0) { @@ -529,22 +552,31 @@ int recv_files(int f_in, struct file_list *flist, char *local_name) cleanup_disable(); if (!recv_ok) { - if (csum_length == SUM_LENGTH) { - rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n", - full_fname(fname)); - } else { + int msgtype; + char *redostr; + if (csum_length != SUM_LENGTH) { char buf[4]; - if (verbose > 1) - rprintf(FINFO,"redoing %s(%d)\n",fname,i); SIVAL(buf, 0, i); send_msg(MSG_REDO, buf, 4); + msgtype = read_batch ? FERROR : FINFO; + redostr = read_batch ? " Redo doubtful." + : " Redo pending."; + } else { + msgtype = FERROR; + redostr = ""; + } + if (verbose || read_batch) { + rprintf(msgtype, + "%s: %s failed verification. Update %sed.%s\n", + msgtype == FERROR ? "ERROR" : "WARNING", + fname, keep_partial || inplace ? + "retain" : "discard", redostr); } } } make_backups = save_make_backups; - if (delete_after && recurse && delete_mode && !local_name - && flist->count > 0) + if (delete_after && recurse && !local_name && flist->count > 0) delete_files(flist); if (verbose > 2)