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