aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-02-18 09:50:29 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2021-02-23 12:20:51 +0100
commit760b627e2ac6aedbf604040951280eaaf75939a8 (patch)
treeadf5545c8087221257e9add200f3144a27e01f90
parent858f8aafacf93ff4642a2f62dc0d7f0f31f95cce (diff)
downloadbusybox-w32-760b627e2ac6aedbf604040951280eaaf75939a8.tar.gz
busybox-w32-760b627e2ac6aedbf604040951280eaaf75939a8.tar.bz2
busybox-w32-760b627e2ac6aedbf604040951280eaaf75939a8.zip
lineedit: support empty PATH entries in tab completion
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 <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/lineedit.c10
1 files 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)
769 if (!tmp) 769 if (!tmp)
770 break; 770 break;
771 tmp++; 771 tmp++;
772 if (*tmp == '\0')
773 break; /* :<empty> */
774 npth++; 772 npth++;
775 } 773 }
776 774
@@ -782,8 +780,6 @@ static unsigned path_parse(char ***p)
782 if (!tmp) 780 if (!tmp)
783 break; 781 break;
784 *tmp++ = '\0'; /* ':' -> '\0' */ 782 *tmp++ = '\0'; /* ':' -> '\0' */
785 if (*tmp == '\0')
786 break; /* :<empty> */
787 res[npth++] = tmp; 783 res[npth++] = tmp;
788 } 784 }
789 /* special case: "match subdirectories of the current directory" */ 785 /* special case: "match subdirectories of the current directory" */
@@ -854,6 +850,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
854 struct dirent *next; 850 struct dirent *next;
855 struct stat st; 851 struct stat st;
856 char *found; 852 char *found;
853 const char *lpath;
857 854
858 if (paths[i] == NULL) { /* path_parse()'s last component? */ 855 if (paths[i] == NULL) { /* path_parse()'s last component? */
859 /* in PATH completion, current dir's subdir names 856 /* in PATH completion, current dir's subdir names
@@ -863,7 +860,8 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
863 paths[i] = (char *)"."; 860 paths[i] = (char *)".";
864 } 861 }
865 862
866 dir = opendir(paths[i]); 863 lpath = *paths[i] ? paths[i] : ".";
864 dir = opendir(lpath);
867 if (!dir) 865 if (!dir)
868 continue; /* don't print an error */ 866 continue; /* don't print an error */
869 867
@@ -878,7 +876,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
878 if (strncmp(basecmd, name_found, baselen) != 0) 876 if (strncmp(basecmd, name_found, baselen) != 0)
879 continue; /* no */ 877 continue; /* no */
880 878
881 found = concat_path_file(paths[i], name_found); 879 found = concat_path_file(lpath, name_found);
882 /* NB: stat() first so that we see is it a directory; 880 /* NB: stat() first so that we see is it a directory;
883 * but if that fails, use lstat() so that 881 * but if that fails, use lstat() so that
884 * we still match dangling links */ 882 * we still match dangling links */