1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* $NetBSD: trap.c,v 1.31 2005/01/11 19:38:57 christos Exp $ */ 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*- 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1991, 1993 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The Regents of the University of California. All rights reserved. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist. 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * documentation and/or other materials provided with the distribution. 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * may be used to endorse or promote products derived from this software 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * without specific prior written permission. 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/cdefs.h> 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef lint 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char sccsid[] = "@(#)trap.c 8.5 (Berkeley) 6/5/95"; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: trap.c,v 1.31 2005/01/11 19:38:57 christos Exp $"); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* not lint */ 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <signal.h> 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h" 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "main.h" 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "nodes.h" /* for other headers */ 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "eval.h" 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "jobs.h" 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "show.h" 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "options.h" 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "syntax.h" 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h" 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h" 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h" 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "trap.h" 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h" 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "var.h" 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Sigmode records the current value of the signal handlers for the various 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modes. A value of zero means that the current handler is not known. 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * S_HARD_IGN indicates that the signal was ignored on entry to the shell, 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define S_DFL 1 /* default signal handling (SIG_DFL) */ 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define S_CATCH 2 /* signal is caught */ 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define S_IGN 3 /* signal is ignored (SIG_IGN) */ 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define S_HARD_IGN 4 /* signal is ignored permenantly */ 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define S_RESET 5 /* temporary - to reset a hard ignored sig */ 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *trap[NSIG+1]; /* trap handler commands */ 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectMKINIT char sigmode[NSIG]; /* current value of signal */ 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar gotsig[NSIG]; /* indicates specified signal received */ 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint pendingsigs; /* indicates some signal received */ 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int getsigaction(int, sig_t *); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * return the signal number described by `p' (as a number or a name) 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * or -1 if it isn't one 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsigname_to_signum(const char *p) 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_number(p)) 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return number(p); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strcasecmp(p, "exit") == 0 ) 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strncasecmp(p, "sig", 3) == 0) 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p += 3; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 0; i < NSIG; ++i) 1038d758271d4c4ec72e645691a4b9df18014b5aef1Dima Zavin if (sys_signame[i] && (strcasecmp (p, sys_signame[i]) == 0)) 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return i; 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Print a list of valid signal names 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprintsignals(void) 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1str("EXIT "); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (n = 1; n < NSIG; n++) { 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("%s", sys_signame[n]); 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((n == NSIG/2) || n == (NSIG - 1)) 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1str("\n"); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1c(' '); 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The trap builtin. 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttrapcmd(int argc, char **argv) 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *action; 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **ap; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int signo; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc <= 1) { 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (signo = 0 ; signo <= NSIG ; signo++) 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (trap[signo] != NULL) { 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt("trap -- "); 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project print_quoted(trap[signo]); 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project out1fmt(" %s\n", 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (signo) ? sys_signame[signo] : "EXIT"); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ap = argv + 1; 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = NULL; 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strcmp(*ap, "--") == 0) 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*++ap == NULL) 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (signame_to_signum(*ap) == -1) { 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((*ap)[0] == '-') { 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((*ap)[1] == '\0') 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ap++; 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if ((*ap)[1] == 'l' && (*ap)[2] == '\0') { 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printsignals(); 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("bad option %s\n", *ap); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = *ap++; 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (*ap) { 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (is_number(*ap)) 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project signo = number(*ap); 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project signo = signame_to_signum(*ap); 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (signo < 0 || signo > NSIG) 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error("%s: bad trap", *ap); 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTOFF; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (action) 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = savestr(action); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (trap[signo]) 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ckfree(trap[signo]); 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project trap[signo] = action; 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (signo != 0) 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsignal(signo, 0); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTON; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ap++; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Clear traps on a fork or vfork. 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Takes one arg vfork, to tell it to not be destructive of 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the parents variables. 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclear_traps(int vforked) 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **tp; 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (tp = trap ; tp <= &trap[NSIG] ; tp++) { 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*tp && **tp) { /* trap not NULL or SIG_IGN */ 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTOFF; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!vforked) { 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ckfree(*tp); 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *tp = NULL; 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tp != &trap[0]) 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsignal(tp - trap, vforked); 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project INTON; 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Set the signal handler for the specified signal. The routine figures 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * out what it should be set to. 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlong 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetsignal(int signo, int vforked) 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int action; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sig_t sigact = SIG_DFL; 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sigaction act, oact; 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *t, tsig; 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((t = trap[signo]) == NULL) 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = S_DFL; 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (*t != '\0') 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = S_CATCH; 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = S_IGN; 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (rootshell && !vforked && action == S_DFL) { 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (signo) { 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SIGINT: 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (iflag || minusc || sflag == 0) 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = S_CATCH; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SIGQUIT: 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef DEBUG 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (debug) 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* FALLTHROUGH */ 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SIGTERM: 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (iflag) 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = S_IGN; 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if JOBS 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SIGTSTP: 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SIGTTOU: 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (mflag) 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project action = S_IGN; 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t = &sigmode[signo - 1]; 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tsig = *t; 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tsig == 0) { 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * current setting unknown 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!getsigaction(signo, &sigact)) { 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Pretend it worked; maybe we should give a warning 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * here, but other shells don't. We don't alter 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * sigmode, so that we retry every time. 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sigact == SIG_IGN) { 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (mflag && (signo == SIGTSTP || 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project signo == SIGTTIN || signo == SIGTTOU)) { 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tsig = S_IGN; /* don't hard ignore these */ 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tsig = S_HARD_IGN; 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tsig = S_RESET; /* force to be set */ 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tsig == S_HARD_IGN || tsig == action) 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (action) { 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case S_DFL: sigact = SIG_DFL; break; 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case S_CATCH: sigact = onsig; break; 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case S_IGN: sigact = SIG_IGN; break; 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!vforked) 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *t = action; 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project act.sa_handler = sigact; 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sigemptyset(&act.sa_mask); 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project act.sa_flags = 0; 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef SA_INTERRUPT 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project act.sa_flags |= SA_INTERRUPT; 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(sigaction(signo, &act, &oact) < 0) 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (long) SIG_ERR; 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (long) oact.sa_handler; 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Return the current setting for sig w/o changing it. 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetsigaction(int signo, sig_t *sigact) 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sigaction sa; 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sigaction(signo, (struct sigaction *)0, &sa) == -1) 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *sigact = (sig_t) sa.sa_handler; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Ignore a signal. 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectignoresig(int signo, int vforked) 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sigmode[signo - 1] != S_IGN && sigmode[signo - 1] != S_HARD_IGN) 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bsd_signal(signo, SIG_IGN); 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!vforked) 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sigmode[signo - 1] = S_HARD_IGN; 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef mkinit 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectINCLUDE <signal.h> 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectINCLUDE "trap.h" 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSHELLPROC { 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *sm; 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project clear_traps(0); 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (sm = sigmode ; sm < sigmode + NSIG ; sm++) { 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (*sm == S_IGN) 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *sm = S_HARD_IGN; 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Signal handler. 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectonsig(int signo) 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project bsd_signal(signo, onsig); 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (signo == SIGINT && trap[SIGINT] == NULL) { 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project onint(); 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gotsig[signo - 1] = 1; 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pendingsigs++; 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Called to execute a trap. Perhaps we should avoid entering new trap 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * handlers while we are executing a trap handler. 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdotrap(void) 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int savestatus; 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (;;) { 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 1 ; ; i++) { 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gotsig[i - 1]) 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (i >= NSIG) 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto done; 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gotsig[i - 1] = 0; 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project savestatus=exitstatus; 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project evalstring(trap[i], 0); 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exitstatus=savestatus; 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdone: 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pendingsigs = 0; 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Controls whether the shell is interactive or not. 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetinteractive(int on) 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static int is_interactive; 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (on == is_interactive) 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsignal(SIGINT, 0); 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsignal(SIGQUIT, 0); 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setsignal(SIGTERM, 0); 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_interactive = on; 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Called to exit the shell. 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectexitshell(int status) 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct jmploc loc1, loc2; 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project TRACE(("pid %d, exitshell(%d)\n", getpid(), status)); 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (setjmp(loc1.loc)) { 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto l1; 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (setjmp(loc2.loc)) { 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto l2; 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project handler = &loc1; 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((p = trap[0]) != NULL && *p != '\0') { 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project trap[0] = NULL; 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project evalstring(p, 0); 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectl1: handler = &loc2; /* probably unnecessary */ 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flushall(); 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if JOBS 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setjobctl(0); 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectl2: _exit(status); 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* NOTREACHED */ 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 457