diff options
| author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-09-14 11:01:46 +1000 |
|---|---|---|
| committer | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-09-14 11:06:23 +1000 |
| commit | a102166268ed566d9bcd9884396add2aef5b9dff (patch) | |
| tree | 91a63b8f7f9b0e781dd9e6ebd6fc015f48938922 | |
| parent | 185b9604333d74512a36f603164c2c728a166504 (diff) | |
| download | busybox-w32-a102166268ed566d9bcd9884396add2aef5b9dff.tar.gz busybox-w32-a102166268ed566d9bcd9884396add2aef5b9dff.tar.bz2 busybox-w32-a102166268ed566d9bcd9884396add2aef5b9dff.zip | |
win32: support .com executables
| -rw-r--r-- | libbb/execable.c | 18 | ||||
| -rw-r--r-- | win32/process.c | 4 |
2 files changed, 17 insertions, 5 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); |
diff --git a/win32/process.c b/win32/process.c index 0936e1c42..13bf81797 100644 --- a/win32/process.c +++ b/win32/process.c | |||
| @@ -38,7 +38,9 @@ parse_interpreter(const char *cmd) | |||
| 38 | 38 | ||
| 39 | /* don't even try a .exe */ | 39 | /* don't even try a .exe */ |
| 40 | n = strlen(cmd); | 40 | n = strlen(cmd); |
| 41 | if (n >= 4 && !strcasecmp(cmd+n-4, ".exe")) | 41 | if (n >= 4 && |
| 42 | (!strcasecmp(cmd+n-4, ".exe") || | ||
| 43 | !strcasecmp(cmd+n-4, ".com"))) | ||
| 42 | return NULL; | 44 | return NULL; |
| 43 | 45 | ||
| 44 | fd = open(cmd, O_RDONLY); | 46 | fd = open(cmd, O_RDONLY); |
