Fix more to not append an extra newline.

More's sigatexit handler needs to distinguish between normal exit and exit
due to receipt of a signal.

Change tty_sigreset to look at the signal number too, so that pressing 'q'
to exit top doesn't cause its exit status to be 128.
This commit is contained in:
Elliott Hughes 2016-04-21 18:18:05 -07:00 committed by Rob Landley
parent 63eae53701
commit 072ea41682
3 changed files with 9 additions and 2 deletions

View File

@ -239,5 +239,5 @@ void tty_reset(void)
void tty_sigreset(int i)
{
tty_reset();
_exit(128+i);
_exit(i ? 128+i : 0);
}

View File

@ -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));
}

View File

@ -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);