Blame


1 f08fdedc 2003-11-23 devnull #include "rc.h"
2 f08fdedc 2003-11-23 devnull #include "exec.h"
3 f08fdedc 2003-11-23 devnull #include "fns.h"
4 f08fdedc 2003-11-23 devnull #include "io.h"
5 f08fdedc 2003-11-23 devnull extern char *Signame[];
6 f08fdedc 2003-11-23 devnull void dotrap(void){
7 f08fdedc 2003-11-23 devnull register int i;
8 f08fdedc 2003-11-23 devnull register struct var *trapreq;
9 f08fdedc 2003-11-23 devnull register struct word *starval;
10 f08fdedc 2003-11-23 devnull starval=vlook("*")->val;
11 f08fdedc 2003-11-23 devnull while(ntrap) for(i=0;i!=NSIG;i++) while(trap[i]){
12 f08fdedc 2003-11-23 devnull --trap[i];
13 f08fdedc 2003-11-23 devnull --ntrap;
14 f08fdedc 2003-11-23 devnull if(getpid()!=mypid) Exit(getstatus());
15 f08fdedc 2003-11-23 devnull trapreq=vlook(Signame[i]);
16 f08fdedc 2003-11-23 devnull if(trapreq->fn){
17 f08fdedc 2003-11-23 devnull start(trapreq->fn, trapreq->pc, (struct var *)0);
18 f08fdedc 2003-11-23 devnull runq->local=newvar(strdup("*"), runq->local);
19 f08fdedc 2003-11-23 devnull runq->local->val=copywords(starval, (struct word *)0);
20 f08fdedc 2003-11-23 devnull runq->local->changed=1;
21 f08fdedc 2003-11-23 devnull runq->redir=runq->startredir=0;
22 f08fdedc 2003-11-23 devnull }
23 f08fdedc 2003-11-23 devnull else if(i==SIGINT || i==SIGQUIT){
24 f08fdedc 2003-11-23 devnull /*
25 f08fdedc 2003-11-23 devnull * run the stack down until we uncover the
26 f08fdedc 2003-11-23 devnull * command reading loop. Xreturn will exit
27 f08fdedc 2003-11-23 devnull * if there is none (i.e. if this is not
28 f08fdedc 2003-11-23 devnull * an interactive rc.)
29 f08fdedc 2003-11-23 devnull */
30 f08fdedc 2003-11-23 devnull while(!runq->iflag) Xreturn();
31 f08fdedc 2003-11-23 devnull }
32 f08fdedc 2003-11-23 devnull else Exit(getstatus());
33 f08fdedc 2003-11-23 devnull }
34 f08fdedc 2003-11-23 devnull }