From 7a7312a3a10b3f580d7e149d814609660703d53b Mon Sep 17 00:00:00 2001 From: Nguyễn Thái Ngọc Duy Date: Tue, 6 Apr 2010 09:52:12 +0200 Subject: win32: execable.c: support .exe suffix --- libbb/execable.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'libbb') diff --git a/libbb/execable.c b/libbb/execable.c index 5c7ac16a2..96ce9bfb8 100644 --- a/libbb/execable.c +++ b/libbb/execable.c @@ -16,6 +16,11 @@ int FAST_FUNC execable_file(const char *name) { struct stat s; + if (ENABLE_PLATFORM_MINGW32) { + int len = strlen(name); + return len > 4 && !strcasecmp(name+len-4, ".exe") && + !stat(name, &s) && S_ISREG(s.st_mode); + } return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode)); } @@ -28,13 +33,17 @@ int FAST_FUNC execable_file(const char *name) * return NULL otherwise; (PATHp is undefined) * in all cases (*PATHp) contents will be trashed (s/:/NUL/). */ +#if !ENABLE_PLATFORM_MINGW32 +#define next_path_sep(s) strchr(s, ':') +#endif + char* FAST_FUNC find_execable(const char *filename, char **PATHp) { char *p, *n; p = *PATHp; while (p) { - n = strchr(p, ':'); + n = next_path_sep(p); if (n) *n++ = '\0'; if (*p != '\0') { /* it's not a PATH="foo::bar" situation */ @@ -43,6 +52,20 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp) *PATHp = n; return p; } + if (ENABLE_PLATFORM_MINGW32) { + int len = strlen(p); + if (len > 4 && !strcasecmp(p+len-4, ".exe")) + ; /* nothing, already tested by find_execable() */ + else { + char *np = xmalloc(len+4+1); + memcpy(np, p, len); + memcpy(np+len, ".exe", 5); + if (execable_file(np)) { + *PATHp = n; + return np; + } + } + } free(p); } p = n; -- cgit v1.2.3-55-g6feb