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