1*4887Schin /*********************************************************************** 2*4887Schin * * 3*4887Schin * This software is part of the ast package * 4*4887Schin * Copyright (c) 1982-2007 AT&T Knowledge Ventures * 5*4887Schin * and is licensed under the * 6*4887Schin * Common Public License, Version 1.0 * 7*4887Schin * by AT&T Knowledge Ventures * 8*4887Schin * * 9*4887Schin * A copy of the License is available at * 10*4887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 11*4887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12*4887Schin * * 13*4887Schin * Information and Software Systems Research * 14*4887Schin * AT&T Research * 15*4887Schin * Florham Park NJ * 16*4887Schin * * 17*4887Schin * David Korn <dgk@research.att.com> * 18*4887Schin * * 19*4887Schin ***********************************************************************/ 20*4887Schin #pragma prototyped 21*4887Schin #ifndef SH_SIGBITS 22*4887Schin /* 23*4887Schin * UNIX shell 24*4887Schin * S. R. Bourne 25*4887Schin * Rewritten by David Korn 26*4887Schin * 27*4887Schin */ 28*4887Schin 29*4887Schin #include <sig.h> 30*4887Schin #include <setjmp.h> 31*4887Schin #include <error.h> 32*4887Schin #include <sfio.h> 33*4887Schin #include "FEATURE/setjmp" 34*4887Schin #include "FEATURE/sigfeatures" 35*4887Schin 36*4887Schin #ifndef SIGWINCH 37*4887Schin # ifdef SIGWIND 38*4887Schin # define SIGWINCH SIGWIND 39*4887Schin # else 40*4887Schin # ifdef SIGWINDOW 41*4887Schin # define SIGWINCH SIGWINDOW 42*4887Schin # endif 43*4887Schin # endif 44*4887Schin #endif 45*4887Schin 46*4887Schin typedef void (*SH_SIGTYPE)(int,void(*)(int)); 47*4887Schin 48*4887Schin #define SH_FORKLIM 16 /* fork timeout interval */ 49*4887Schin 50*4887Schin #define SH_TRAP 0200 /* bit for internal traps */ 51*4887Schin #define SH_ERRTRAP 0 /* trap for non-zero exit status */ 52*4887Schin #define SH_KEYTRAP 1 /* trap for keyboard event */ 53*4887Schin #define SH_DEBUGTRAP 4 /* must be last internal trap */ 54*4887Schin 55*4887Schin #define SH_SIGBITS 8 56*4887Schin #define SH_SIGFAULT 1 /* signal handler is sh_fault */ 57*4887Schin #define SH_SIGOFF 2 /* signal handler is SIG_IGN */ 58*4887Schin #define SH_SIGSET 4 /* pending signal */ 59*4887Schin #define SH_SIGTRAP 010 /* pending trap */ 60*4887Schin #define SH_SIGDONE 020 /* default is exit */ 61*4887Schin #define SH_SIGIGNORE 040 /* default is ingore signal */ 62*4887Schin #define SH_SIGINTERACTIVE 0100 /* handle interactive specially */ 63*4887Schin #define SH_SIGTSTP 0200 /* tstp signal received */ 64*4887Schin #define SH_SIGALRM 0200 /* timer alarm received */ 65*4887Schin #define SH_SIGTERM SH_SIGOFF /* term signal received */ 66*4887Schin 67*4887Schin /* 68*4887Schin * These are longjmp values 69*4887Schin */ 70*4887Schin 71*4887Schin #define SH_JMPDOT 2 72*4887Schin #define SH_JMPEVAL 3 73*4887Schin #define SH_JMPTRAP 4 74*4887Schin #define SH_JMPIO 5 75*4887Schin #define SH_JMPCMD 6 76*4887Schin #define SH_JMPFUN 7 77*4887Schin #define SH_JMPERRFN 8 78*4887Schin #define SH_JMPSUB 9 79*4887Schin #define SH_JMPERREXIT 10 80*4887Schin #define SH_JMPEXIT 11 81*4887Schin #define SH_JMPSCRIPT 12 82*4887Schin 83*4887Schin struct openlist 84*4887Schin { 85*4887Schin Sfio_t *strm; 86*4887Schin struct openlist *next; 87*4887Schin }; 88*4887Schin 89*4887Schin struct checkpt 90*4887Schin { 91*4887Schin sigjmp_buf buff; 92*4887Schin sigjmp_buf *prev; 93*4887Schin int topfd; 94*4887Schin int mode; 95*4887Schin struct openlist *olist; 96*4887Schin #if (ERROR_VERSION >= 20030214L) 97*4887Schin Error_context_t err; 98*4887Schin #else 99*4887Schin struct errorcontext err; 100*4887Schin #endif 101*4887Schin }; 102*4887Schin 103*4887Schin #define sh_pushcontext(bp,n) ( (bp)->mode=(n) , (bp)->olist=0, \ 104*4887Schin (bp)->topfd=sh.topfd, (bp)->prev=sh.jmplist, \ 105*4887Schin (bp)->err = *ERROR_CONTEXT_BASE, \ 106*4887Schin sh.jmplist = (sigjmp_buf*)(&(bp)->buff) \ 107*4887Schin ) 108*4887Schin #define sh_popcontext(bp) (sh.jmplist=(bp)->prev, errorpop(&((bp)->err))) 109*4887Schin 110*4887Schin extern void sh_fault(int); 111*4887Schin extern void sh_done(int); 112*4887Schin extern void sh_chktrap(void); 113*4887Schin extern void sh_sigclear(int); 114*4887Schin extern void sh_sigdone(void); 115*4887Schin extern void sh_siginit(void); 116*4887Schin extern void sh_sigtrap(int); 117*4887Schin extern void sh_sigreset(int); 118*4887Schin extern void sh_timetraps(void); 119*4887Schin extern void *sh_timeradd(unsigned long,int ,void (*)(void*),void*); 120*4887Schin extern void timerdel(void*); 121*4887Schin 122*4887Schin extern const char e_alarm[]; 123*4887Schin 124*4887Schin #endif /* !SH_SIGBITS */ 125