summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChantry Xavier <shiningxc@gmail.com>2008-03-09 13:12:32 +0100
committerDan McGee <dan@archlinux.org>2008-03-09 11:35:01 -0500
commit51e0303e840c94e5943f30e311d053058f657327 (patch)
treeda34e844c3d7f8b48d2a580130cb2f334a7a046a
parent2f9f48edddadffa2ac39ed7291f92be7be3b0fb5 (diff)
downloadpacman-51e0303e840c94e5943f30e311d053058f657327.tar.xz
Use sigaction instead of signal.
From signal man page : "The behavior of signal() varies across Unix versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. See Portability below." The code was taken from there : http://www.gnu.org/software/libtool/manual/libc/Sigaction-Function-Example.html Signed-off-by: Chantry Xavier <shiningxc@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
-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)