--- embedaddon/rsync/cleanup.c 2013/10/14 07:51:14 1.1.1.2 +++ 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-2013 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 @@ -22,10 +22,13 @@ #include "rsync.h" +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; @@ -33,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; @@ -134,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); @@ -151,13 +160,10 @@ NORETURN void _exit_cleanup(int code, const char *file } } - /* FALLTHROUGH */ #include "case_N.h" switch_step++; if (cleanup_got_literal && (cleanup_fname || cleanup_fd_w != -1)) { - const char *fname = cleanup_fname; - cleanup_fname = NULL; if (cleanup_fd_r != -1) { close(cleanup_fd_r); cleanup_fd_r = -1; @@ -167,22 +173,23 @@ NORETURN void _exit_cleanup(int code, const char *file close(cleanup_fd_w); cleanup_fd_w = -1; } - if (fname && cleanup_new_fname && keep_partial + if (cleanup_fname && cleanup_new_fname && keep_partial && handle_partial_dir(cleanup_new_fname, PDIR_CREATE)) { int tweak_modtime = 0; + 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++; @@ -194,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++; @@ -222,37 +228,42 @@ 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++; if (DEBUG_GTE(EXIT, 1)) { rprintf(FINFO, "[%s] _exit_cleanup(code=%d, file=%s, line=%d): " - "about to call exit(%d)\n", - who_am_i(), first_code, exit_file, exit_line, exit_code); + "about to call exit(%d)%s\n", + who_am_i(), first_code, exit_file, exit_line, exit_code, + 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++; @@ -265,6 +276,8 @@ NORETURN void _exit_cleanup(int code, const char *file break; } + if (called_from_signal_handler) + _exit(exit_code); exit(exit_code); }