summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2022-02-07 19:14:02 +0100
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2022-07-18 17:21:49 +0200
commit00fa8256b5c9b3ccbccbdfa8026bce2efd66d630 (patch)
tree02d2f5e1d4ddea4dd839444fbf269aebb4b2fa05 /common
parent085cbdafca9c3d7bc2f27523a343f61db82f2ccb (diff)
cli: support bracketed paste
Some consoles use CSI 200~ and CSI 201~ to bracket inserts. This leads U-Boot to misinterpret the inserted string. Ignore these escape sequences. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Diffstat (limited to 'common')
-rw-r--r--common/cli_readline.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/common/cli_readline.c b/common/cli_readline.c
index c7614a4c90..e86ee73faf 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -321,6 +321,7 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
act = ESC_CONVERTED;
break; /* pass off to ^N handler */
case '1':
+ case '2':
case '3':
case '4':
case '7':
@@ -332,7 +333,8 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
break;
}
} else if (esc_len == 3) {
- if (ichar == '~') {
+ switch (ichar) {
+ case '~':
switch (esc_save[2]) {
case '3': /* Delete key */
ichar = CTL_CH('d');
@@ -349,9 +351,25 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
act = ESC_CONVERTED;
break; /* pass to ^E handler */
}
+ break;
+ case '0':
+ if (esc_save[2] == '2')
+ act = ESC_SAVE;
+ break;
+ }
+ } else if (esc_len == 4) {
+ switch (ichar) {
+ case '0':
+ case '1':
+ act = ESC_SAVE;
+ break; /* bracketed paste */
+ }
+ } else if (esc_len == 5) {
+ if (ichar == '~') { /* bracketed paste */
+ ichar = 0;
+ act = ESC_CONVERTED;
}
}
-
switch (act) {
case ESC_SAVE:
esc_save[esc_len++] = ichar;