aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/interestingtimes.c2
-rw-r--r--lib/xwrap.c4
-rw-r--r--toys/pending/more.c5
3 files changed, 9 insertions, 2 deletions
diff --git a/lib/interestingtimes.c b/lib/interestingtimes.c
index 8337ce8b..62670cbb 100644
--- a/lib/interestingtimes.c
+++ b/lib/interestingtimes.c
@@ -239,5 +239,5 @@ void tty_reset(void)
void tty_sigreset(int i)
{
tty_reset();
- _exit(128+i);
+ _exit(i ? 128+i : 0);
}
diff --git a/lib/xwrap.c b/lib/xwrap.c
index 0b1ab8e9..36a601c5 100644
--- a/lib/xwrap.c
+++ b/lib/xwrap.c
@@ -47,7 +47,9 @@ void xexit(void)
// Call toys.xexit functions in reverse order added.
while (toys.xexit) {
// This is typecasting xexit->arg to a function pointer,then calling it.
- ((void (*)(void))(toys.xexit->arg))();
+ // Using the invalid signal number 0 lets the signal handlers distinguish
+ // an actual signal from a regular exit.
+ ((void (*)(int))(toys.xexit->arg))(0);
free(llist_pop(&toys.xexit));
}
diff --git a/toys/pending/more.c b/toys/pending/more.c
index 59b5c615..7923ee4e 100644
--- a/toys/pending/more.c
+++ b/toys/pending/more.c
@@ -25,7 +25,12 @@ GLOBALS(
static void signal_handler(int sig)
{
+ // Reset the terminal whether we were signalled or exited normally.
tcsetattr(TT.cin_fd, TCSANOW, &TT.inf);
+
+ if (sig == 0) _exit(0);
+
+ // We were actually signalled, so move to a new line and re-raise the signal.
xputc('\n');
signal(sig, SIG_DFL);
raise(sig);