X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e777afad6fc15021692b4a8fa8f527d77400de7e..1a8e5c97eb05be1cc86f332bf307ccbc1b264ab4:/main.c diff --git a/main.c b/main.c index 109577ee..d3e2b797 100644 --- a/main.c +++ b/main.c @@ -35,7 +35,7 @@ extern int blocking_io; extern int remove_sent_files; extern int daemon_over_rsh; extern int need_messages_from_generator; -extern int kludge_around_eof; +extern int kluge_around_eof; extern int do_stats; extern int log_got_error; extern int module_id; @@ -429,19 +429,25 @@ static char *get_local_name(struct file_list *flist,char *name) } +/* This is only called by the sender. */ static void read_final_goodbye(int f_in, int f_out, int flist_count) { - if (protocol_version < 29) { - read_int(f_in); - return; + int i; + + if (protocol_version < 29) + i = read_int(f_in); + else { + while ((i = read_int(f_in)) == flist_count + && read_shortint(f_in) == ITEM_IS_NEW) { + /* Forward the keep-alive (no-op) to the receiver. */ + write_int(f_out, flist_count); + write_shortint(f_out, ITEM_IS_NEW); + } } - /* Handle any keep-alive messages from --delete-after processing. */ - while (read_int(f_in) == flist_count) { - if (read_shortint(f_in) != ITEM_IS_NEW) - return; /* Complain? */ - write_int(f_out, flist_count); - write_shortint(f_out, ITEM_IS_NEW); + if (i != -1) { + rprintf(FERROR, "Invalid packet from generator at end of run.\n"); + exit_cleanup(RERR_PROTOCOL); } } @@ -560,17 +566,22 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) send_msg(MSG_DONE, "", 0); io_flush(FULL_FLUSH); - /* Finally, we hang around until our parent kills us with a - * USR2 signal. If --delete-after was specified, we might get - * a keep-alive message over the socket, so handle that too. */ + /* Handle any keep-alive packets from the post-processing work + * that the generator does. */ if (protocol_version >= 29) { - kludge_around_eof = 1; - while (read_int(f_in) == flist->count) { - if (read_shortint(f_in) != ITEM_IS_NEW) - break; /* Complain? */ - } + kluge_around_eof = -1; + + /* This should only get stopped via a USR2 signal. */ + while (read_int(f_in) == flist->count + && read_shortint(f_in) == ITEM_IS_NEW) {} + + rprintf(FERROR, "Invalid packet from server at end of run.\n"); + exit_cleanup(RERR_PROTOCOL); } + /* Finally, we hang around waiting for our parent to kills + * us with a USR2 signal. We sleep for a short time, as on + * some OSes a signal won't interrupt a sleep! */ while (1) msleep(20); } @@ -1044,6 +1055,7 @@ static RETSIGTYPE sigusr1_handler(UNUSED(int val)) static RETSIGTYPE sigusr2_handler(UNUSED(int val)) { + close_all(); if (log_got_error) _exit(RERR_PARTIAL); _exit(0); }