ash,hush: use HOME for tab completion and prompts

ash and hush correctly use the value of HOME for tilde expansion.
However the line editing code in libbb obtains the user's home
directory by calling getpwuid().  Thus tildes in tab completion
and prompts may be interpreted differently than in tilde expansion.

When the line editing code is invoked from a shell make it use the
shell's interpretation of tilde.  This is similar to how GNU readline
and bash collaborate.

function                                             old     new   delta
get_homedir_or_NULL                                   29      72     +43
optschanged                                          119     126      +7
hush_main                                           1204    1211      +7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 57/0)               Total: 57 bytes

v2: Always check for HOME before trying the password database:  this
    is what GNU readline does.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston authored and Denys Vlasenko committed 2022-06-26 18:05:50 +02:00
1 parent 95fec31be6
commit 7d1c7d8337
4 files changed
+19 -16

No files matched your search

+3 -4
View File
@@ -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)
{
+2 -3
View File
@@ -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
{