diff --git a/scsh/scsh-interfaces.scm b/scsh/scsh-interfaces.scm index e185a4f..590fe97 100644 --- a/scsh/scsh-interfaces.scm +++ b/scsh/scsh-interfaces.scm @@ -437,9 +437,9 @@ (define-interface scsh-signals-interface (export signal-process signal-process-group - ;; JMG: this syscalls doesn't cooperate with the thread-system + ;; JMG: this syscall doesn't cooperate with the thread-system ;; pause-until-interrupt - itimer ;; now defined in low-interrupt as a artificial interrupt + itimer ;; now defined in low-interrupt as an artificial interrupt )) @@ -1061,6 +1061,9 @@ set-interrupt-handler interrupt-handler + ignore-signal + handle-signal-default + ;; reexported from low-interrupt interrupt/alrm interrupt/alarm interrupt/int interrupt/keyboard diff --git a/scsh/sighandlers.scm b/scsh/sighandlers.scm index 4b52c21..87922f7 100644 --- a/scsh/sighandlers.scm +++ b/scsh/sighandlers.scm @@ -204,6 +204,12 @@ (call-interrupt-handler interrupt) (make-interrupt-pending interrupt)) (lp event)))) + +;;; Dealing with synchronous signals + +(import-lambda-definition ignore-signal (sig) "ignore_signal") + +(import-lambda-definition handle-signal-default (sig) "handle_signal_default") ;;; I am ashamed to say the 33 below is completely bogus. ;;; What we want is a value that is 1 + max interrupt value. diff --git a/scsh/sighandlers1.c b/scsh/sighandlers1.c index b51ebb3..fe7ce11 100644 --- a/scsh/sighandlers1.c +++ b/scsh/sighandlers1.c @@ -68,10 +68,30 @@ s48_value do_default_sigaction(s48_value _signal) return S48_UNSPECIFIC; } +s48_value ignore_signal(s48_value _signal) +{ + sig_t res = signal(s48_extract_fixnum(_signal), SIG_IGN); + if (res == SIG_ERR) + s48_raise_os_error_1(errno, _signal); + return S48_UNSPECIFIC; +} + +s48_value handle_signal_default(s48_value _signal) +{ + sig_t res = signal(s48_extract_fixnum(_signal), SIG_DFL); + if (res == SIG_ERR) + s48_raise_os_error_1(errno, _signal); + return S48_UNSPECIFIC; +} + + s48_value s48_init_sighandlers(void) { S48_EXPORT_FUNCTION(sig2interrupt); S48_EXPORT_FUNCTION(do_default_sigaction); + S48_EXPORT_FUNCTION(ignore_signal); + S48_EXPORT_FUNCTION(handle_signal_default); return S48_UNSPECIFIC; } +