aboutsummaryrefslogtreecommitdiff
path: root/libbb/lineedit.c
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-08-13 13:56:17 +0100
committerRon Yorston <rmy@pobox.com>2020-08-13 14:58:01 +0100
commit6059723900f2af1fbd394c457d1feae342e344f6 (patch)
tree146c10c821977a8af0942cc930d3a4550cf4a624 /libbb/lineedit.c
parent7d639339e0c46311f8873d560e6f168e71473cd9 (diff)
downloadbusybox-w32-6059723900f2af1fbd394c457d1feae342e344f6.tar.gz
busybox-w32-6059723900f2af1fbd394c457d1feae342e344f6.tar.bz2
busybox-w32-6059723900f2af1fbd394c457d1feae342e344f6.zip
win32: handle Unix-style absolute paths for executables
As noted in commit 548ec7045 (win32: interpret absolute paths as relative to %SYSTEMDRIVE%) a path starting with a '/' in the Unix world is treated as relative to the current drive by Windows. To avoid ambiguity that commit considered certain such paths to be relative to %SYSTEMDRIVE%. Extend this to paths representing executables. Add the functions need_system_drive() and auto_add_system_drive() to detect the need for a system drive prefix and to add it if necessary. Use these functions in: - the 'which' applet - the find_executable() function - tab-completion code - PATH look-up, shellexec(), describe_command() and find_command() in ash - parse_interpreter() and mingw_spawn_1() With these changes executable paths starting with a slash are handled consistently, whatever the current drive.
Diffstat (limited to 'libbb/lineedit.c')
-rw-r--r--libbb/lineedit.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index a36a1647d..f6577e372 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -913,8 +913,12 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
913 struct dirent *next; 913 struct dirent *next;
914 struct stat st; 914 struct stat st;
915 char *found; 915 char *found;
916 916#if ENABLE_PLATFORM_MINGW32
917 char *lpath = auto_add_system_drive(paths[i]);
918 dir = opendir(lpath);
919#else
917 dir = opendir(paths[i]); 920 dir = opendir(paths[i]);
921#endif
918 if (!dir) 922 if (!dir)
919 continue; /* don't print an error */ 923 continue; /* don't print an error */
920 924
@@ -929,7 +933,11 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
929 if (!is_prefixed_with(name_found, pfind)) 933 if (!is_prefixed_with(name_found, pfind))
930 continue; /* no */ 934 continue; /* no */
931 935
936#if ENABLE_PLATFORM_MINGW32
937 found = concat_path_file(lpath, name_found);
938#else
932 found = concat_path_file(paths[i], name_found); 939 found = concat_path_file(paths[i], name_found);
940#endif
933 /* NB: stat() first so that we see is it a directory; 941 /* NB: stat() first so that we see is it a directory;
934 * but if that fails, use lstat() so that 942 * but if that fails, use lstat() so that
935 * we still match dangling links */ 943 * we still match dangling links */