bin/107171: [patch] systat(1) doesn't die when it's xterm is killed while it's running

Jaakko Heinonen jh at saunalahti.fi
Sat Jan 26 21:50:02 UTC 2008


The following reply was made to PR bin/107171; it has been noted by GNATS.

From: Jaakko Heinonen <jh at saunalahti.fi>
To: bug-followup at FreeBSD.org, josh at tcbug.org
Cc:  
Subject: Re: bin/107171: [patch] systat(1) doesn't die when it's xterm is
	killed while it's running
Date: Sat, 26 Jan 2008 23:25:35 +0200

 --T4sUOijqQbZv57TR
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 
 Here's an updated patch against HEAD. I took the keyboard.c snippet from
 OpenBSD and added a signal handling for SIGHUP in main.c.
 
 
 --T4sUOijqQbZv57TR
 Content-Type: text/x-diff; charset=us-ascii
 Content-Disposition: attachment; filename="systat-hang-on-getch-loop-fix.patch"
 
 Index: main.c
 ===================================================================
 RCS file: /home/ncvs/src/usr.bin/systat/main.c,v
 retrieving revision 1.21
 diff -u -r1.21 main.c
 --- main.c	16 Jan 2008 19:27:43 -0000	1.21
 +++ main.c	26 Jan 2008 21:01:28 -0000
 @@ -136,6 +136,7 @@
  	signal(SIGINT, die);
  	signal(SIGQUIT, die);
  	signal(SIGTERM, die);
 +	signal(SIGHUP, die);
  
  	/*
  	 * Initialize display.  Load average appears in a one line
 Index: keyboard.c
 ===================================================================
 RCS file: /home/ncvs/src/usr.bin/systat/keyboard.c,v
 retrieving revision 1.3
 diff -u -r1.3 keyboard.c
 --- keyboard.c	16 Jan 2008 19:27:43 -0000	1.3
 +++ keyboard.c	26 Jan 2008 21:01:28 -0000
 @@ -39,6 +39,7 @@
  static const char sccsid[] = "@(#)keyboard.c	8.1 (Berkeley) 6/6/93";
  #endif
  
 +#include <errno.h>
  #include <ctype.h>
  #include <signal.h>
  #include <termios.h>
 @@ -57,7 +58,12 @@
                  move(CMDLINE, 0);
                  do {
                          refresh();
 -                        ch = getch() & 0177;
 +                        if ((ch = getch()) == ERR) {
 +                                if (errno == EINTR)
 +                                        continue;
 +                                exit(1);
 +                        }
 +                        ch &= 0177;
                          if (ch == 0177 && ferror(stdin)) {
                                  clearerr(stdin);
                                  continue;
 
 --T4sUOijqQbZv57TR--


More information about the freebsd-bugs mailing list