ualarm
[unix-history] / usr / src / lib / libc / gen / signalsim.c
index 7089361..e16f85f 100644 (file)
@@ -1,19 +1,44 @@
-/*     signalsim.c     4.2     83/06/10        */
+/*     signalsim.c     4.4     84/11/04        */
 
 /*
 
 /*
- * Backwards compatible signal.
+ * Almost backwards compatible signal.
  */
 #include <signal.h>
 
  */
 #include <signal.h>
 
+enum {NATIVE = 0x0, UNKNOWN = 0x1, SIMULATE = 0x3} _sigsim = UNKNOWN;
+
 int (*
 int (*
-signal(s, a))()
+signalsim(s, a))()
        int s, (*a)();
 {
        struct sigvec osv, sv;
        int s, (*a)();
 {
        struct sigvec osv, sv;
+       int badcall();
+
+       switch (_sigsim) {
+       case UNKNOWN:
+               sv.sv_handler = badcall;
+               sv.sv_mask = sv.sv_onstack = 0;
+               if (sigvec(SIGSYS, &sv, &osv) < 0) {
+                       _sigsim = SIMULATE;
+               } else {
+                       _sigsim = NATIVE;
+                       signal(SIGSYS, osv.sv_handler);
+               }
+               /* fall through */
+       case NATIVE:
+       case SIMULATE:
+               sv.sv_handler = a;
+               sv.sv_mask = sv.sv_onstack = 0;
+               if (sigvec(s, &sv, &osv) < 0)
+                       return (BADSIG);
+               return (osv.sv_handler);
+       }
+}
 
 
-       sv.sv_handler = a;
-       sv.sv_mask = sv.sv_onstack = 0;
-       if (sigvec(s, &sv, &osv) < 0)
-               return (BADSIG);
-       return (osv.sv_handler);
+/*
+ * Signal call will trap to here if not implemented
+ */
+badcall()
+{
+       _sigsim = SIMULATE;
 }
 }