[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