aboutsummaryrefslogtreecommitdiff
path: root/win32/process.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 /win32/process.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 'win32/process.c')
-rw-r--r--win32/process.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/win32/process.c b/win32/process.c
index 1118eb18a..cd164e0ed 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -63,6 +63,7 @@ static int
63parse_interpreter(const char *cmd, interp_t *interp) 63parse_interpreter(const char *cmd, interp_t *interp)
64{ 64{
65 char *path, *t; 65 char *path, *t;
66 const char *sd;
66 int n; 67 int n;
67 68
68 while (TRUE) { 69 while (TRUE) {
@@ -88,6 +89,12 @@ parse_interpreter(const char *cmd, interp_t *interp)
88 if (*t == '\0') 89 if (*t == '\0')
89 break; 90 break;
90 91
92 sd = need_system_drive(path);
93 if (sd && strlen(sd) == 2) {
94 path -= 2;
95 memcpy(path, sd, 2);
96 }
97
91 interp->path = path; 98 interp->path = path;
92 interp->name = t; 99 interp->name = t;
93 interp->opts = strtok(NULL, "\r\n"); 100 interp->opts = strtok(NULL, "\r\n");
@@ -342,6 +349,7 @@ static intptr_t
342mingw_spawn_1(int mode, const char *cmd, char *const *argv, char *const *envp) 349mingw_spawn_1(int mode, const char *cmd, char *const *argv, char *const *envp)
343{ 350{
344 char *prog; 351 char *prog;
352 const char *path;
345 353
346#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE 354#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE
347 if (find_applet_by_name(cmd) >= 0) 355 if (find_applet_by_name(cmd) >= 0)
@@ -349,7 +357,8 @@ mingw_spawn_1(int mode, const char *cmd, char *const *argv, char *const *envp)
349 else 357 else
350#endif 358#endif
351 if (has_path(cmd)) { 359 if (has_path(cmd)) {
352 const char *path = auto_win32_extension(cmd); 360 cmd = auto_add_system_drive(cmd);
361 path = auto_win32_extension(cmd);
353 return mingw_spawn_interpreter(mode, path ? path : cmd, argv, envp, 0); 362 return mingw_spawn_interpreter(mode, path ? path : cmd, argv, envp, 0);
354 } 363 }
355 else if ((prog=find_first_executable(cmd)) != NULL) { 364 else if ((prog=find_first_executable(cmd)) != NULL) {