summaryrefslogtreecommitdiffstats
path: root/byterun/signals.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1998-08-08 16:52:33 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1998-08-08 16:52:33 +0000
commitc6b82c5c30ba710e5bf55729f09f12a9356ddcd6 (patch)
treec022d95cf48398fe52559d8c4f078c778a30ec26 /byterun/signals.c
parent63be4e8d2bdb08ebfd3ac504b2bb30d02dd8cd18 (diff)
Sys.signal renvoie l'ancien handler
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@2039 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/signals.c')
-rw-r--r--byterun/signals.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/byterun/signals.c b/byterun/signals.c
index df01d68cb..67bb7d4bd 100644
--- a/byterun/signals.c
+++ b/byterun/signals.c
@@ -21,6 +21,7 @@
#include "mlvalues.h"
#include "roots.h"
#include "signals.h"
+#include "sys.h"
volatile int async_signal_mode = 0;
volatile int pending_signal = 0;
@@ -160,10 +161,11 @@ int posix_signals[] = {
value install_signal_handler(value signal_number, value action) /* ML */
{
int sig;
- void (*act)(int signo);
+ void (*act)(int signo), (*oldact)(int signo);
#ifdef POSIX_SIGNALS
- struct sigaction sigact;
+ struct sigaction sigact, oldsigact;
#endif
+ value res;
sig = Int_val(signal_number);
if (sig < 0) sig = posix_signals[-sig-1];
@@ -193,9 +195,19 @@ value install_signal_handler(value signal_number, value action) /* ML */
sigact.sa_handler = act;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
- sigaction(sig, &sigact, NULL);
+ if (sigaction(sig, &sigact, &oldsigact) == -1) sys_error(NO_ARG);
+ oldact = oldsigact.sa_handler;
#else
- signal(sig, act);
+ oldact = signal(sig, act);
+ if (oldact == SIG_ERR) sys_error(NO_ARG);
#endif
- return Val_unit;
+ if (oldact == handle_signal) {
+ res = alloc(1, 0); /* Signal_handle */
+ Field(res, 0) = Field(signal_handlers, sig);
+ }
+ else if (oldact == SIG_IGN)
+ res = Val_int(1); /* Signal_ignore */
+ else
+ res = Val_int(0); /* Signal_default */
+ return res;
}