aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-04-13 13:13:01 +0100
committerRon Yorston <rmy@pobox.com>2020-04-13 13:35:49 +0100
commit026bf90b29314486d64f93c0633dffda8ac58379 (patch)
tree3624c2be4bae9038eeaf49c5e80ceef5030d1390
parent10e14d5ebdfdfe3acd1cd60692d9cffd07de04e2 (diff)
downloadbusybox-w32-026bf90b29314486d64f93c0633dffda8ac58379.tar.gz
busybox-w32-026bf90b29314486d64f93c0633dffda8ac58379.tar.bz2
busybox-w32-026bf90b29314486d64f93c0633dffda8ac58379.zip
ash: reset ANSI emulation when BB_SKIP_ANSI_EMULATION changes
Update the skip status on the first call to skip_ansi_emulation() and whenever the BB_SKIP_ANSI_EMULATION variable changes.
-rw-r--r--include/libbb.h1
-rw-r--r--include/mingw.h1
-rw-r--r--libbb/messages.c2
-rw-r--r--shell/ash.c11
-rw-r--r--win32/winansi.c17
5 files changed, 22 insertions, 10 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 8979665b2..7077f0e0d 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -2215,6 +2215,7 @@ extern const char bb_busybox_exec_path[] ALIGN1;
2215#define BB_PATH_ROOT_PATH "PATH=/sbin;/usr/sbin;/bin;/usr/bin" BB_ADDITIONAL_PATH 2215#define BB_PATH_ROOT_PATH "PATH=/sbin;/usr/sbin;/bin;/usr/bin" BB_ADDITIONAL_PATH
2216#define PATH_SEP ';' 2216#define PATH_SEP ';'
2217#define PATH_SEP_STR ";" 2217#define PATH_SEP_STR ";"
2218extern const char bb_skip_ansi_emulation[] ALIGN1;
2218#endif 2219#endif
2219extern const char bb_PATH_root_path[] ALIGN1; /* BB_PATH_ROOT_PATH */ 2220extern const char bb_PATH_root_path[] ALIGN1; /* BB_PATH_ROOT_PATH */
2220#define bb_default_root_path (bb_PATH_root_path + sizeof("PATH")) 2221#define bb_default_root_path (bb_PATH_root_path + sizeof("PATH"))
diff --git a/include/mingw.h b/include/mingw.h
index 3516cd31c..0fead43c9 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -538,3 +538,4 @@ char *xabsolute_path(char *path);
538char *get_drive_cwd(const char *path, char *buffer, int size); 538char *get_drive_cwd(const char *path, char *buffer, int size);
539void fix_path_case(char *path); 539void fix_path_case(char *path);
540void seek_sparse(int fd, size_t size); 540void seek_sparse(int fd, size_t size);
541int skip_ansi_emulation(int reset);
diff --git a/libbb/messages.c b/libbb/messages.c
index f5bbd3e32..04863855a 100644
--- a/libbb/messages.c
+++ b/libbb/messages.c
@@ -29,6 +29,8 @@ const char bb_hexdigits_upcase[] ALIGN1 = "0123456789ABCDEF";
29 29
30#if !ENABLE_PLATFORM_MINGW32 30#if !ENABLE_PLATFORM_MINGW32
31const char bb_busybox_exec_path[] ALIGN1 = CONFIG_BUSYBOX_EXEC_PATH; 31const char bb_busybox_exec_path[] ALIGN1 = CONFIG_BUSYBOX_EXEC_PATH;
32#else
33const char bb_skip_ansi_emulation[] ALIGN1 = "BB_SKIP_ANSI_EMULATION";
32#endif 34#endif
33const char bb_default_login_shell[] ALIGN1 = LIBBB_DEFAULT_LOGIN_SHELL; 35const char bb_default_login_shell[] ALIGN1 = LIBBB_DEFAULT_LOGIN_SHELL;
34/* util-linux manpage says /sbin:/bin:/usr/sbin:/usr/bin, 36/* util-linux manpage says /sbin:/bin:/usr/sbin:/usr/bin,
diff --git a/shell/ash.c b/shell/ash.c
index ca8acd705..4f1fe005b 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -2248,6 +2248,14 @@ static void change_seconds(const char *) FAST_FUNC;
2248static void change_realtime(const char *) FAST_FUNC; 2248static void change_realtime(const char *) FAST_FUNC;
2249#endif 2249#endif
2250 2250
2251#if ENABLE_PLATFORM_MINGW32
2252static void FAST_FUNC
2253change_skip_ansi(const char *newval UNUSED_PARAM)
2254{
2255 skip_ansi_emulation(TRUE);
2256}
2257#endif
2258
2251static const struct { 2259static const struct {
2252 int flags; 2260 int flags;
2253 const char *var_text; 2261 const char *var_text;
@@ -2284,6 +2292,9 @@ static const struct {
2284#if ENABLE_FEATURE_EDITING_SAVEHISTORY 2292#if ENABLE_FEATURE_EDITING_SAVEHISTORY
2285 { VSTRFIXED|VTEXTFIXED|VUNSET, "HISTFILE" , NULL }, 2293 { VSTRFIXED|VTEXTFIXED|VUNSET, "HISTFILE" , NULL },
2286#endif 2294#endif
2295#if ENABLE_PLATFORM_MINGW32
2296 { VSTRFIXED|VTEXTFIXED|VUNSET, bb_skip_ansi_emulation, change_skip_ansi },
2297#endif
2287}; 2298};
2288 2299
2289struct redirtab; 2300struct redirtab;
diff --git a/win32/winansi.c b/win32/winansi.c
index dcfdd7e1f..c4c7ee87c 100644
--- a/win32/winansi.c
+++ b/win32/winansi.c
@@ -53,17 +53,14 @@ static int is_console_in(int fd)
53 return isatty(fd) && GetStdHandle(STD_INPUT_HANDLE) != INVALID_HANDLE_VALUE; 53 return isatty(fd) && GetStdHandle(STD_INPUT_HANDLE) != INVALID_HANDLE_VALUE;
54} 54}
55 55
56static int skip_ansi_emulation(void) 56int skip_ansi_emulation(int reset)
57{ 57{
58 static char *var = NULL; 58 static int skip = -1;
59 static int got_var = FALSE;
60 59
61 if (!got_var) { 60 if (skip < 0 || reset)
62 var = getenv("BB_SKIP_ANSI_EMULATION"); 61 skip = getenv(bb_skip_ansi_emulation) != NULL;
63 got_var = TRUE;
64 }
65 62
66 return var != NULL; 63 return skip;
67} 64}
68 65
69void set_title(const char *str) 66void set_title(const char *str)
@@ -557,7 +554,7 @@ static int ansi_emulate(const char *s, FILE *stream)
557 554
558 while (*pos) { 555 while (*pos) {
559 pos = strchr(str, '\033'); 556 pos = strchr(str, '\033');
560 if (pos && !skip_ansi_emulation()) { 557 if (pos && !skip_ansi_emulation(FALSE)) {
561 size_t len = pos - str; 558 size_t len = pos - str;
562 559
563 if (len) { 560 if (len) {
@@ -811,7 +808,7 @@ static int ansi_emulate_write(int fd, const void *buf, size_t count)
811 /* we've checked the data doesn't contain any NULs */ 808 /* we've checked the data doesn't contain any NULs */
812 while (*pos) { 809 while (*pos) {
813 pos = strchr(str, '\033'); 810 pos = strchr(str, '\033');
814 if (pos && !skip_ansi_emulation()) { 811 if (pos && !skip_ansi_emulation(FALSE)) {
815 len = pos - str; 812 len = pos - str;
816 813
817 if (len) { 814 if (len) {