Lines Matching refs:shp

75 static_fn int notify_builtin(Shell_t *shp, int sig) {  in notify_builtin()  argument
78 if (!shp->bltinfun) return action; in notify_builtin()
80 action = (*shp->bltinfun)(-sig, NULL, NULL); in notify_builtin()
84 if (shp->bltindata.notify) shp->bltindata.sigset = 1; in notify_builtin()
88 void set_trapinfo(Shell_t *shp, int sig, siginfo_t *info) { in set_trapinfo() argument
95 siginfo_ll_t *jp = shp->siginfo[sig]; in set_trapinfo()
98 shp->siginfo[sig] = ip; in set_trapinfo()
112 Shell_t *shp = sh_getinterp(); in sh_fault() local
115 checkpt_t *pp = shp->jmplist; in sh_fault()
132 if (sig == SIGWINCH) shp->winch = 1; in sh_fault()
134 trap = shp->st.trapcom[sig]; in sh_fault()
140 if (shp->savesig) { in sh_fault()
142 if (!(shp->sigflag[sig] & SH_SIGIGNORE)) shp->savesig = sig; in sh_fault()
147 flag = shp->sigflag[sig] & ~SH_SIGOFF; in sh_fault()
149 if (sig == SIGINT && (shp->trapnote & SH_SIGIGNORE)) goto done; in sh_fault()
151 if (shp->subshell) shp->ignsig = sig; in sh_fault()
157 (void)notify_builtin(shp, sig); in sh_fault()
158 if ((flag & SH_SIGINTERACTIVE) && sh_isstate(shp, SH_INTERACTIVE) && in sh_fault()
159 !sh_isstate(shp, SH_FORKED) && !shp->subshell) { in sh_fault()
161 if (sig == SIGTERM && job.in_critical) shp->trapnote |= SH_SIGTERM; in sh_fault()
164 shp->lastsig = sig; in sh_fault()
168 pp->mode = shp->subshell ? SH_JMPSUB : SH_JMPFUN; in sh_fault()
173 if (shp->subshell) sh_exit(shp, SH_EXITSIG); in sh_fault()
176 sh_done(shp, sig); in sh_fault()
179 shp->trapnote |= SH_SIGSET; in sh_fault()
180 if (sig < shp->gd->sigmax) shp->sigflag[sig] |= SH_SIGSET; in sh_fault()
185 if (pp->mode == SH_JMPCMD || ((pp->mode == 1 && shp->bltinfun) && !(flag & SH_SIGIGNORE))) { in sh_fault()
186 shp->lastsig = sig; in sh_fault()
190 set_trapinfo(shp, sig, info); in sh_fault()
194 shp->lastsig = sig; in sh_fault()
198 shp->trapnote |= SH_SIGTSTP; in sh_fault()
199 if (pp->mode == SH_JMPCMD && sh_isstate(shp, SH_STOPOK)) { in sh_fault()
201 sh_exit(shp, SH_EXITSIG); in sh_fault()
208 int action = notify_builtin(shp, sig); in sh_fault()
210 shp->trapnote |= flag; in sh_fault()
211 if (sig < shp->gd->sigmax) shp->sigflag[sig] |= flag; in sh_fault()
212 if (pp->mode == SH_JMPCMD && sh_isstate(shp, SH_STOPOK)) { in sh_fault()
215 sh_exit(shp, SH_EXITSIG); in sh_fault()
225 void sh_siginit(Shell_t *shp) { in sh_siginit() argument
233 shp->gd->sigmax = MAX_SIGNUM + 1; in sh_siginit()
234 shp->st.trapcom = calloc(shp->gd->sigmax, sizeof(char *)); in sh_siginit()
235 shp->sigflag = calloc(shp->gd->sigmax, sizeof(unsigned char)); in sh_siginit()
236 shp->gd->sigmsg = calloc(shp->gd->sigmax, sizeof(char *)); in sh_siginit()
237 shp->siginfo = calloc(shp->gd->sigmax, sizeof(siginfo_ll_t *)); in sh_siginit()
244 if (sig >= shp->gd->sigmax) continue; in sh_siginit()
250 assert(sig < sizeof(shp->gd->sigruntime) / sizeof(*shp->gd->sigruntime)); in sh_siginit()
251 sig = shp->gd->sigruntime[sig]; in sh_siginit()
254 shp->sigflag[sig] = n; in sh_siginit()
255 if (tp->sh_name) shp->gd->sigmsg[sig] = tp->sh_value; in sh_siginit()
266 void sh_sigtrap(Shell_t *shp, int sig) { in sh_sigtrap() argument
269 shp->st.otrapcom = NULL; in sh_sigtrap()
271 sh_sigdone(shp); in sh_sigtrap()
272 } else if (!((flag = shp->sigflag[sig]) & (SH_SIGFAULT | SH_SIGOFF))) { in sh_sigtrap()
285 shp->sigflag[sig] = flag; in sh_sigtrap()
292 void sh_sigdone(Shell_t *shp) { in sh_sigdone() argument
294 shp->sigflag[0] |= SH_SIGFAULT; in sh_sigdone()
296 flag = shp->sigflag[sig]; in sh_sigdone()
299 sh_sigtrap(shp, sig); in sh_sigdone()
308 void sh_sigreset(Shell_t *shp, int mode) { in sh_sigreset() argument
313 int flag, sig = shp->st.trapmax; in sh_sigreset()
317 trap = shp->st.trapcom[sig]; in sh_sigreset()
319 flag = shp->sigflag[sig] & ~(SH_SIGTRAP | SH_SIGSET); in sh_sigreset()
322 shp->st.trapcom[sig] = 0; in sh_sigreset()
328 shp->sigflag[sig] = flag; in sh_sigreset()
332 trap = shp->st.trap[sig]; in sh_sigreset()
335 shp->st.trap[sig] = 0; in sh_sigreset()
338 shp->st.trapcom[0] = 0; in sh_sigreset()
339 if (mode) shp->st.trapmax = 0; in sh_sigreset()
340 shp->trapnote = 0; in sh_sigreset()
346 void sh_sigclear(Shell_t *shp, int sig) { in sh_sigclear() argument
347 int flag = shp->sigflag[sig]; in sh_sigclear()
350 shp->st.otrapcom = NULL; in sh_sigclear()
353 trap = shp->st.trapcom[sig]; in sh_sigclear()
355 if (!shp->subshell) free(trap); in sh_sigclear()
356 shp->st.trapcom[sig] = 0; in sh_sigclear()
358 shp->sigflag[sig] = flag; in sh_sigclear()
364 void sh_chktrap(Shell_t *shp) { in sh_chktrap() argument
365 int sig = shp->st.trapmax; in sh_chktrap()
368 if (!(shp->trapnote & ~SH_SIGIGNORE)) sig = 0; in sh_chktrap()
370 shp->trapnote &= ~SH_SIGTRAP; in sh_chktrap()
371 if (shp->winch) { in sh_chktrap()
379 shp->winch = 0; in sh_chktrap()
383 if (sh_isstate(shp, SH_ERREXIT) && shp->exitval) { in sh_chktrap()
384 int sav_trapnote = shp->trapnote; in sh_chktrap()
385 shp->trapnote &= ~SH_SIGSET; in sh_chktrap()
386 if (shp->st.trap[SH_ERRTRAP]) { in sh_chktrap()
387 trap = shp->st.trap[SH_ERRTRAP]; in sh_chktrap()
388 shp->st.trap[SH_ERRTRAP] = 0; in sh_chktrap()
389 sh_trap(shp, trap, 0); in sh_chktrap()
390 shp->st.trap[SH_ERRTRAP] = trap; in sh_chktrap()
392 shp->trapnote = sav_trapnote; in sh_chktrap()
393 if (sh_isoption(shp, SH_ERREXIT)) { in sh_chktrap()
394 shp->jmplist->mode = SH_JMPEXIT; in sh_chktrap()
395 sh_exit(shp, shp->exitval); in sh_chktrap()
398 if (!shp->sigflag) return; in sh_chktrap()
401 if ((shp->sigflag[sig] & SH_SIGTRAP) || (shp->siginfo && shp->siginfo[sig])) { in sh_chktrap()
402 shp->sigflag[sig] &= ~SH_SIGTRAP; in sh_chktrap()
404 job_chldtrap(shp, shp->st.trapcom[SIGCHLD], 1); in sh_chktrap()
407 trap = shp->st.trapcom[sig]; in sh_chktrap()
412 if (shp->siginfo) { in sh_chktrap()
414 ip = shp->siginfo[sig]; in sh_chktrap()
415 } while (asocasptr(&shp->siginfo[sig], ip, 0) != ip); in sh_chktrap()
422 if (trap) sh_trap(shp, trap, 0); in sh_chktrap()
432 trap = shp->st.trapcom[sig]; in sh_chktrap()
435 if (shp->siginfo[sig]) goto retry; in sh_chktrap()
441 sig = shp->st.trapmax; in sh_chktrap()
449 void sh_exit(Shell_t *shp, int xno) { in sh_exit() argument
452 checkpt_t *pp = shp->jmplist; in sh_exit()
454 shp->exitval = xno; in sh_exit()
455 if (xno == SH_EXITSIG) shp->exitval |= (sig = shp->lastsig); in sh_exit()
457 if (shp->procsub) *shp->procsub = 0; in sh_exit()
460 if ((shp->trapnote & SH_SIGTSTP) && job.jobcontrol) { in sh_exit()
462 shp->trapnote = 0; in sh_exit()
463 shp->sigflag[SIGTSTP] = 0; in sh_exit()
464 if (!shp->subshell && sh_isstate(shp, SH_MONITOR) && !sh_isstate(shp, SH_STOPOK)) return; in sh_exit()
465 if (sh_isstate(shp, SH_TIMING)) return; in sh_exit()
467 shp->lastsig = 0; in sh_exit()
468 sh_onstate(shp, SH_MONITOR); in sh_exit()
469 sh_offstate(shp, SH_STOPOK); in sh_exit()
470 shp->trapnote = 0; in sh_exit()
471 shp->forked = 1; in sh_exit()
472 if (!shp->subshell && (sig = sh_fork(shp, 0, NULL))) { in sh_exit()
476 shp->forked = 0; in sh_exit()
478 shp->sigflag[SIGTSTP] = 0; in sh_exit()
480 shp->exitval = (SH_EXITSIG | SIGTSTP); in sh_exit()
485 if (shp->subshell) sh_subfork(); in sh_exit()
487 sh_offstate(shp, SH_STOPOK); in sh_exit()
488 sh_offstate(shp, SH_MONITOR); in sh_exit()
489 shp->sigflag[SIGTSTP] = 0; in sh_exit()
493 job_clear(shp); in sh_exit()
494 shp->exitval = (xno & SH_EXITMASK); in sh_exit()
501 sh_offstate(shp, SH_NOTRACK); in sh_exit()
502 if (!(pool = sfpool(NULL, shp->outpool, SF_WRITE))) pool = shp->outpool; // can't happen? in sh_exit()
505 if (shp->lastsig == SIGPIPE) sfpurge(pool); in sh_exit()
508 if (!pp) sh_done(shp, sig); in sh_exit()
509 shp->intrace = 0; in sh_exit()
510 shp->prefix = NULL; in sh_exit()
511 shp->mktype = NULL; in sh_exit()
513 if (pp->mode == SH_JMPSCRIPT && !pp->prev) sh_done(shp, sig); in sh_exit()
528 Shell_t *shp = ptr; in sh_done() local
530 int savxit = shp->exitval; in sh_done()
532 shp->trapnote = 0; in sh_done()
535 if (shp->userinit) (*shp->userinit)(shp, -1); in sh_done()
536 if (shp->st.trapcom && (t = shp->st.trapcom[0])) { in sh_done()
537 shp->st.trapcom[0] = 0; // should free but not long in sh_done()
538 shp->oldexit = savxit; in sh_done()
539 sh_trap(shp, t, 0); in sh_done()
540 savxit = shp->exitval; in sh_done()
543 sh_offstate(shp, SH_ERREXIT); in sh_done()
544 sh_chktrap(shp); in sh_done()
546 if (shp->var_tree) nv_scan(shp->var_tree, array_notify, NULL, NV_ARRAY, NV_ARRAY); in sh_done()
547 sh_freeup(shp); in sh_done()
548 if (mbwide() || sh_isoption(shp, SH_EMACS) || sh_isoption(shp, SH_VI) || in sh_done()
549 sh_isoption(shp, SH_GMACS)) { in sh_done()
553 if ((sh_isoption(shp, SH_INTERACTIVE) && shp->login_sh) || in sh_done()
554 (!sh_isoption(shp, SH_INTERACTIVE) && (sig == SIGHUP))) { in sh_done()
555 job_walk(shp, sfstderr, job_terminate, SIGHUP, NULL); in sh_done()
558 job_close(shp); in sh_done()
560 sfsync((Sfio_t *)shp->outpool); in sh_done()
562 if ((savxit & SH_EXITMASK) == shp->lastsig) sig = savxit & SH_EXITMASK; in sh_done()
576 if (sh_isoption(shp, SH_NOEXEC)) kiaclose(shp->lex_context); in sh_done()
577 if (shp->pwdfd >= 0) close(shp->pwdfd); in sh_done()
591 static_fn char *sig_name(Shell_t *shp, int sig, char *buf, int pfx) { in sig_name() argument
595 if (sig > shp->gd->sigruntime[SH_SIGRTMIN] && sig < shp->gd->sigruntime[SH_SIGRTMAX]) { in sig_name()
599 if (sig > shp->gd->sigruntime[SH_SIGRTMIN] + in sig_name()
600 (shp->gd->sigruntime[SH_SIGRTMAX] - shp->gd->sigruntime[SH_SIGRTMIN]) / 2) { in sig_name()
604 sig = shp->gd->sigruntime[SH_SIGRTMAX] - sig; in sig_name()
609 sig = sig - shp->gd->sigruntime[SH_SIGRTMIN]; in sig_name()
628 void sh_siglist(Shell_t *shp, Sfio_t *iop, int flag) { in sh_siglist() argument
638 for (sig = shp->gd->sigmax - 1; sig >= 0; sig--) names[sig] = 0; in sh_siglist()
644 (sig = shp->gd->sigruntime[sig - 1] + 1) == 1) { in sh_siglist()
657 sfputr(iop, sig_name(shp, flag - 1, name, 0), '\n'); in sh_siglist()
661 sig = shp->st.trapmax; in sh_siglist()
663 trapcom = (shp->st.otrapcom ? shp->st.otrapcom : shp->st.trapcom); in sh_siglist()
666 if (sig >= shp->gd->sigmax || !(sname = (char *)names[sig])) { in sh_siglist()
667 sname = sig_name(shp, sig, name, 1); in sh_siglist()
672 if (!(trap = shp->st.otrap ? shp->st.otrap[sig] : shp->st.trap[sig])) continue; in sh_siglist()
677 for (sig = 1; sig < shp->gd->sigmax; sig++) { in sh_siglist()
679 sname = sig_name(shp, sig, name, 1); in sh_siglist()
680 if (flag) sname = stkcopy(shp->stk, sname); in sh_siglist()
690 sh_menu(shp, iop, shp->gd->sigmax, (char **)names + 1); in sh_siglist()
699 int sh_trap(Shell_t *shp, const char *trap, int mode) { in sh_trap() argument
700 int jmpval, savxit = shp->exitval; in sh_trap()
701 int was_history = sh_isstate(shp, SH_HISTORY); in sh_trap()
702 int was_verbose = sh_isstate(shp, SH_VERBOSE); in sh_trap()
703 int staktop = stktell(shp->stk); in sh_trap()
704 char *savptr = stkfreeze(shp->stk, 0); in sh_trap()
710 memcpy(ifstable, shp->ifstable, sizeof(ifstable)); in sh_trap()
711 sh_offstate(shp, SH_HISTORY); in sh_trap()
712 sh_offstate(shp, SH_VERBOSE); in sh_trap()
713 shp->intrap++; in sh_trap()
714 sh_pushcontext(shp, &buff, SH_JMPTRAP); in sh_trap()
718 sh_exec(shp, (Shnode_t *)trap, sh_isstate(shp, SH_ERREXIT)); in sh_trap()
726 sh_eval(shp, sp, 0); in sh_trap()
732 if (jmpval == SH_JMPEXIT) savxit = shp->exitval; in sh_trap()
736 sh_popcontext(shp, &buff); in sh_trap()
737 shp->intrap--; in sh_trap()
738 sfsync(shp->outpool); in sh_trap()
739 if (!shp->indebug && jmpval != SH_JMPEXIT && jmpval != SH_JMPFUN) shp->exitval = savxit; in sh_trap()
740 stkset(shp->stk, savptr, staktop); in sh_trap()
742 memcpy(shp->ifstable, ifstable, sizeof(ifstable)); in sh_trap()
743 if (was_history) sh_onstate(shp, SH_HISTORY); in sh_trap()
744 if (was_verbose) sh_onstate(shp, SH_VERBOSE); in sh_trap()
745 exitset(shp); in sh_trap()
746 if (jmpval > SH_JMPTRAP && (shp->jmpbuffer->prev || shp->jmpbuffer->mode == SH_JMPSCRIPT)) { in sh_trap()
747 siglongjmp(shp->jmplist->buff, jmpval); in sh_trap()
749 return shp->exitval; in sh_trap()
777 void sh_sigcheck(Shell_t *shp) { in sh_sigcheck() argument
778 if (shp->trapnote & SH_SIGSET) sh_exit((shp), SH_EXITSIG); in sh_sigcheck()
784 int sig_number(Shell_t *shp, const char *string) { in sig_number() argument
794 o = stktell(shp->stk); in sig_number()
798 sfputc(shp->stk, c); in sig_number()
800 stkseek(shp->stk, o); in sig_number()
801 if (strncmp(stkptr(shp->stk, o), "SIG", 3) == 0) { in sig_number()
804 if (isdigit(*stkptr(shp->stk, o))) { in sig_number()
805 n = (int)strtol(stkptr(shp->stk, o), &last, 10); in sig_number()
809 char *signame = stkptr(shp->stk, o); in sig_number()
816 if (strcmp(stkptr(shp->stk, o), tp->sh_name) == 0) n = tp->sh_number; in sig_number()
819 n = shp->gd->sigruntime[(n & ((1 << SH_SIGBITS) - 1)) - 1]; in sig_number()
824 if (n < 0 && shp->gd->sigruntime[1] && (name = stkptr(shp->stk, o)) && *name++ == 'R' && in sig_number()
828 n = shp->gd->sigruntime[SH_SIGRTMIN] + sig; in sig_number()
832 n = shp->gd->sigruntime[SH_SIGRTMAX] - sig; in sig_number()
835 n = shp->gd->sigruntime[SH_SIGRTMIN] + sig - 1; in sig_number()
837 if (n < shp->gd->sigruntime[SH_SIGRTMIN] || n > shp->gd->sigruntime[SH_SIGRTMAX]) { in sig_number()