--- embedaddon/rsync/cleanup.c 2016/11/01 09:54:32 1.1.1.3 +++ embedaddon/rsync/cleanup.c 2021/03/17 00:32:36 1.1.1.4 @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2002 Martin Pool - * Copyright (C) 2003-2015 Wayne Davison + * Copyright (C) 2003-2020 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,7 +26,9 @@ extern int dry_run; extern int am_server; extern int am_daemon; extern int am_receiver; +extern int am_sender; extern int io_error; +extern int use_db; extern int keep_partial; extern int got_xfer_error; extern int protocol_version; @@ -34,6 +36,7 @@ extern int output_needs_newline; extern char *partial_dir; extern char *logfile_name; +int called_from_signal_handler = 0; BOOL shutting_down = False; BOOL flush_ok_after_signal = False; @@ -135,13 +138,18 @@ NORETURN void _exit_cleanup(int code, const char *file if (DEBUG_GTE(EXIT, 2)) { rprintf(FINFO, "[%s] _exit_cleanup(code=%d, file=%s, line=%d): entered\n", - who_am_i(), code, file, line); + who_am_i(), code, src_file(file), line); } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; + if (use_db) + db_disconnect(False); + + /* FALLTHROUGH */ +#include "case_N.h" + if (cleanup_child_pid != -1) { int status; int pid = wait_process(cleanup_child_pid, &status, WNOHANG); @@ -152,7 +160,6 @@ NORETURN void _exit_cleanup(int code, const char *file } } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; @@ -172,18 +179,17 @@ NORETURN void _exit_cleanup(int code, const char *file const char *fname = cleanup_fname; cleanup_fname = NULL; if (!partial_dir) { - /* We don't want to leave a partial file with a modern time or it - * could be skipped via --update. Setting the time to something - * really old also helps it to stand out as unfinished in an ls. */ - tweak_modtime = 1; - cleanup_file->modtime = 0; + /* We don't want to leave a partial file with a modern time or it + * could be skipped via --update. Setting the time to something + * really old also helps it to stand out as unfinished in an ls. */ + tweak_modtime = 1; + cleanup_file->modtime = 0; } finish_transfer(cleanup_new_fname, fname, NULL, NULL, cleanup_file, tweak_modtime, !partial_dir); } } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; @@ -195,7 +201,6 @@ NORETURN void _exit_cleanup(int code, const char *file if (!exit_code && !code) io_flush(FULL_FLUSH); - /* FALLTHROUGH */ #include "case_N.h" switch_step++; @@ -223,10 +228,10 @@ NORETURN void _exit_cleanup(int code, const char *file /* If line < 0, this exit is after a MSG_ERROR_EXIT event, so * we don't want to output a duplicate error. */ if ((exit_code && line > 0) - || am_daemon || (logfile_name && (am_server || !INFO_GTE(STATS, 1)))) + || am_daemon || (logfile_name && (am_server || !INFO_GTE(STATS, 1)))) { log_exit(exit_code, exit_file, exit_line); + } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; @@ -238,23 +243,27 @@ NORETURN void _exit_cleanup(int code, const char *file dry_run ? " (DRY RUN)" : ""); } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; if (exit_code && exit_code != RERR_SOCKETIO && exit_code != RERR_STREAMIO && exit_code != RERR_SIGNAL1 - && exit_code != RERR_TIMEOUT && !shutting_down && (protocol_version >= 31 || am_receiver)) { - if (line > 0) { - if (DEBUG_GTE(EXIT, 3)) { - rprintf(FINFO, "[%s] sending MSG_ERROR_EXIT with exit_code %d\n", - who_am_i(), exit_code); + && exit_code != RERR_TIMEOUT && !shutting_down) { + if (protocol_version >= 31 || am_receiver) { + if (line > 0) { + if (DEBUG_GTE(EXIT, 3)) { + rprintf(FINFO, "[%s] sending MSG_ERROR_EXIT with exit_code %d\n", + who_am_i(), exit_code); + } + send_msg_int(MSG_ERROR_EXIT, exit_code); } - send_msg_int(MSG_ERROR_EXIT, exit_code); + if (!am_sender) + io_flush(MSG_FLUSH); /* Be sure to send all messages */ + noop_io_until_death(); } - noop_io_until_death(); + else if (!am_sender) + io_flush(MSG_FLUSH); /* Be sure to send all messages */ } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; @@ -267,6 +276,8 @@ NORETURN void _exit_cleanup(int code, const char *file break; } + if (called_from_signal_handler) + _exit(exit_code); exit(exit_code); }