diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1998-08-08 16:52:33 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1998-08-08 16:52:33 +0000 |
commit | c6b82c5c30ba710e5bf55729f09f12a9356ddcd6 (patch) | |
tree | c022d95cf48398fe52559d8c4f078c778a30ec26 /byterun/signals.c | |
parent | 63be4e8d2bdb08ebfd3ac504b2bb30d02dd8cd18 (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.c | 22 |
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; } |