aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
Diffstat (limited to 'libbb')
-rw-r--r--libbb/lineedit.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index c44a22843..f65e852b1 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1259,7 +1259,7 @@ static void win_changed(int nsig)
* 0 on ctrl-C,
* >0 length of input string, including terminating '\n'
*/
-int read_line_input(const char* prompt, char* command, int maxsize, line_input_t *st)
+int read_line_input(const char *prompt, char *command, int maxsize, line_input_t *st)
{
int lastWasTab = FALSE;
unsigned int ic;
@@ -1270,6 +1270,15 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t
smalluint prevc;
#endif
+ getTermSettings(0, (void *) &initial_settings);
+ /* Happens when e.g. stty -echo was run before */
+ if (!(initial_settings.c_lflag & ECHO)) {
+ parse_prompt(prompt);
+ fflush(stdout);
+ fgets(command, maxsize, stdin);
+ return strlen(command);
+ }
+
// FIXME: audit & improve this
if (maxsize > MAX_LINELEN)
maxsize = MAX_LINELEN;
@@ -1287,7 +1296,6 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t
command_ps = command;
command[0] = '\0';
- getTermSettings(0, (void *) &initial_settings);
memcpy(&new_settings, &initial_settings, sizeof(new_settings));
new_settings.c_lflag &= ~ICANON; /* unbuffered input */
/* Turn off echoing and CTRL-C, so we can trap it */