diff options
author | Chantry Xavier <shiningxc@gmail.com> | 2008-03-09 12:56:00 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2008-03-09 11:30:59 -0500 |
commit | 2f9f48edddadffa2ac39ed7291f92be7be3b0fb5 (patch) | |
tree | e8853dae93f3253ebd7301283a4594de2952035a | |
parent | 1dfcf1495ba4c0ac36d770ef892483459e5678c4 (diff) | |
download | pacman-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.c | 43 |
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) |