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