aboutsummaryrefslogtreecommitdiffstats
path: root/lib/readline/signals.c
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2009-02-19 22:21:29 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:47:02 +0000
commit17345e5ad288f7543b77b23a25aa380eacc279f2 (patch)
tree8ac954624147c08ebe1f72f38e0fa5e0416ce87d /lib/readline/signals.c
parent3185942a5234e26ab13fa02f9c51d340cec514f8 (diff)
downloadandroid_external_bash-17345e5ad288f7543b77b23a25aa380eacc279f2.tar.gz
android_external_bash-17345e5ad288f7543b77b23a25aa380eacc279f2.tar.bz2
android_external_bash-17345e5ad288f7543b77b23a25aa380eacc279f2.zip
Imported from ../bash-4.0.tar.gz.
Diffstat (limited to 'lib/readline/signals.c')
-rw-r--r--lib/readline/signals.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/readline/signals.c b/lib/readline/signals.c
index 48dd885..325ae8c 100644
--- a/lib/readline/signals.c
+++ b/lib/readline/signals.c
@@ -81,6 +81,9 @@ typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt
static SigHandler *rl_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *));
static void rl_maybe_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *));
+static RETSIGTYPE rl_signal_handler PARAMS((int));
+static RETSIGTYPE _rl_handle_signal PARAMS((int));
+
/* Exported variables for use by applications. */
/* If non-zero, readline will install its own signal handlers for
@@ -95,6 +98,9 @@ int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */
#endif
/* Private variables. */
+int _rl_interrupt_immediately = 0;
+int volatile _rl_caught_signal = 0; /* should be sig_atomic_t, but that requires including <signal.h> everywhere */
+
/* If non-zero, print characters corresponding to received signals. */
int _rl_echoctl = 0;
@@ -121,10 +127,34 @@ static sighandler_cxt old_winch;
/* Readline signal handler functions. */
+/* Called from RL_CHECK_SIGNALS() macro */
+RETSIGTYPE
+_rl_signal_handler (sig)
+{
+ _rl_caught_signal = 0; /* XXX */
+
+ _rl_handle_signal (sig);
+ SIGHANDLER_RETURN;
+}
+
static RETSIGTYPE
rl_signal_handler (sig)
int sig;
{
+ if (_rl_interrupt_immediately)
+ {
+ _rl_interrupt_immediately = 0;
+ _rl_handle_signal (sig);
+ }
+
+ _rl_caught_signal = sig;
+ SIGHANDLER_RETURN;
+}
+
+static RETSIGTYPE
+_rl_handle_signal (sig)
+ int sig;
+{
#if defined (HAVE_POSIX_SIGNALS)
sigset_t set;
#else /* !HAVE_POSIX_SIGNALS */