From 4d528bbc24999261d939b7bfe7446d67c4cf79b3 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 29 Apr 1988 14:38:36 +0000 Subject: [PATCH] Added some unix signal handling --- lang/m2/libm2/LIST | 2 + lang/m2/libm2/Streams.mod | 8 ++-- lang/m2/libm2/Traps.def | 1 + lang/m2/libm2/Traps.mod | 12 +++--- lang/m2/libm2/Unix.def | 2 + lang/m2/libm2/catch.c | 15 ++++++++ lang/m2/libm2/head_m2.e | 3 ++ lang/m2/libm2/init.c | 27 +++++++++++++ lang/m2/libm2/sigtrp.c | 79 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 lang/m2/libm2/init.c create mode 100644 lang/m2/libm2/sigtrp.c diff --git a/lang/m2/libm2/LIST b/lang/m2/libm2/LIST index 6ab729416..a42e099bc 100644 --- a/lang/m2/libm2/LIST +++ b/lang/m2/libm2/LIST @@ -27,6 +27,8 @@ absi.c absl.c halt.c transfer.e +init.c +sigtrp.c store.c confarray.c load.c diff --git a/lang/m2/libm2/Streams.mod b/lang/m2/libm2/Streams.mod index 01d938e21..f4aca2284 100644 --- a/lang/m2/libm2/Streams.mod +++ b/lang/m2/libm2/Streams.mod @@ -135,6 +135,7 @@ IMPLEMENTATION MODULE Streams; END SetStreamBuffering; PROCEDURE FlushStream(stream: Stream; VAR result: StreamResult); + VAR cnt1: INTEGER; BEGIN result := succeeded; IF (stream = NIL) OR (stream^.kind = none) THEN @@ -146,10 +147,11 @@ IMPLEMENTATION MODULE Streams; result := illegaloperation; RETURN; END; - IF (cnt > 0) AND (Unix.write(fildes, ADR(buf), cnt) < 0) THEN - ; + IF (cnt > 0) THEN + cnt1 := cnt; + cnt := 0; + IF Unix.write(fildes, ADR(buf), cnt) < 0) THEN END; END; - cnt := 0; END; END FlushStream; diff --git a/lang/m2/libm2/Traps.def b/lang/m2/libm2/Traps.def index 5b010c652..fd0bde05e 100644 --- a/lang/m2/libm2/Traps.def +++ b/lang/m2/libm2/Traps.def @@ -17,6 +17,7 @@ DEFINITION MODULE Traps; *) ERRCARDUVFL = 69; (* CARDINAL underflow *) ERRINTERNAL = 70; (* Internal error; should not happen *) + ERRUNIXSIG = 71; (* received unix signal *) TYPE TrapHandler = EM.TrapHandler; diff --git a/lang/m2/libm2/Traps.mod b/lang/m2/libm2/Traps.mod index e8874b737..2d1de8faa 100644 --- a/lang/m2/libm2/Traps.mod +++ b/lang/m2/libm2/Traps.mod @@ -30,7 +30,7 @@ IMPLEMENTATION MODULE Traps; *) VAR p, q: POINTER TO CHAR; l: CARDINAL; - dummy, lino: INTEGER; + lino: INTEGER; buf, buf2: ARRAY [0..255] OF CHAR; i, j: CARDINAL; BEGIN @@ -40,10 +40,10 @@ IMPLEMENTATION MODULE Traps; WHILE p^ # 0C DO p := ADDRESS(p) + 1; END; - dummy := Unix.write(2, q, ADDRESS(p) - ADDRESS(q)); + IF Unix.write(2, q, ADDRESS(p) - ADDRESS(q)) < 0 THEN END; ELSE l := Argv(0, buf); - dummy := Unix.write(2, ADR(buf), l); + IF Unix.write(2, ADR(buf), l) < 0 THEN END; END; lino := EM.LINO(); i := 0; @@ -70,14 +70,14 @@ IMPLEMENTATION MODULE Traps; END; buf[i] := ':'; buf[i+1] := ' '; - dummy := Unix.write(2, ADR(buf), i+2); + IF Unix.write(2, ADR(buf), i+2) < 0 THEN END; i := 0; WHILE (i <= HIGH(str)) AND (str[i] # 0C) DO INC(i); END; - dummy := Unix.write(2, ADR(str), i); + IF Unix.write(2, ADR(str), i) < 0 THEN END; buf[0] := 12C; - dummy := Unix.write(2, ADR(buf), 1); + IF Unix.write(2, ADR(buf), 1) < 0 THEN END; END Message; PROCEDURE Trap(n: INTEGER); diff --git a/lang/m2/libm2/Unix.def b/lang/m2/libm2/Unix.def index b954e4792..b04cfd9ed 100644 --- a/lang/m2/libm2/Unix.def +++ b/lang/m2/libm2/Unix.def @@ -99,6 +99,8 @@ DEFINITION MODULE Unix; PROCEDURE signal(sig: INTEGER; func: SignalPrc; VAR oldfunc: SignalPrc) : INTEGER; + PROCEDURE sigtrp(trapno, signo: INTEGER) : INTEGER; + (* Let Unix signal signo cause EM trap trapno to occur *) PROCEDURE stat(path: ADDRESS; statbuf: ADDRESS) : INTEGER; PROCEDURE fstat(fildes: INTEGER; statbuf: ADDRESS) : INTEGER; PROCEDURE stime(t: LONGINT) : INTEGER; diff --git a/lang/m2/libm2/catch.c b/lang/m2/libm2/catch.c index cddbe35b8..4614b066f 100644 --- a/lang/m2/libm2/catch.c +++ b/lang/m2/libm2/catch.c @@ -10,6 +10,7 @@ */ #include #include +#include static struct errm { int errno; @@ -47,6 +48,7 @@ static struct errm { { M2_FORCH, "Warning: FOR-loop control variable was changed in the body"}, { M2_UUVFL, "cardinal underflow"}, { M2_INTERNAL, "internal error; ask an expert for help"}, + { M2_UNIXSIG, "got a unix signal"}, { -1, 0} }; @@ -83,6 +85,19 @@ catch(trapno) *p = 0; _Traps__Message(q, 0, (int) (p - q), 1); } +#ifndef int24 +#ifndef int44 +#ifndef int22 + if (trapno == M2_UNIXSIG) { + extern int __signo; + signal(__signo, SIG_DFL); + _cleanup(); + kill(getpid(), __signo); + _exit(trapno); + } +#endif +#endif +#endif if (trapno != M2_FORCH) exit(trapno); SIG(catch); } diff --git a/lang/m2/libm2/head_m2.e b/lang/m2/libm2/head_m2.e index c2a77a45a..84caaacdd 100644 --- a/lang/m2/libm2/head_m2.e +++ b/lang/m2/libm2/head_m2.e @@ -23,6 +23,7 @@ exa MainLB exa StackSize exp $catch + exp $init inp $trap_handler handler @@ -85,6 +86,7 @@ mainroutine lpi $trap_handler sig asp EM_PSIZE + cal $init cal $__M2M_ cal $halt loc 0 ; should not get here @@ -98,6 +100,7 @@ mainroutine lae handler loi EM_PSIZE lpi $catch + lae handler sti EM_PSIZE cai asp EM_PSIZE+EM_WSIZE diff --git a/lang/m2/libm2/init.c b/lang/m2/libm2/init.c new file mode 100644 index 000000000..9dc40a4b8 --- /dev/null +++ b/lang/m2/libm2/init.c @@ -0,0 +1,27 @@ +/* + (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. + See the copyright notice in the ACK home directory, in the file "Copyright". +*/ + +#include +#include +#include + +/* map unix signals onto EM traps */ +init() +{ + sigtrp(M2_UNIXSIG, SIGHUP); + sigtrp(M2_UNIXSIG, SIGINT); + sigtrp(M2_UNIXSIG, SIGQUIT); + sigtrp(EILLINS, SIGILL); + sigtrp(M2_UNIXSIG, SIGTRAP); + sigtrp(M2_UNIXSIG, SIGIOT); + sigtrp(M2_UNIXSIG, SIGEMT); + /* sigtrp(M2_UNIXSIG, SIGFPE); leave this one for EM runtime startoff*/ + sigtrp(M2_UNIXSIG, SIGBUS); + sigtrp(M2_UNIXSIG, SIGSEGV); + sigtrp(EBADMON, SIGSYS); + sigtrp(M2_UNIXSIG, SIGPIPE); + sigtrp(M2_UNIXSIG, SIGALRM); + sigtrp(M2_UNIXSIG, SIGTERM); +} diff --git a/lang/m2/libm2/sigtrp.c b/lang/m2/libm2/sigtrp.c new file mode 100644 index 000000000..76d307061 --- /dev/null +++ b/lang/m2/libm2/sigtrp.c @@ -0,0 +1,79 @@ +/* + (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. + See the copyright notice in the ACK home directory, in the file "Copyright". +*/ + +/* Mapping of Unix signals to EM traps; + Use this only when you don't use the MON instruction +*/ + +#ifndef int22 +#ifndef int24 +#ifndef int44 + +#define EM_trap(n) TRP(n) /* define to whatever is needed to cause the trap */ + +#include +#include + +int __signo; + +static int __traps[] = { + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, +}; + +static int +__ctchsig(signo) +{ + signal(signo,__ctchsig); +#ifdef __BSD4_2 + sigsetmask(sigblock(0) & ~(1<<(signo - 1))); +#endif + __signo = signo; + EM_trap(__traps[signo]); +} + +int +sigtrp(trapno, signo) +{ + /* Let Unix signal signo cause EM trap trapno to occur. + If trapno = -2, restore default, + If trapno = -3, ignore. + Return old trapnumber. + Careful, this could be -2 or -3; But return value of -1 + indicates failure, with error number in errno. + */ + extern int errno; + int (*ctch)() = __ctchsig; + int oldtrap; + + if (signo <= 0 || signo >= sizeof(__traps)/sizeof(__traps[0])) { + errno = EINVAL; + return -1; + } + + if (trapno == -3) + ctch = SIG_IGN; + else if (trapno == -2) + ctch = SIG_DFL; + else if (trapno >= 0 && trapno <= 252) + ; + else { + errno = EINVAL; + return -1; + } + + oldtrap = __traps[signo]; + + if (signal(signo, ctch) == -1) /* errno set by signal */ + return -1; + + __traps[signo] = trapno; + + return oldtrap; +} +#endif +#endif +#endif -- 2.34.1