- Catch SIGHUP to perform cleanup before exiting.

- Exit if getch() returns with an error other than EINTR. Otherwise
  systat(1) may get stuck in an infinite loop if it doesn't receive
  SIGHUP when terminal closes. [1]
- Remove attempt to clear stdio error indicators. getch() doesn't use
  stdio, making it useless. [2]
- Remove unneeded masking of getch() return value. [2]

PR:		bin/107171
Reviewed by:	bde
Approved by:	trasz (mentor)
Obtained from:	OpenBSD [1]
Suggested by:	bde [2]
MFC after:	1 month
This commit is contained in:
Jaakko Heinonen 2009-10-11 12:32:25 +00:00
parent f71e78a1d9
commit c2dbb0de27
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=197956
2 changed files with 8 additions and 4 deletions

View File

@ -39,8 +39,10 @@ __FBSDID("$FreeBSD$");
static const char sccsid[] = "@(#)keyboard.c 8.1 (Berkeley) 6/6/93";
#endif
#include <errno.h>
#include <ctype.h>
#include <signal.h>
#include <stdlib.h>
#include <termios.h>
#include "systat.h"
@ -57,10 +59,11 @@ keyboard(void)
move(CMDLINE, 0);
do {
refresh();
ch = getch() & 0177;
if (ch == 0177 && ferror(stdin)) {
clearerr(stdin);
continue;
ch = getch();
if (ch == ERR) {
if (errno == EINTR)
continue;
exit(1);
}
if (ch >= 'A' && ch <= 'Z')
ch += 'a' - 'A';

View File

@ -133,6 +133,7 @@ main(int argc, char **argv)
exit(1);
}
}
signal(SIGHUP, die);
signal(SIGINT, die);
signal(SIGQUIT, die);
signal(SIGTERM, die);