summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChantry Xavier <shiningxc@gmail.com>2008-03-09 12:56:00 +0100
committerDan McGee <dan@archlinux.org>2008-03-09 11:30:59 -0500
commit2f9f48edddadffa2ac39ed7291f92be7be3b0fb5 (patch)
treee8853dae93f3253ebd7301283a4594de2952035a
parent1dfcf1495ba4c0ac36d770ef892483459e5678c4 (diff)
downloadpacman-2f9f48edddadffa2ac39ed7291f92be7be3b0fb5.tar.xz
src/pacman/pacman.c : split cleanup function.
This function was used in two different ways : - as a signal handler : the argument was the signal number - called manually for freeing the resources : the argument was the return value So the first part is now handler(int), and the second cleanup(int). Ref: http://www.archlinux.org/pipermail/pacman-dev/2008-March/011388.html Remaining problems : - the return values are messy. for example, 2 can mean both that it was interrupted (SIGINT == 2), or that --help or -V was used (returned by parseargs). - apparently signal is not portable and sigaction should be used instead Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
-rw-r--r--src/pacman/pacman.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index d6997689..f46b71c1 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -188,11 +188,31 @@ static void setuseragent(void)
setenv("HTTP_USER_AGENT", agent, 0);
}
+/** Free the resources.
+ *
+ * @param ret the return value
+ */
+static void cleanup(int ret) {
+ /* free alpm library resources */
+ if(alpm_release() == -1) {
+ pm_printf(PM_LOG_ERROR, alpm_strerrorlast());
+ }
+
+ /* free memory */
+ FREELIST(pm_targets);
+ if(config) {
+ config_free(config);
+ config = NULL;
+ }
+
+ exit(ret);
+}
+
/** Catches thrown signals. Performs necessary cleanup to ensure database is
* in a consistant state.
* @param signum the thrown signal
*/
-static void cleanup(int signum)
+static void handler(int signum)
{
if(signum==SIGSEGV)
{
@@ -211,20 +231,7 @@ static void cleanup(int signum)
/* output a newline to be sure we clear any line we may be on */
printf("\n");
}
-
- /* free alpm library resources */
- if(alpm_release() == -1) {
- pm_printf(PM_LOG_ERROR, alpm_strerrorlast());
- }
-
- /* free memory */
- FREELIST(pm_targets);
- if(config) {
- config_free(config);
- config = NULL;
- }
-
- exit(signum);
+ cleanup(signum);
}
/** Sets all libalpm required paths in one go. Called after the command line
@@ -756,9 +763,9 @@ int main(int argc, char *argv[])
#endif
/* set signal handlers */
- signal(SIGINT, cleanup);
- signal(SIGTERM, cleanup);
- signal(SIGSEGV, cleanup);
+ signal(SIGINT, handler);
+ signal(SIGTERM, handler);
+ signal(SIGSEGV, handler);
/* i18n init */
#if defined(ENABLE_NLS)