|
|
| 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); |
| } | } |