summaryrefslogtreecommitdiff
path: root/cleanup.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2006-10-13 07:38:15 +0000
committerWayne Davison <wayned@samba.org>2006-10-13 07:38:15 +0000
commitb1b54199efeba50d29a6ba8025ee8c8193d16dda (patch)
treef4f2962d875955026a59a2c3075a0a492c17bb84 /cleanup.c
parent33394b769d8b95c082cda3d586b743ff53c6afe5 (diff)
downloadrsync-b1b54199efeba50d29a6ba8025ee8c8193d16dda.tar.gz
rsync-b1b54199efeba50d29a6ba8025ee8c8193d16dda.tar.bz2
rsync-b1b54199efeba50d29a6ba8025ee8c8193d16dda.zip
- When exiting, set the flag "in_exit_cleanup".
- Mark _exit_cleanup() with NORETURN. - Don't ever return from _exit_cleanup().
Diffstat (limited to 'cleanup.c')
-rw-r--r--cleanup.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/cleanup.c b/cleanup.c
index 9cf7be0f..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,8 +110,7 @@ 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;