summaryrefslogtreecommitdiff
path: root/rpmdb
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2007-07-21 15:05:19 +0300
committerPanu Matilainen <pmatilai@redhat.com>2007-07-21 15:05:19 +0300
commit0ef67980e8a428985886482f33ebf8cdce979f7b (patch)
treec0a29353c10f03e366d5d422d1983c498b403f86 /rpmdb
parent6fdd71bbeef3d1c1b731b9fbbbfad792715c3a1f (diff)
downloadrpm-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.c18
-rw-r--r--rpmdb/rpmdb.h10
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