1: /* $Header: /home/hyperion/mu/christos/src/sys/tcsh-6.00/RCS/tc.sig.h,v 3.0 1991/07/04 23:34:26 christos Exp $ */ 2: /* 3: * tc.sig.h: Signal handling 4: * 5: */ 6: /*- 7: * Copyright (c) 1980, 1991 The Regents of the University of California. 8: * All rights reserved. 9: * 10: * Redistribution and use in source and binary forms, with or without 11: * modification, are permitted provided that the following conditions 12: * are met: 13: * 1. Redistributions of source code must retain the above copyright 14: * notice, this list of conditions and the following disclaimer. 15: * 2. Redistributions in binary form must reproduce the above copyright 16: * notice, this list of conditions and the following disclaimer in the 17: * documentation and/or other materials provided with the distribution. 18: * 3. All advertising materials mentioning features or use of this software 19: * must display the following acknowledgement: 20: * This product includes software developed by the University of 21: * California, Berkeley and its contributors. 22: * 4. Neither the name of the University nor the names of its contributors 23: * may be used to endorse or promote products derived from this software 24: * without specific prior written permission. 25: * 26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36: * SUCH DAMAGE. 37: */ 38: #ifndef _h_tc_sig 39: #define _h_tc_sig 40: 41: #if SVID > 0 42: # include <signal.h> 43: # ifndef SIGCHLD 44: # define SIGCHLD SIGCLD 45: # endif /* SIGCHLD */ 46: #else /* SVID == 0 */ 47: # include <sys/signal.h> 48: #endif /* SVID > 0 */ 49: 50: #ifdef sun 51: # define SAVESIGVEC 52: #endif 53: 54: #ifdef BSDSIGS 55: /* 56: * sigvec is not the same everywhere 57: */ 58: # ifdef _SEQUENT_ 59: # define HAVE_SIGVEC 60: # define mysigvec(a, b, c) sigaction(a, b, c) 61: typedef struct sigaction sigvec_t; 62: # define sv_handler sa_handler 63: # endif /* _SEQUENT */ 64: 65: # ifdef hpux 66: # define HAVE_SIGVEC 67: # define mysigvec(a, b, c) sigvector(a, b, c) 68: # define NEEDsignal 69: typedef struct sigvec sigvec_t; 70: # endif /* hpux */ 71: 72: # ifndef HAVE_SIGVEC 73: # define mysigvec(a, b, c) sigvec(a, b, c) 74: typedef struct sigvec sigvec_t; 75: # endif /* HAVE_SIGVEC */ 76: 77: # undef HAVE_SIGVEC 78: #endif /* BSDSIGS */ 79: 80: #if SVID > 0 81: # ifdef BSDJOBS 82: /* here I assume that systems that have bsdjobs implement the 83: * the setpgrp call correctly. Otherwise defining this would 84: * work, but it would kill the world, because all the setpgrp 85: * code is the the part defined when BSDJOBS are defined 86: * NOTE: we don't want killpg(a, b) == kill(-getpgrp(a), b) 87: * cause process a might be already dead and getpgrp would fail 88: */ 89: # define killpg(a, b) kill(-(a), (b)) 90: # else 91: /* this is the poor man's version of killpg()! Just kill the 92: * current process and don't worry about the rest. Someday 93: * I hope I get to fix that. 94: */ 95: # define killpg(a, b) kill((a), (b)) 96: # endif /* BSDJOBS */ 97: #endif /* SVID > 0 */ 98: 99: 100: #ifdef BSDSIGS 101: /* 102: * For 4.2bsd signals. 103: */ 104: # ifdef sigmask 105: # undef sigmask 106: # endif /* sigmask */ 107: # define sigmask(s) ((sigmask_t)1 << ((s)-1)) 108: # ifdef _SEQUENT_ 109: # define sigpause(a) b_sigpause(a) 110: # define signal(a, b) sigset(a, b) 111: # else /* _SEQUENT_ */ 112: # define sighold(s) sigblock(sigmask(s)) 113: # define sigignore(s) signal(s, SIG_IGN) 114: # define sigset(s, a) signal(s, a) 115: # endif /* _SEQUENT_ */ 116: # ifdef aiws 117: # define sigrelse(a) sigsetmask(sigblock(0) & ~sigmask(a)) 118: # undef killpg 119: # define killpg(a, b) kill(-getpgrp(a), b) 120: # define NEEDsignal 121: # endif /* aiws */ 122: #endif /* BSDSIGS */ 123: 124: 125: /* 126: * We choose a define for the window signal if it exists.. 127: */ 128: #ifdef SIGWINCH 129: # define SIG_WINDOW SIGWINCH 130: #else 131: # ifdef SIGWINDOW 132: # define SIG_WINDOW SIGWINDOW 133: # endif /* SIGWINDOW */ 134: #endif /* SIGWINCH */ 135: 136: #if defined(convex) || defined(__convex__) 137: # define SIGSYNCH 0 138: # ifdef SIGSYNCH 139: # define SYNCHMASK (sigmask(SIGCHLD)|sigmask(SYNCH_SIG)) 140: # else 141: # define SYNCHMASK (sigmask(SIGCHLD)) 142: # endif 143: extern sigret_t synch_handler(); 144: #endif /* convex || __convex__ */ 145: 146: #ifdef SAVESIGVEC 147: # define NSIGSAVED 7 148: /* 149: * These are not inline for speed. gcc -traditional -O on the sparc ignores 150: * the fact that vfork() corrupts the registers. Calling a routine is not 151: * nice, since it can make the comp_r put some things that we want saved 152: * into registers - christos 153: */ 154: # define savesigvec(sv) \ 155: (mysigvec(SIGINT, (sigvec_t *) 0, &(sv)[0]), \ 156: mysigvec(SIGQUIT, (sigvec_t *) 0, &(sv)[1]), \ 157: mysigvec(SIGTSTP, (sigvec_t *) 0, &(sv)[2]), \ 158: mysigvec(SIGTTIN, (sigvec_t *) 0, &(sv)[3]), \ 159: mysigvec(SIGTTOU, (sigvec_t *) 0, &(sv)[4]), \ 160: mysigvec(SIGTERM, (sigvec_t *) 0, &(sv)[5]), \ 161: mysigvec(SIGHUP, (sigvec_t *) 0, &(sv)[6]), \ 162: sigblock(sigmask(SIGINT) | sigmask(SIGQUIT) | \ 163: sigmask(SIGTSTP) | sigmask(SIGTTIN) | \ 164: sigmask(SIGTTOU) | sigmask(SIGTERM) | \ 165: sigmask(SIGHUP))) 166: 167: # define restoresigvec(sv, sm) \ 168: (void) (mysigvec(SIGINT, &(sv)[0], (sigvec_t *) 0), \ 169: mysigvec(SIGQUIT, &(sv)[1], (sigvec_t *) 0), \ 170: mysigvec(SIGTSTP, &(sv)[2], (sigvec_t *) 0), \ 171: mysigvec(SIGTTIN, &(sv)[3], (sigvec_t *) 0), \ 172: mysigvec(SIGTTOU, &(sv)[4], (sigvec_t *) 0), \ 173: mysigvec(SIGTERM, &(sv)[5], (sigvec_t *) 0), \ 174: mysigvec(SIGHUP, &(sv)[6], (sigvec_t *) 0), \ 175: sigsetmask(sm)) 176: # endif /* SAVESIGVEC */ 177: 178: #endif /* _h_tc_sig */