[pacman-dev] [PATCH] Use sigaction instead of signal.

Chantry Xavier shiningxc at gmail.com
Sun Mar 9 08:15:11 EDT 2008


>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 at gmail.com>
---
 src/pacman/pacman.c |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index f46b71c..9c56eae 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -212,7 +212,7 @@ static void cleanup(int ret) {
  * in a consistant state.
  * @param signum the thrown signal
  */
-static void handler(int signum)
+static void termination_handler(int signum)
 {
 	if(signum==SIGSEGV)
 	{
@@ -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 = termination_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)
-- 
1.5.4.2





More information about the pacman-dev mailing list