Zero-length path prefixes can be specified in PATH as a leading or
trailing colon or two adjacent colons.  POSIX says that the use of
zero-length prefixes to refer to the current directory is a legacy
feature.  Nonetheless the shells in BusyBox respect this feature,
as does 'which'.

Tab-completion of executables using PATH should support this too.

function                                             old     new   delta
complete_cmd_dir_file                                934     931      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3)               Total: -3 bytes

Signed-off-by: Ron Yorston <[email protected]>
---
 libbb/lineedit.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 367396b91..b0adcf140 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -769,8 +769,6 @@ static unsigned path_parse(char ***p)
                if (!tmp)
                        break;
                tmp++;
-               if (*tmp == '\0')
-                       break;  /* :<empty> */
                npth++;
        }
 
@@ -782,8 +780,6 @@ static unsigned path_parse(char ***p)
                if (!tmp)
                        break;
                *tmp++ = '\0'; /* ':' -> '\0' */
-               if (*tmp == '\0')
-                       break; /* :<empty> */
                res[npth++] = tmp;
        }
        /* special case: "match subdirectories of the current directory" */
@@ -854,6 +850,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char 
*command, int type)
                struct dirent *next;
                struct stat st;
                char *found;
+               const char *lpath;
 
                if (paths[i] == NULL) { /* path_parse()'s last component? */
                        /* in PATH completion, current dir's subdir names
@@ -863,7 +860,8 @@ static NOINLINE unsigned complete_cmd_dir_file(const char 
*command, int type)
                        paths[i] = (char *)".";
                }
 
-               dir = opendir(paths[i]);
+               lpath = *paths[i] ? paths[i] : ".";
+               dir = opendir(lpath);
                if (!dir)
                        continue; /* don't print an error */
 
@@ -878,7 +876,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char 
*command, int type)
                        if (strncmp(basecmd, name_found, baselen) != 0)
                                continue; /* no */
 
-                       found = concat_path_file(paths[i], name_found);
+                       found = concat_path_file(lpath, name_found);
                        /* NB: stat() first so that we see is it a directory;
                         * but if that fails, use lstat() so that
                         * we still match dangling links */
-- 
2.29.2

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to