14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*8462SApril.Chin@Sun.COM * Copyright (c) 1982-2008 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 7*8462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * David Korn <dgk@research.att.com> * 184887Schin * * 194887Schin ***********************************************************************/ 204887Schin #pragma prototyped 214887Schin #ifndef SH_SIGBITS 224887Schin /* 234887Schin * UNIX shell 244887Schin * S. R. Bourne 254887Schin * Rewritten by David Korn 264887Schin * 274887Schin */ 284887Schin 294887Schin #include <sig.h> 304887Schin #include <setjmp.h> 314887Schin #include <error.h> 324887Schin #include <sfio.h> 334887Schin #include "FEATURE/setjmp" 344887Schin #include "FEATURE/sigfeatures" 354887Schin 36*8462SApril.Chin@Sun.COM 374887Schin #ifndef SIGWINCH 384887Schin # ifdef SIGWIND 394887Schin # define SIGWINCH SIGWIND 404887Schin # else 414887Schin # ifdef SIGWINDOW 424887Schin # define SIGWINCH SIGWINDOW 434887Schin # endif 444887Schin # endif 454887Schin #endif 464887Schin 474887Schin typedef void (*SH_SIGTYPE)(int,void(*)(int)); 484887Schin 494887Schin #define SH_FORKLIM 16 /* fork timeout interval */ 504887Schin 514887Schin #define SH_TRAP 0200 /* bit for internal traps */ 524887Schin #define SH_ERRTRAP 0 /* trap for non-zero exit status */ 534887Schin #define SH_KEYTRAP 1 /* trap for keyboard event */ 544887Schin #define SH_DEBUGTRAP 4 /* must be last internal trap */ 554887Schin 564887Schin #define SH_SIGBITS 8 574887Schin #define SH_SIGFAULT 1 /* signal handler is sh_fault */ 584887Schin #define SH_SIGOFF 2 /* signal handler is SIG_IGN */ 594887Schin #define SH_SIGSET 4 /* pending signal */ 604887Schin #define SH_SIGTRAP 010 /* pending trap */ 614887Schin #define SH_SIGDONE 020 /* default is exit */ 624887Schin #define SH_SIGIGNORE 040 /* default is ingore signal */ 634887Schin #define SH_SIGINTERACTIVE 0100 /* handle interactive specially */ 644887Schin #define SH_SIGTSTP 0200 /* tstp signal received */ 654887Schin #define SH_SIGALRM 0200 /* timer alarm received */ 664887Schin #define SH_SIGTERM SH_SIGOFF /* term signal received */ 67*8462SApril.Chin@Sun.COM #define SH_SIGRUNTIME 0400 /* runtime value */ 68*8462SApril.Chin@Sun.COM 69*8462SApril.Chin@Sun.COM #define SH_SIGRTMIN 0 /* sh.sigruntime[] index */ 70*8462SApril.Chin@Sun.COM #define SH_SIGRTMAX 1 /* sh.sigruntime[] index */ 714887Schin 724887Schin /* 734887Schin * These are longjmp values 744887Schin */ 754887Schin 764887Schin #define SH_JMPDOT 2 774887Schin #define SH_JMPEVAL 3 784887Schin #define SH_JMPTRAP 4 794887Schin #define SH_JMPIO 5 804887Schin #define SH_JMPCMD 6 814887Schin #define SH_JMPFUN 7 824887Schin #define SH_JMPERRFN 8 834887Schin #define SH_JMPSUB 9 844887Schin #define SH_JMPERREXIT 10 854887Schin #define SH_JMPEXIT 11 864887Schin #define SH_JMPSCRIPT 12 874887Schin 884887Schin struct openlist 894887Schin { 904887Schin Sfio_t *strm; 914887Schin struct openlist *next; 924887Schin }; 934887Schin 944887Schin struct checkpt 954887Schin { 964887Schin sigjmp_buf buff; 974887Schin sigjmp_buf *prev; 984887Schin int topfd; 994887Schin int mode; 1004887Schin struct openlist *olist; 1014887Schin #if (ERROR_VERSION >= 20030214L) 1024887Schin Error_context_t err; 1034887Schin #else 1044887Schin struct errorcontext err; 1054887Schin #endif 1064887Schin }; 1074887Schin 1084887Schin #define sh_pushcontext(bp,n) ( (bp)->mode=(n) , (bp)->olist=0, \ 1094887Schin (bp)->topfd=sh.topfd, (bp)->prev=sh.jmplist, \ 1104887Schin (bp)->err = *ERROR_CONTEXT_BASE, \ 1114887Schin sh.jmplist = (sigjmp_buf*)(&(bp)->buff) \ 1124887Schin ) 1134887Schin #define sh_popcontext(bp) (sh.jmplist=(bp)->prev, errorpop(&((bp)->err))) 1144887Schin 1154887Schin extern void sh_fault(int); 116*8462SApril.Chin@Sun.COM extern void sh_done(void*,int); 1174887Schin extern void sh_chktrap(void); 1184887Schin extern void sh_sigclear(int); 1194887Schin extern void sh_sigdone(void); 120*8462SApril.Chin@Sun.COM extern void sh_siginit(void*); 1214887Schin extern void sh_sigtrap(int); 1224887Schin extern void sh_sigreset(int); 1234887Schin extern void sh_timetraps(void); 1244887Schin extern void *sh_timeradd(unsigned long,int ,void (*)(void*),void*); 1254887Schin extern void timerdel(void*); 1264887Schin 1274887Schin extern const char e_alarm[]; 1284887Schin 1294887Schin #endif /* !SH_SIGBITS */ 130