aboutsummaryrefslogtreecommitdiff
path: root/libbb/executable.c
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-07-26 15:05:57 +0100
committerRon Yorston <rmy@pobox.com>2021-07-26 15:26:30 +0100
commit5c2241c4b32607f138824c3454b7b32b2916fd02 (patch)
tree49667c5bf5f9b99c534c8da30bd2e574b1975de0 /libbb/executable.c
parentc79f1302589885a6b5500c38c20f1cc5d00e006f (diff)
downloadbusybox-w32-5c2241c4b32607f138824c3454b7b32b2916fd02.tar.gz
busybox-w32-5c2241c4b32607f138824c3454b7b32b2916fd02.tar.bz2
busybox-w32-5c2241c4b32607f138824c3454b7b32b2916fd02.zip
win32: more efficient tests for executables
file_is_executable() calls access(2) and stat(2); in this case our WIN32 implementation also calls stat(2). Avoid this unnecessary duplication by copying the required test from the WIN32 access(2). In find_executable() it's possible to avoid calling file_is_executable() if add_win32_extension() returns TRUE as the latter will already have verified that the file is executable. Replace a call to file_is_executable() in the tab completion code with the equivalent tests, avoiding (up to) two calls to stat(2). These changes don't affect the size of the binary and should be faster.
Diffstat (limited to 'libbb/executable.c')
-rw-r--r--libbb/executable.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/libbb/executable.c b/libbb/executable.c
index e20bf89e4..32b37f29d 100644
--- a/libbb/executable.c
+++ b/libbb/executable.c
@@ -15,7 +15,12 @@
15int FAST_FUNC file_is_executable(const char *name) 15int FAST_FUNC file_is_executable(const char *name)
16{ 16{
17 struct stat s; 17 struct stat s;
18#if !ENABLE_PLATFORM_MINGW32
18 return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode)); 19 return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode));
20#else
21 /* expand WIN32 implementation of access(2) */
22 return (!stat(name, &s) && S_ISREG(s.st_mode) && (s.st_mode & S_IXUSR));
23#endif
19} 24}
20 25
21/* search (*PATHp) for an executable file; 26/* search (*PATHp) for an executable file;
@@ -53,12 +58,13 @@ char* FAST_FUNC find_executable(const char *filename, char **PATHp)
53#if ENABLE_PLATFORM_MINGW32 58#if ENABLE_PLATFORM_MINGW32
54 { 59 {
55 char *w = alloc_system_drive(p); 60 char *w = alloc_system_drive(p);
56 add_win32_extension(w); 61 ex = add_win32_extension(w) || file_is_executable(w);
57 free(p); 62 free(p);
58 p = w; 63 p = w;
59 } 64 }
60#endif 65#else
61 ex = file_is_executable(p); 66 ex = file_is_executable(p);
67#endif
62 if (n) *n++ = PATH_SEP; 68 if (n) *n++ = PATH_SEP;
63 if (ex) { 69 if (ex) {
64 *PATHp = n; 70 *PATHp = n;