xref: /plan9/sys/src/cmd/rc/trap.c (revision d3907fe5a68251e8b016f54f72acf8767ba044bb)
13e12c5d1SDavid du Colombier #include "rc.h"
23e12c5d1SDavid du Colombier #include "exec.h"
33e12c5d1SDavid du Colombier #include "fns.h"
43e12c5d1SDavid du Colombier #include "io.h"
5*d3907fe5SDavid du Colombier extern char *Signame[];
6dc5a79c1SDavid du Colombier 
7dc5a79c1SDavid du Colombier void
dotrap(void)8dc5a79c1SDavid du Colombier dotrap(void)
9dc5a79c1SDavid du Colombier {
10dc5a79c1SDavid du Colombier 	int i;
11dc5a79c1SDavid du Colombier 	struct var *trapreq;
12dc5a79c1SDavid du Colombier 	struct word *starval;
133e12c5d1SDavid du Colombier 	starval = vlook("*")->val;
143e12c5d1SDavid du Colombier 	while(ntrap) for(i = 0;i!=NSIG;i++) while(trap[i]){
153e12c5d1SDavid du Colombier 		--trap[i];
163e12c5d1SDavid du Colombier 		--ntrap;
173e12c5d1SDavid du Colombier 		if(getpid()!=mypid) Exit(getstatus());
183e12c5d1SDavid du Colombier 		trapreq = vlook(Signame[i]);
193e12c5d1SDavid du Colombier 		if(trapreq->fn){
203e12c5d1SDavid du Colombier 			start(trapreq->fn, trapreq->pc, (struct var *)0);
213e12c5d1SDavid du Colombier 			runq->local = newvar(strdup("*"), runq->local);
223e12c5d1SDavid du Colombier 			runq->local->val = copywords(starval, (struct word *)0);
233e12c5d1SDavid du Colombier 			runq->local->changed = 1;
243e12c5d1SDavid du Colombier 			runq->redir = runq->startredir = 0;
253e12c5d1SDavid du Colombier 		}
263e12c5d1SDavid du Colombier 		else if(i==SIGINT || i==SIGQUIT){
273e12c5d1SDavid du Colombier 			/*
283e12c5d1SDavid du Colombier 			 * run the stack down until we uncover the
293e12c5d1SDavid du Colombier 			 * command reading loop.  Xreturn will exit
303e12c5d1SDavid du Colombier 			 * if there is none (i.e. if this is not
313e12c5d1SDavid du Colombier 			 * an interactive rc.)
323e12c5d1SDavid du Colombier 			 */
333e12c5d1SDavid du Colombier 			while(!runq->iflag) Xreturn();
343e12c5d1SDavid du Colombier 		}
353e12c5d1SDavid du Colombier 		else Exit(getstatus());
363e12c5d1SDavid du Colombier 	}
373e12c5d1SDavid du Colombier }
38