aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-09-14 11:01:46 +1000
committerNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-09-14 11:06:23 +1000
commita102166268ed566d9bcd9884396add2aef5b9dff (patch)
tree91a63b8f7f9b0e781dd9e6ebd6fc015f48938922 /libbb
parent185b9604333d74512a36f603164c2c728a166504 (diff)
downloadbusybox-w32-a102166268ed566d9bcd9884396add2aef5b9dff.tar.gz
busybox-w32-a102166268ed566d9bcd9884396add2aef5b9dff.tar.bz2
busybox-w32-a102166268ed566d9bcd9884396add2aef5b9dff.zip
win32: support .com executables
Diffstat (limited to 'libbb')
-rw-r--r--libbb/execable.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/libbb/execable.c b/libbb/execable.c
index 96ce9bfb8..06b1c534b 100644
--- a/libbb/execable.c
+++ b/libbb/execable.c
@@ -18,8 +18,11 @@ int FAST_FUNC execable_file(const char *name)
18 struct stat s; 18 struct stat s;
19 if (ENABLE_PLATFORM_MINGW32) { 19 if (ENABLE_PLATFORM_MINGW32) {
20 int len = strlen(name); 20 int len = strlen(name);
21 return len > 4 && !strcasecmp(name+len-4, ".exe") && 21 return len > 4 &&
22 !stat(name, &s) && S_ISREG(s.st_mode); 22 (!strcasecmp(name+len-4, ".exe") ||
23 !strcasecmp(name+len-4, ".com")) &&
24 !stat(name, &s) &&
25 S_ISREG(s.st_mode);
23 } 26 }
24 return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode)); 27 return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode));
25} 28}
@@ -43,7 +46,7 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp)
43 46
44 p = *PATHp; 47 p = *PATHp;
45 while (p) { 48 while (p) {
46 n = next_path_sep(p); 49 n = (char*)next_path_sep(p);
47 if (n) 50 if (n)
48 *n++ = '\0'; 51 *n++ = '\0';
49 if (*p != '\0') { /* it's not a PATH="foo::bar" situation */ 52 if (*p != '\0') { /* it's not a PATH="foo::bar" situation */
@@ -54,7 +57,9 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp)
54 } 57 }
55 if (ENABLE_PLATFORM_MINGW32) { 58 if (ENABLE_PLATFORM_MINGW32) {
56 int len = strlen(p); 59 int len = strlen(p);
57 if (len > 4 && !strcasecmp(p+len-4, ".exe")) 60 if (len > 4 &&
61 (!strcasecmp(p+len-4, ".exe") ||
62 !strcasecmp(p+len-4, ".com")))
58 ; /* nothing, already tested by find_execable() */ 63 ; /* nothing, already tested by find_execable() */
59 else { 64 else {
60 char *np = xmalloc(len+4+1); 65 char *np = xmalloc(len+4+1);
@@ -64,6 +69,11 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp)
64 *PATHp = n; 69 *PATHp = n;
65 return np; 70 return np;
66 } 71 }
72 memcpy(np+len, ".com", 5);
73 if (execable_file(np)) {
74 *PATHp = n;
75 return np;
76 }
67 } 77 }
68 } 78 }
69 free(p); 79 free(p);