diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2007-07-21 15:05:19 +0300 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2007-07-21 15:05:19 +0300 |
commit | 0ef67980e8a428985886482f33ebf8cdce979f7b (patch) | |
tree | c0a29353c10f03e366d5d422d1983c498b403f86 /rpmdb | |
parent | 6fdd71bbeef3d1c1b731b9fbbbfad792715c3a1f (diff) | |
download | rpm-0ef67980e8a428985886482f33ebf8cdce979f7b.tar.gz rpm-0ef67980e8a428985886482f33ebf8cdce979f7b.tar.bz2 rpm-0ef67980e8a428985886482f33ebf8cdce979f7b.zip |
Make rpmdbCheckTerminate() non-terminating.
This allows use in exit handler without affecting exit code, and permits
caller to do its own cleanup if necessary.
Diffstat (limited to 'rpmdb')
-rw-r--r-- | rpmdb/rpmdb.c | 18 | ||||
-rw-r--r-- | rpmdb/rpmdb.h | 10 |
2 files changed, 16 insertions, 12 deletions
diff --git a/rpmdb/rpmdb.c b/rpmdb/rpmdb.c index fde554925..1b3e3d6bf 100644 --- a/rpmdb/rpmdb.c +++ b/rpmdb/rpmdb.c @@ -707,7 +707,7 @@ int rpmdbCheckTerminate(int terminate) sigset_t newMask, oldMask; static int terminating = 0; - if (terminating) return 0; + if (terminating) return 1; (void) sigfillset(&newMask); /* block all signals */ (void) sigprocmask(SIG_BLOCK, &newMask, &oldMask); @@ -724,10 +724,6 @@ int rpmdbCheckTerminate(int terminate) rpmdb db; rpmdbMatchIterator mi; -/*@-abstract@*/ /* sigset_t is abstract type */ - rpmMessage(RPMMESS_DEBUG, "Exiting on signal(0x%lx) ...\n", *((unsigned long *)&rpmsqCaught)); -/*@=abstract@*/ - /*@-branchstate@*/ while ((mi = rpmmiRock) != NULL) { /*@i@*/ rpmmiRock = mi->mi_next; @@ -743,14 +739,20 @@ int rpmdbCheckTerminate(int terminate) (void) rpmdbClose(db); } /*@=newreftrans@*/ - exit(EXIT_FAILURE); } - return sigprocmask(SIG_SETMASK, &oldMask, NULL); + sigprocmask(SIG_SETMASK, &oldMask, NULL); + return terminating; } int rpmdbCheckSignals(void) { - return rpmdbCheckTerminate(0); + if (rpmdbCheckTerminate(0)) { +/*@-abstract@*/ /* sigset_t is abstract type */ + rpmMessage(RPMMESS_DEBUG, "Exiting on signal(0x%lx) ...\n", *((unsigned long *)&rpmsqCaught)); + exit(EXIT_FAILURE); +/*@=abstract@*/ + } + return 0; } /** diff --git a/rpmdb/rpmdb.h b/rpmdb/rpmdb.h index 5fcf74436..ad428dfea 100644 --- a/rpmdb/rpmdb.h +++ b/rpmdb/rpmdb.h @@ -1039,8 +1039,7 @@ Header rpmdbNextIterator(/*@null@*/ rpmdbMatchIterator mi) /*@modifies mi, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmdb - * Check rpmdb signal handler for trapped signal exit. Just a compatibility - * wrapper for rpmdbCheckTerminate() + * Check for and exit on termination signals. */ /*@mayexit@*/ int rpmdbCheckSignals(void) @@ -1048,10 +1047,13 @@ int rpmdbCheckSignals(void) /*@modifies fileSystem, internalState @*/; /** \ingroup rpmdb - * Check rpmdb signal handler for trapped signal or requested exit. + * Check rpmdb signal handler for trapped signal and/or requested exit, + * clean up any open iterators and databases on termination condition. + * On non-zero exit any open references to rpmdb are invalid and cannot + * be accessed anymore, calling process should terminate immediately. * @param terminate 0 to only check for signals, 1 to terminate anyway + * @return 0 to continue, 1 if termination cleanup was done. */ -/*@mayexit@*/ int rpmdbCheckTerminate(int terminate); /** \ingroup rpmdb |