summaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/exec.c b/exec.c
index 6e90263..b9a1087 100644
--- a/exec.c
+++ b/exec.c
@@ -4,6 +4,8 @@
#include <errno.h>
#include <signal.h>
+#include <termios.h>
+#include <unistd.h>
#include "wait.h"
@@ -19,6 +21,7 @@ extern void exec(List *s, bool parent) {
builtin_t *b;
char *path = NULL;
bool didfork, returning, saw_exec, saw_builtin;
+ struct termios t;
av = list2array(s, dashex);
saw_builtin = saw_exec = FALSE;
do {
@@ -68,6 +71,8 @@ extern void exec(List *s, bool parent) {
must fork no matter what.
*/
if ((parent && (b == NULL || redirq != NULL)) || outstanding_cmdarg()) {
+ if (interactive)
+ tcgetattr(0, &t);
pid = rc_fork();
didfork = TRUE;
} else {
@@ -110,6 +115,8 @@ extern void exec(List *s, bool parent) {
default:
redirq = NULL;
rc_wait4(pid, &stat, TRUE);
+ if (interactive && WIFSIGNALED(stat))
+ tcsetattr(0, TCSANOW, &t);
setstatus(-1, stat);
/*
There is a very good reason for having this weird