ash,hush: make ^C in interactive mode visually much closer to bash behavior
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 25 Nov 2016 02:41:03 +0000 (03:41 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 25 Nov 2016 02:41:03 +0000 (03:41 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/lineedit.c
shell/ash.c
shell/hush.c

index ac049f57d9bc7027e8b92dc0a4df8ddf5954ffba..4d7828cfa2efae3e320c7cac03a2205c9c4c663f 100644 (file)
@@ -2251,6 +2251,7 @@ static int32_t reverse_i_search(void)
  * Returns:
  * -1 on read errors or EOF, or on bare Ctrl-D,
  * 0  on ctrl-C (the line entered is still returned in 'command'),
+ * (in both cases the cursor remains on the input line, '\n' is not printed)
  * >0 length of input string, including terminating '\n'
  */
 int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *command, int maxsize, int timeout)
@@ -2686,7 +2687,6 @@ int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *comman
                         && ic_raw == initial_settings.c_cc[VINTR]
                        ) {
                                /* Ctrl-C (usually) - stop gathering input */
-                               goto_new_line();
                                command_len = 0;
                                break_out = -1; /* "do not append '\n'" */
                                break;
index 3e5a3b3e9ec5c9774fc1e8c412d0beebd199b000..2bdb4aad78f68950740b167fc1d0255efebf39db 100644 (file)
@@ -9869,7 +9869,8 @@ preadfd(void)
                reinit_unicode_for_ash();
                nr = read_line_input(line_input_state, cmdedit_prompt, buf, IBUFSIZ, timeout);
                if (nr == 0) {
-                       /* Ctrl+C pressed */
+                       /* ^C pressed, "convert" to SIGINT */
+                       write(STDOUT_FILENO, "^C", 2);
                        if (trap[SIGINT]) {
                                buf[0] = '\n';
                                buf[1] = '\0';
@@ -9877,6 +9878,7 @@ preadfd(void)
                                return 1;
                        }
                        exitstatus = 128 + SIGINT;
+                       bb_putchar('\n');
                        goto retry;
                }
                if (nr < 0) {
index 5b720ce98921387f66edc9f02cb844e73cbbb509..bcd4dffee07c6824b090329bfcaaa165deb8057f 100644 (file)
@@ -1756,8 +1756,6 @@ static int check_and_run_traps(void)
                switch (sig) {
                case SIGINT:
                        debug_printf_exec("%s: sig:%d default SIGINT handler\n", __func__, sig);
-                       /* Builtin was ^C'ed, make it look prettier: */
-                       bb_putchar('\n');
                        G.flag_SIGINT = 1;
                        last_sig = sig;
                        break;
@@ -2195,16 +2193,22 @@ static int get_user_input(struct in_str *i)
 # if ENABLE_FEATURE_EDITING
        for (;;) {
                reinit_unicode_for_hush();
-               G.flag_SIGINT = 0;
+               if (G.flag_SIGINT) {
+                       /* There was ^C'ed, make it look prettier: */
+                       bb_putchar('\n');
+                       G.flag_SIGINT = 0;
+               }
                /* buglet: SIGINT will not make new prompt to appear _at once_,
-                * only after <Enter>. (^C will work) */
+                * only after <Enter>. (^C works immediately) */
                r = read_line_input(G.line_input_state, prompt_str,
                                G.user_input_buf, CONFIG_FEATURE_EDITING_MAX_LEN-1,
                                /*timeout*/ -1
                );
-               /* read_line_input intercepts ^C, "convert" it into SIGINT */
-               if (r == 0)
+               /* read_line_input intercepts ^C, "convert" it to SIGINT */
+               if (r == 0) {
+                       write(STDOUT_FILENO, "^C", 2);
                        raise(SIGINT);
+               }
                check_and_run_traps();
                if (r != 0 && !G.flag_SIGINT)
                        break;
@@ -2232,6 +2236,7 @@ static int get_user_input(struct in_str *i)
                        fputs(prompt_str, stdout);
                }
                fflush_all();
+//FIXME: here ^C or SIGINT will have effect only after <Enter>
                r = fgetc(i->file);
                /* In !ENABLE_FEATURE_EDITING we don't use read_line_input,
                 * no ^C masking happens during fgetc, no special code for ^C: