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