diff options
author | Ron Yorston <rmy@pobox.com> | 2020-08-13 14:27:56 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2020-08-13 14:58:01 +0100 |
commit | 41ef232fc522d91f29931ea4ee547432ca8899ee (patch) | |
tree | d2acfdc43839b68b569debb4494d5c7fbd8bc66b /win32/mingw.c | |
parent | 16e5930a65f3c7c570b8a0dda8daa19ab4792fa2 (diff) | |
download | busybox-w32-41ef232fc522d91f29931ea4ee547432ca8899ee.tar.gz busybox-w32-41ef232fc522d91f29931ea4ee547432ca8899ee.tar.bz2 busybox-w32-41ef232fc522d91f29931ea4ee547432ca8899ee.zip |
win32: use built-in applets for non-existent binaries with Unix-style paths
Shell scripts moved from Unix may contain hard-coded paths to
binaries such as /bin/sh. A recent commit made it possible to
execute such binaries reliably, but that does require them to be
installed. As an alternative solution: if a binary with a
standard Unix path prefix can't be found but is available as a
built-in applet, run the applet.
Add the function unix_path() to detect paths starting with /bin,
/usr/bin, /sbin or /usr/sbin.
Use this function in:
- the 'which' applet
- shellexec(), describe_command() and find_command() in ash
- mingw_spawn_1()
See GitHub issue #195.
Diffstat (limited to 'win32/mingw.c')
-rw-r--r-- | win32/mingw.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/win32/mingw.c b/win32/mingw.c index e63ffa0ac..4ffc49e9a 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
@@ -1818,6 +1818,19 @@ void *get_proc_addr(const char *dll, const char *function, | |||
1818 | return proc->pfunction; | 1818 | return proc->pfunction; |
1819 | } | 1819 | } |
1820 | 1820 | ||
1821 | #if ENABLE_FEATURE_SH_STANDALONE || ENABLE_FEATURE_PREFER_APPLETS | ||
1822 | int unix_path(const char *path) | ||
1823 | { | ||
1824 | int i; | ||
1825 | char *p = strdup(path); | ||
1826 | |||
1827 | #define UNIX_PATHS "/bin\0/usr/bin\0/sbin\0/usr/sbin\0" | ||
1828 | i = index_in_strings(UNIX_PATHS, dirname(p)); | ||
1829 | free(p); | ||
1830 | return i >= 0; | ||
1831 | } | ||
1832 | #endif | ||
1833 | |||
1821 | /* Return true if file is referenced using a path. This means a path | 1834 | /* Return true if file is referenced using a path. This means a path |
1822 | * look-up isn't required. */ | 1835 | * look-up isn't required. */ |
1823 | int has_path(const char *file) | 1836 | int has_path(const char *file) |