From 5b914591c663dee799fe4f205516d7fc3e2766cc Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 18 Dec 2009 20:18:30 +0000 Subject: [PATCH] 2009-12-18 Joel Sherrill * libmisc/shell/login_prompt.c: Switch from non-canonical mode with timeout (Case C) to blocking IO waiting for single character on login. In Case C mode, you cannot tell EOF from no data available. This means we cannot tell when a telnet connection is dropped. This was changed from 4.9 and resulted in breakage. --- cpukit/ChangeLog | 8 ++++++++ cpukit/libmisc/shell/login_prompt.c | 23 +++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 32120f3502..5215c144cc 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,11 @@ +2009-12-18 Joel Sherrill + + * libmisc/shell/login_prompt.c: Switch from non-canonical mode with + timeout (Case C) to blocking IO waiting for single character on + login. In Case C mode, you cannot tell EOF from no data available. + This means we cannot tell when a telnet connection is dropped. This + was changed from 4.9 and resulted in breakage. + 2009-12-01 Sebastian Huber PR 1474 diff --git a/cpukit/libmisc/shell/login_prompt.c b/cpukit/libmisc/shell/login_prompt.c index d277b7f0d5..5c684141d7 100644 --- a/cpukit/libmisc/shell/login_prompt.c +++ b/cpukit/libmisc/shell/login_prompt.c @@ -111,18 +111,18 @@ static bool rtems_shell_get_text( return false; case '\n': case '\r': - put( '\n', out); + put('\n', out); line [i] = '\0'; return true; case 127: case '\b': if (i > 0) { - put( '\b', out); - put( ' ', out); - put( '\b', out); + put('\b', out); + put(' ', out); + put('\b', out); --i; } else { - put( '\a', out); + put('\a', out); } break; default: @@ -132,10 +132,10 @@ static bool rtems_shell_get_text( ++i; put( c, out); } else { - put( '\a', out); + put('\a', out); } } else { - put( '\a', out); + put('\a', out); } break; } @@ -159,10 +159,13 @@ bool rtems_shell_login_prompt( if (tcgetattr( fd_in, &termios_previous) == 0) { struct termios termios_new = termios_previous; + /* + * Stay in canonical mode so we can tell EOF and dropped connections. + * But read one character at a time and do not echo it. + */ termios_new.c_lflag &= (unsigned char) ~ECHO; - termios_new.c_lflag &= (unsigned char) ~ICANON; - termios_new.c_cc [VTIME] = 255; - termios_new.c_cc [VMIN] = 0; + termios_new.c_cc [VTIME] = 0; + termios_new.c_cc [VMIN] = 1; restore_termios = tcsetattr( fd_in, TCSANOW, &termios_new) == 0; }