[git commit] lineedit: get PWD from ash
Denys Vlasenko
vda.linux at googlemail.com
Sun Jul 3 19:41:38 UTC 2022
commit: https://git.busybox.net/busybox/commit/?id=298ac9507bb6cb932162f863c7b9623c0a37dedb
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
The line editing code and ash disagree when the current directory
is changed to a symbolic link:
~ $ mkdir real
~ $ ln -s real link
~ $ cd link
~/real $ pwd
/home/rmyf36/link
Note the prompt says we're in ~/real. Bash does:
[rmy at random ~]$ cd link
[rmy at random link]$ pwd
/home/rmyf36/link
Ash uses the name supplied by the user while the line editing code
calls getcwd(3). The discrepancy can be avoided by fetching the
value of PWD from ash.
Hush calls getcwd(3) when the directory is changed
so there's no disagreement with the line editing code.
There is no standard how shells should handle cd'ing into
symlinks.
function old new delta
parse_and_put_prompt 838 869 +31
Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
libbb/lineedit.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index b685399f9..697f2a577 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -2035,7 +2035,13 @@ static void parse_and_put_prompt(const char *prmt_ptr)
case 'W': /* basename of cur dir */
if (!cwd_buf) {
const char *home;
+#if ENABLE_SHELL_ASH
+ cwd_buf = state->sh_get_var
+ ? xstrdup(state->sh_get_var("PWD"))
+ : xrealloc_getcwd_or_warn(NULL);
+#else
cwd_buf = xrealloc_getcwd_or_warn(NULL);
+#endif
if (!cwd_buf)
cwd_buf = (char *)bb_msg_unknown;
else if ((home = get_homedir_or_NULL()) != NULL && home[0]) {
More information about the busybox-cvs
mailing list