sh: Make exit without parameters from EXIT trap POSIX-compliant.
It should use the original exit status, just like falling off the end of the trap handler. Outside an EXIT trap, 'exit' is still equivalent to 'exit $?'.
This commit is contained in:
parent
2801f33bda
commit
3a61afec3c
@ -341,10 +341,7 @@ exitcmd(int argc, char **argv)
|
||||
if (stoppedjobs())
|
||||
return 0;
|
||||
if (argc > 1)
|
||||
exitstatus = number(argv[1]);
|
||||
exitshell(number(argv[1]));
|
||||
else
|
||||
exitstatus = oexitstatus;
|
||||
exitshell(exitstatus);
|
||||
/*NOTREACHED*/
|
||||
return 0;
|
||||
exitshell_savedstatus();
|
||||
}
|
||||
|
@ -80,6 +80,9 @@ static volatile sig_atomic_t gotsig[NSIG];
|
||||
static int ignore_sigchld; /* Used while handling SIGCHLD traps. */
|
||||
volatile sig_atomic_t gotwinch;
|
||||
|
||||
static int exiting; /* exitshell() has been called */
|
||||
static int exiting_exitstatus; /* value passed to exitshell() */
|
||||
|
||||
static int getsigaction(int, sig_t *);
|
||||
|
||||
|
||||
@ -477,11 +480,22 @@ setinteractive(int on)
|
||||
*/
|
||||
void
|
||||
exitshell(int status)
|
||||
{
|
||||
TRACE(("exitshell(%d) pid=%d\n", status, getpid()));
|
||||
exiting = 1;
|
||||
exiting_exitstatus = status;
|
||||
exitshell_savedstatus();
|
||||
}
|
||||
|
||||
void
|
||||
exitshell_savedstatus(void)
|
||||
{
|
||||
struct jmploc loc1, loc2;
|
||||
char *p;
|
||||
|
||||
TRACE(("exitshell(%d) pid=%d\n", status, getpid()));
|
||||
if (!exiting)
|
||||
exiting_exitstatus = oexitstatus;
|
||||
exitstatus = oexitstatus = exiting_exitstatus;
|
||||
if (setjmp(loc1.loc)) {
|
||||
goto l1;
|
||||
}
|
||||
@ -498,5 +512,5 @@ l1: handler = &loc2; /* probably unnecessary */
|
||||
#if JOBS
|
||||
setjobctl(0);
|
||||
#endif
|
||||
l2: _exit(status);
|
||||
l2: _exit(exiting_exitstatus);
|
||||
}
|
||||
|
@ -46,3 +46,4 @@ void onsig(int);
|
||||
void dotrap(void);
|
||||
void setinteractive(int);
|
||||
void exitshell(int) __dead2;
|
||||
void exitshell_savedstatus(void) __dead2;
|
||||
|
5
tools/regression/bin/sh/builtins/exit3.0
Normal file
5
tools/regression/bin/sh/builtins/exit3.0
Normal file
@ -0,0 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
# exit without arguments differs from exit $? in an EXIT trap.
|
||||
|
||||
trap 'false; exit' 0
|
Loading…
x
Reference in New Issue
Block a user