diff options
-rw-r--r-- | shell/ash.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/shell/ash.c b/shell/ash.c index dfe6d1c..fbe8dd9 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -14284,11 +14284,11 @@ read_profile(const char *name) /* * This routine is called when an error or an interrupt occurs in an - * interactive shell and control is returned to the main command loop. - * (In dash, this function is auto-generated by build machinery). + * interactive shell and control is returned to the main command loop + * but prior to exitshell. */ static void -reset(void) +exitreset(void) { /* from eval.c: */ evalskip = 0; @@ -14301,14 +14301,23 @@ reset(void) /* from expand.c: */ ifsfree(); + /* from redir.c: */ + unwindredir(NULL); +} + +/* + * This routine is called when an error or an interrupt occurs in an + * interactive shell and control is returned to the main command loop. + * (In dash, this function is auto-generated by build machinery). + */ +static void +reset(void) +{ /* from input.c: */ g_parsefile->left_in_buffer = 0; g_parsefile->left_in_line = 0; /* clear input buffer */ popallfiles(); - /* from redir.c: */ - unwindredir(NULL); - /* from var.c: */ unwindlocalvars(NULL); } @@ -14356,13 +14365,16 @@ int ash_main(int argc UNUSED_PARAM, char **argv) smallint e; smallint s; - reset(); + exitreset(); e = exception_type; s = state; if (e == EXEXIT || s == 0 || iflag == 0 || shlvl) { exitshell(); } + + reset(); + if (e == EXINT) { newline_and_flush(stderr); } |