BSD 4_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Sat, 20 Aug 1983 14:33:42 +0000 (06:33 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Sat, 20 Aug 1983 14:33:42 +0000 (06:33 -0800)
Work on file usr/guest/sam/tests/sigstack3.c

Synthesized-from: CSRG/cd1/4.2

usr/guest/sam/tests/sigstack3.c [new file with mode: 0644]

diff --git a/usr/guest/sam/tests/sigstack3.c b/usr/guest/sam/tests/sigstack3.c
new file mode 100644 (file)
index 0000000..0e93b73
--- /dev/null
@@ -0,0 +1,73 @@
+#include <stdio.h>
+#include <signal.h>
+
+#define        MAXDEPTH        10
+int    depth = 0;
+int    maxdepth = MAXDEPTH;
+
+onintr(signo, code, sc)
+       struct sigcontext *sc;
+{
+       int x;
+
+       printf("sig=%u, code=%u, onstack=%u, mask=%u, sp=%x, pc=%x, ps=%x\n",
+           signo, code, sc->sc_onstack, sc->sc_mask, sc->sc_sp, sc->sc_pc,
+           sc->sc_ps);
+       printf("handler local var: &x=%x\n", &x);
+       sigsetmask(0);
+       if (++depth < maxdepth)
+               kill(getpid(), SIGHUP);
+       printf("onintr...return\n");
+}
+
+onhup(signo, code, sc)
+       struct sigcontext *sc;
+{
+       int x;
+
+       printf("sig=%u, code=%u, onstack=%u, mask=%u, sp=%x, pc=%x, ps=%x\n",
+           signo, code, sc->sc_onstack, sc->sc_mask, sc->sc_sp, sc->sc_pc,
+           sc->sc_ps);
+       printf("handler local var: &x=%x\n", &x);
+       sigsetmask(0);
+       if (++depth < maxdepth)
+               kill(getpid(), SIGINT);
+       printf("onhup...return\n");
+}
+
+char   stack[1024];
+
+main(argc, argv)
+       char *argv[];
+{
+       struct sigvec sv;
+       struct sigstack ss;
+
+       if (argc > 1) {
+               maxdepth = atoi(argv[1]);
+               if (maxdepth <= 0)
+                       maxdepth = MAXDEPTH;
+       }
+       ss.ss_sp = stack + sizeof (stack) - 1;  /* grows down on vax */
+       ss.ss_onstack = 0;
+       if (sigstack(&ss, (struct sigstack *)0) < 0)
+               perror("sigstack");
+       sv.sv_handler = onintr;
+       sv.sv_mask = 0;
+#ifdef notdef
+       sv.sv_onstack = argc > 1;
+#else
+       sv.sv_onstack = 0;
+#endif
+       if (sigvec(SIGINT, &sv, (struct sigvec *)0) < 0)
+               perror("sigvec");
+       sv.sv_handler = onhup;
+       sv.sv_mask = 0;
+       sv.sv_onstack = argc > 1;
+       if (sigvec(SIGHUP, &sv, (struct sigvec *)0) < 0)
+               perror("sigvec (SIGHUP)");
+       for (;;) {
+               depth = 0;
+               sigpause(0);
+       }
+}