diff options
-rw-r--r-- | cpukit/ChangeLog | 8 | ||||
-rw-r--r-- | 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 <joel.sherrill@oarcorp.com> + + * 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 <sebastian.huber@embedded-brains.de> 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; } |