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.
This commit is contained in:
Joel Sherrill
2009-12-18 20:18:30 +00:00
parent 1e0a5512fc
commit 5b914591c6
2 changed files with 21 additions and 10 deletions

View File

@@ -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

View File

@@ -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;
}