From d2c766a1377dc9d8d01bfbc35c7e7843627e3a44 Mon Sep 17 00:00:00 2001 From: Frederic Culot Date: Sun, 19 Jul 2009 16:51:35 +0000 Subject: New way of handling signals. --- ChangeLog | 3 +++ src/calcurse.c | 14 ++++++-------- src/sigs.c | 55 +++++++++++++++++++++++++++---------------------------- src/sigs.h | 7 +++++-- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 11447e3..515681e 100755 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,9 @@ * src/event.c * src/io.c * src/recur.c: make use of erase_note() whenever possible + + * src/calcurse.c + * src/sigs.[ch]: new way of handling signals 2009-07-15 Frederic Culot diff --git a/src/calcurse.c b/src/calcurse.c index 8673c48..0352e5d 100755 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -1,4 +1,4 @@ -/* $calcurse: calcurse.c,v 1.83 2009/07/12 20:37:41 culot Exp $ */ +/* $calcurse: calcurse.c,v 1.84 2009/07/19 16:51:36 culot Exp $ */ /* * Calcurse - text-based organizer @@ -37,7 +37,6 @@ */ #include -#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -73,7 +72,6 @@ main (int argc, char **argv) int sav_hilt_app = 0; int sav_hilt_tod = 0; int cut_item = 0; - struct sigaction sigact; unsigned do_storage = 0; unsigned do_update = 1; unsigned day_changed = 0; @@ -107,11 +105,11 @@ main (int argc, char **argv) } /* Begin of interactive mode with ncurses interface. */ - sigs_init (&sigact); /* signal handling init */ - initscr (); /* start the curses mode */ - cbreak (); /* control chars generate a signal */ - noecho (); /* controls echoing of typed chars */ - curs_set (0); /* make cursor invisible */ + sigs_init (); /* signal handling init */ + initscr (); /* start the curses mode */ + cbreak (); /* control chars generate a signal */ + noecho (); /* controls echoing of typed chars */ + curs_set (0); /* make cursor invisible */ calendar_set_current_date (); notify_init_vars (); wins_get_config (); diff --git a/src/sigs.c b/src/sigs.c index 8eaeb2a..6f341e7 100755 --- a/src/sigs.c +++ b/src/sigs.c @@ -1,4 +1,4 @@ -/* $calcurse: sigs.c,v 1.8 2009/07/05 20:33:23 culot Exp $ */ +/* $calcurse: sigs.c,v 1.9 2009/07/19 16:51:36 culot Exp $ */ /* * Calcurse - text-based organizer @@ -38,10 +38,12 @@ #include #include -#include +#include +#include #include "i18n.h" #include "utils.h" +#include "sigs.h" /* * General signal handling routine. @@ -50,7 +52,7 @@ * Also catch CTRL-C (SIGINT), and SIGWINCH to resize screen automatically. */ static void -signal_handler (int sig) +generic_hdlr (int sig) { switch (sig) { @@ -65,34 +67,31 @@ signal_handler (int sig) } } -/* Signal handling init. */ -void -sigs_init (struct sigaction *sa) +unsigned +sigs_set_hdlr (int sig, void (*handler)(int)) { - sa->sa_handler = signal_handler; - sa->sa_flags = 0; - sigemptyset (&sa->sa_mask); - if (sigaction (SIGCHLD, sa, NULL) != 0) - { - ERROR_MSG (_("Error handling SIGCHLD signal")); - exit_calcurse (1); - } + struct sigaction sa; - sa->sa_handler = signal_handler; - sa->sa_flags = 0; - sigemptyset (&sa->sa_mask); - if (sigaction (SIGWINCH, sa, NULL) != 0) + memset (&sa, 0, sizeof sa); + sigemptyset (&sa.sa_mask); + sa.sa_handler = handler; + sa.sa_flags = 0; + if (sigaction (sig, &sa, (struct sigaction *)0) == -1) { - ERROR_MSG (_("Error handling SIGWINCH signal")); - exit_calcurse (1); + ERROR_MSG (_("Error setting signal #%d : %s\n"), + sig, strerror (errno)); + return 0; } - sa->sa_handler = SIG_IGN; - sa->sa_flags = 0; - sigemptyset (&(sa->sa_mask)); - if (sigaction (SIGINT, sa, NULL) != 0) - { - ERROR_MSG (_("Error handling SIGINT signal")); - exit_calcurse (1); - } + return 1; +} + +/* Signal handling init. */ +void +sigs_init () +{ + if (!sigs_set_hdlr (SIGCHLD, generic_hdlr) + || !sigs_set_hdlr (SIGWINCH, generic_hdlr) + || !sigs_set_hdlr (SIGINT, SIG_IGN)) + exit_calcurse (1); } diff --git a/src/sigs.h b/src/sigs.h index cff612a..5f1a6d2 100755 --- a/src/sigs.h +++ b/src/sigs.h @@ -1,4 +1,4 @@ -/* $calcurse: sigs.h,v 1.4 2009/07/05 20:33:23 culot Exp $ */ +/* $calcurse: sigs.h,v 1.5 2009/07/19 16:51:36 culot Exp $ */ /* * Calcurse - text-based organizer @@ -39,6 +39,9 @@ #ifndef CALCURSE_SIGS_H #define CALCURSE_SIGS_H -void sigs_init (struct sigaction *); +#include + +void sigs_init (void); +unsigned sigs_set_hdlr (int, void (*)(int)); #endif /* CALCURSE_SIGS_H */ -- cgit v1.2.3-70-g09d2