summaryrefslogtreecommitdiff
path: root/utils/rcsh/trap.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/rcsh/trap.c')
-rw-r--r--utils/rcsh/trap.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/utils/rcsh/trap.c b/utils/rcsh/trap.c
new file mode 100644
index 00000000..7bae2cbc
--- /dev/null
+++ b/utils/rcsh/trap.c
@@ -0,0 +1,42 @@
+#include "rc.h"
+
+int interrupted;
+Ref ntrap;
+
+/* runs in a different thread */
+void
+dointr(void)
+{
+ refinc(&ntrap);
+ interrupted = 1;
+}
+
+void
+dotrap(void)
+{
+ Var *trapreq;
+ Word *starval;
+
+ while(refdec(&ntrap) >= 0) {
+ if(flag['S'])
+ exits(truestatus()?"":getstatus());
+ starval=vlook("*")->val;
+ trapreq=vlook("sysint");
+ if(trapreq->fn){
+ start(trapreq->fn, trapreq->pc, (Var*)0);
+ runq->local=newvar(strdup("*"), runq->local);
+ runq->local->val=copywords(starval, (Word*)0);
+ runq->local->changed=1;
+ runq->redir=runq->startredir=0;
+ } else {
+ /*
+ * run the stack down until we uncover the
+ * command reading loop. Xreturn will exit
+ * if there is none (i.e. if this is not
+ * an interactive rc.)
+ */
+ while(!runq->iflag)
+ Xreturn();
+ }
+ }
+}