diff --git a/include/libbb.h b/include/libbb.h index 6aeec249d..abbc9ac59 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -1924,6 +1924,7 @@ unsigned size_from_HISTFILESIZE(const char *hp) FAST_FUNC; # define MAX_HISTORY 0 # endif typedef const char *get_exe_name_t(int i) FAST_FUNC; +typedef const char *sh_get_var_t(const char *name) FAST_FUNC; typedef struct line_input_t { int flags; int timeout; @@ -1937,9 +1938,8 @@ typedef struct line_input_t { # if ENABLE_SHELL_ASH || ENABLE_SHELL_HUSH /* function to fetch additional application-specific names to match */ get_exe_name_t *get_exe_name; -# define EDITING_HAS_get_exe_name 1 -# else -# define EDITING_HAS_get_exe_name 0 + /* function to fetch value of shell variable */ + sh_get_var_t *sh_get_var; # endif # endif # if MAX_HISTORY @@ -1993,11 +1993,6 @@ int read_line_input(const char* prompt, char* command, int maxsize) FAST_FUNC; read_line_input(prompt, command, maxsize) #endif -#ifndef EDITING_HAS_get_exe_name -# define EDITING_HAS_get_exe_name 0 -#endif - - #ifndef COMM_LEN # ifdef TASK_COMM_LEN enum { COMM_LEN = TASK_COMM_LEN }; diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 82624757e..b685399f9 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -259,6 +259,16 @@ static const char *get_username_str(void) static NOINLINE const char *get_homedir_or_NULL(void) { + const char *home; + +# if ENABLE_SHELL_ASH || ENABLE_SHELL_HUSH + home = state->sh_get_var ? state->sh_get_var("HOME") : getenv("HOME"); +# else + home = getenv("HOME"); +# endif + if (home != NULL && home[0] != '\0') + return home; + if (!got_user_strings) get_user_strings(); return home_pwd_buf; @@ -861,7 +871,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) continue; } # endif -# if EDITING_HAS_get_exe_name +# if ENABLE_SHELL_ASH || ENABLE_SHELL_HUSH if (state->get_exe_name) { i = 0; for (;;) { diff --git a/shell/ash.c b/shell/ash.c index ef4a47afe..d29de37b7 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -9720,7 +9720,7 @@ evalpipe(union node *n, int flags) } /* setinteractive needs this forward reference */ -#if EDITING_HAS_get_exe_name +#if ENABLE_FEATURE_EDITING static const char *get_builtin_name(int i) FAST_FUNC; #endif @@ -9757,9 +9757,8 @@ setinteractive(int on) #if ENABLE_FEATURE_EDITING if (!line_input_state) { line_input_state = new_line_input_t(FOR_SHELL | WITH_PATH_LOOKUP); -# if EDITING_HAS_get_exe_name line_input_state->get_exe_name = get_builtin_name; -# endif + line_input_state->sh_get_var = lookupvar; } #endif } @@ -10262,7 +10261,7 @@ find_builtin(const char *name) return bp; } -#if EDITING_HAS_get_exe_name +#if ENABLE_FEATURE_EDITING static const char * FAST_FUNC get_builtin_name(int i) { diff --git a/shell/hush.c b/shell/hush.c index ae81f0da5..051b123e7 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -8188,7 +8188,7 @@ static const struct built_in_command *find_builtin(const char *name) return find_builtin_helper(name, bltins2, &bltins2[ARRAY_SIZE(bltins2)]); } -#if ENABLE_HUSH_JOB && EDITING_HAS_get_exe_name +#if ENABLE_HUSH_JOB && ENABLE_FEATURE_EDITING static const char * FAST_FUNC get_builtin_name(int i) { if (/*i >= 0 && */ i < ARRAY_SIZE(bltins1)) { @@ -10668,9 +10668,8 @@ int hush_main(int argc, char **argv) # if ENABLE_FEATURE_EDITING G.line_input_state = new_line_input_t(FOR_SHELL); -# if EDITING_HAS_get_exe_name G.line_input_state->get_exe_name = get_builtin_name; -# endif + G.line_input_state->sh_get_var = get_local_var_value; # endif # if ENABLE_HUSH_SAVEHISTORY && MAX_HISTORY > 0 {