read_line_input: fix it to not do any fancy editing if echoing is disabled.
ash: make read handling both more correct and smaller
read_line_input 4037 4101 +64
input_backward 140 139 -1
readcmd 1079 1070 -9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/2 up/down: 65/-10) Total: 54 bytes
text data bss dec hex filename
777575 1000 9532 788107 c068b busybox_old
777629 1000 9532 788161 c06c1 busybox_unstripped
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index c44a228..f65e852 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1259,7 +1259,7 @@
* 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 @@
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 @@
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 */