summaryrefslogtreecommitdiff
path: root/src/pacman
diff options
context:
space:
mode:
Diffstat (limited to 'src/pacman')
-rw-r--r--src/pacman/pacman.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index f46b71c1..c2b61fcd 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -752,6 +752,7 @@ static int parseconfig(const char *file)
int main(int argc, char *argv[])
{
int ret = 0;
+ struct sigaction new_action, old_action;
#if defined(HAVE_GETEUID)
/* geteuid undefined in CYGWIN */
uid_t myuid = geteuid();
@@ -762,10 +763,24 @@ int main(int argc, char *argv[])
mtrace();
#endif
- /* set signal handlers */
- signal(SIGINT, handler);
- signal(SIGTERM, handler);
- signal(SIGSEGV, handler);
+ /* Set signal handlers */
+ /* Set up the structure to specify the new action. */
+ new_action.sa_handler = handler;
+ sigemptyset(&new_action.sa_mask);
+ new_action.sa_flags = 0;
+
+ sigaction(SIGINT, NULL, &old_action);
+ if(old_action.sa_handler != SIG_IGN) {
+ sigaction(SIGINT, &new_action, NULL);
+ }
+ sigaction(SIGTERM, NULL, &old_action);
+ if(old_action.sa_handler != SIG_IGN) {
+ sigaction(SIGTERM, &new_action, NULL);
+ }
+ sigaction(SIGSEGV, NULL, &old_action);
+ if(old_action.sa_handler != SIG_IGN) {
+ sigaction(SIGSEGV, &new_action, NULL);
+ }
/* i18n init */
#if defined(ENABLE_NLS)