diff options
| author | Wayne Davison <wayned@samba.org> | 2006-10-13 07:38:15 +0000 |
|---|---|---|
| committer | Wayne Davison <wayned@samba.org> | 2006-10-13 07:38:15 +0000 |
| commit | b1b54199efeba50d29a6ba8025ee8c8193d16dda (patch) | |
| tree | f4f2962d875955026a59a2c3075a0a492c17bb84 /cleanup.c | |
| parent | 33394b769d8b95c082cda3d586b743ff53c6afe5 (diff) | |
| download | android_external_rsync-b1b54199efeba50d29a6ba8025ee8c8193d16dda.tar.gz android_external_rsync-b1b54199efeba50d29a6ba8025ee8c8193d16dda.tar.bz2 android_external_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.c | 16 |
1 files changed, 6 insertions, 10 deletions
@@ -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; |
