summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xChangeLog3
-rwxr-xr-xsrc/calcurse.c14
-rwxr-xr-xsrc/sigs.c55
-rwxr-xr-xsrc/sigs.h7
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 <frederic@culot.org>
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 <stdlib.h>
-#include <signal.h>
#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 <sys/types.h>
#include <sys/wait.h>
-#include <signal.h>
+#include <errno.h>
+#include <string.h>
#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 <signal.h>
+
+void sigs_init (void);
+unsigned sigs_set_hdlr (int, void (*)(int));
#endif /* CALCURSE_SIGS_H */