[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[50 character or so descriptive subject here (for reference)]
From: |
Martin Flack |
Subject: |
[50 character or so descriptive subject here (for reference)] |
Date: |
Thu, 1 Mar 2001 00:10:41 -0500 |
Configuration Information [Automatically generated, do not change]:
Machine: i386
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='i386'
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i386-redhat-linux-gnu'
-DCONF_VENDOR='redhat' -DSHELL -DHAVE_CONFIG_H -D_GNU_SOURCE
-D_FILE_OFFSET_BITS=64 -I. -I. -I./include -I./lib -I/usr/include -O2
-march=i386 -mcpu=i686
uname output: Linux solvent 2.2.17-14 #1 Mon Feb 5 16:02:20 EST 2001 i686
unknown
Machine Type: i386-redhat-linux-gnu
Bash Version: 2.04
Patch Level: 11
Release Status: release
Description:
Red Hat Linux (and I suppose many other UNIX/Linux
configurations) disallows root login by telnet, and requires you to
login as a regular user and su to root. I frequently have telnet
connections open where I am running two levels of bash in this way. To
exit out when I'm finished working as root and finished altogether
with that host, I frequently hit CTRL+D CTRL+D in rapid succession,
since that will bring me out of both shells and close the
connection. Unfortunately, if I have emacs, mysql, ftp or some other
program(s) suspended via job control in my root session, I often blow
right past the "There are stoppped jobs" warning message due to my
reflex of hitting CTRL+D twice. I end up at the first shell prompt
thinking "oops".
Repeat-By:
Simple: just login, su, start a program, suspend it, and hit
CTRL+D CTRL+D.
Fix:
I humbly submit a patch I wrote up for my local Red Hat Linux
7.0 system that will add a one second delay to the stopped jobs
message, and then flush the input buffer. A one second delay adds no
inconvenience, and I venture to guess that most users receive this
particular message when they're not expecting to, and pause to think
for a second anyway. The patch is below. This is my first
suggestion/contribution to an open source project so (kind) criticism
is welcome. :-) My only reservation is that termios.h might not be the
same header file outside of the Linux world, i.e. on other unixen, but
I have no idea so I leave that issue to wiser folk.
Cheers!
- Martin Flack, martin@neoreality.com
diff -u bash-2.04-orig/builtins/exit.def bash-2.04/builtins/exit.def
--- bash-2.04-orig/builtins/exit.def Thu Aug 5 07:42:05 1999
+++ bash-2.04/builtins/exit.def Sat Feb 24 13:09:14 2001
@@ -32,6 +32,7 @@
#include "../bashtypes.h"
#include <stdio.h>
+#include <termios.h>
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
@@ -106,6 +107,23 @@
if (jobs[i] && STOPPED (i))
{
fprintf (stderr, "There are stopped jobs.\n");
+
+ /* Pause & flush input. Because of the popularity of
+ disallowing remote root login and encouraging the login
+ as a regular user followed by an su, it is easy to hit
+ CTRL+D CTRL+D to quickly end one's su'd+normal
+ sessions; except that when there are stopped jobs on
+ the first session, the second CTRL+D (usually hit in
+ rapid succession) blows past the message. Since we like
+ the ability to ignore the message when we choose, but
+ we don't like blowing past it, we should pause to make
+ sure the user sees the message and then kill the input
+ to get rid of any subsequent CTRL+D's he/she has hit.
+ MTF 2001/2/23 */
+ if (isatty(fileno(stdin))) { /* don't mess with non-tty's */
+ sleep(1); /* may need to be 2 for slower peeps :-) */
+ tcflush (fileno(stdin), TCIFLUSH);
+ }
/* This is NOT superfluous because EOF can get here without
going through the command parser. Set both last and this
- [50 character or so descriptive subject here (for reference)],
Martin Flack <=