X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/1cfcb8af1164de16318e7d84320579a3010fa4d4..b1b54199efeba50d29a6ba8025ee8c8193d16dda:/cleanup.c diff --git a/cleanup.c b/cleanup.c index d6388689..f1ee321d 100644 --- a/cleanup.c +++ b/cleanup.c @@ -87,25 +87,22 @@ static pid_t cleanup_pid = 0; pid_t cleanup_child_pid = -1; +int in_exit_cleanup = 0; + /** * Eventually calls exit(), passing @p code, therefore does not return. * * @param code one of the RERR_* codes from errcode.h. **/ -void _exit_cleanup(int code, const char *file, int line) +NORETURN void _exit_cleanup(int code, const char *file, int line) { int ocode = code; - static int inside_cleanup = 0; - - if (inside_cleanup > 10) { - /* prevent the occasional infinite recursion */ - return; - } - inside_cleanup++; SIGACTION(SIGUSR1, SIG_IGN); SIGACTION(SIGUSR2, SIG_IGN); + in_exit_cleanup = 1; + if (verbose > 3) { rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): entered\n", code, file, line); @@ -113,15 +110,14 @@ void _exit_cleanup(int code, const char *file, int line) if (cleanup_child_pid != -1) { int status; - if (wait_process(cleanup_child_pid, &status, WNOHANG) - == cleanup_child_pid) { + if (wait_process(cleanup_child_pid, &status, WNOHANG) == cleanup_child_pid) { status = WEXITSTATUS(status); if (status > code) code = status; } } - if (cleanup_got_literal && cleanup_fname && keep_partial + if (cleanup_got_literal && cleanup_new_fname && keep_partial && handle_partial_dir(cleanup_new_fname, PDIR_CREATE)) { char *fname = cleanup_fname; cleanup_fname = NULL; @@ -168,7 +164,7 @@ void _exit_cleanup(int code, const char *file, int line) void cleanup_disable(void) { - cleanup_fname = NULL; + cleanup_fname = cleanup_new_fname = NULL; cleanup_got_literal = 0; } @@ -176,8 +172,8 @@ void cleanup_disable(void) void cleanup_set(char *fnametmp, char *fname, struct file_struct *file, int fd_r, int fd_w) { - cleanup_fname = fname ? fnametmp : NULL; - cleanup_new_fname = fname; + cleanup_fname = fnametmp; + cleanup_new_fname = fname; /* can be NULL on a partial-dir failure */ cleanup_file = file; cleanup_fd_r = fd_r; cleanup_fd_w = fd_w;