[PATCH v2] common: cli_hush: terminate all commands when Ctrl-C is pressed
Shiji Yang
yangshiji66 at outlook.com
Sun Dec 28 12:03:49 CET 2025
Check Ctrl-C status before executing each command in the pipeline so
that the Ctrl-C can skip all subsequent commands. in the meantime, we
need to clear the ctrlc status at the end of a pipeline. This should
be the default behavior of most shell parsers.
Before the change:
```
=> echo start; while true; do echo loop; sleep 1; done; echo int; if true; then echo if; fi; echo stop
start
loop
loop <-- Input Ctrl-C
int
if
stop
=>
```
After the change:
```
=> echo start; while true; do echo loop; sleep 1; done; echo int; if true; then echo if; fi; echo stop
start
loop
loop <-- Input Ctrl-C
^C
=>
```
Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
---
v1 --> v2:
- use puts() instead of printf()
- only clear Ctrl-C status when one pipe reaches the end
common/cli_hush.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/common/cli_hush.c b/common/cli_hush.c
index 7bd6943d3ed..3f6adc01934 100644
--- a/common/cli_hush.c
+++ b/common/cli_hush.c
@@ -1792,16 +1792,15 @@ static int run_list_real(struct pipe *pi)
}
}
for (; pi; pi = (flag_restore != 0) ? rpipe : pi->next) {
- if (pi->r_mode == RES_WHILE || pi->r_mode == RES_UNTIL ||
- pi->r_mode == RES_FOR) {
#ifdef __U_BOOT__
- /* check Ctrl-C */
- ctrlc();
- if ((had_ctrlc())) {
- return 1;
- }
+ /* check Ctrl-C */
+ ctrlc();
+ if (had_ctrlc())
+ return 1;
#endif
- flag_restore = 0;
+ if (pi->r_mode == RES_WHILE || pi->r_mode == RES_UNTIL ||
+ pi->r_mode == RES_FOR) {
+ flag_restore = 0;
if (!rpipe) {
flag_rep = 0;
rpipe = pi;
@@ -3207,6 +3206,11 @@ static int parse_stream_outer(struct in_str *inp, int flag)
run_list(ctx.list_head);
#else
code = run_list(ctx.list_head);
+ /* clear Ctrl-C status when one pipe reaches the end */
+ if (had_ctrlc() && !(flag & FLAG_REPARSING)) {
+ puts("^C\n");
+ clear_ctrlc();
+ }
if (code == -2) { /* exit */
b_free(&temp);
code = 0;
--
2.51.0
More information about the U-Boot
mailing list