diff options
Diffstat (limited to 'src/os_win32.c')
-rw-r--r-- | src/os_win32.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index 434362b115..da6fd8dacf 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -1521,7 +1521,7 @@ theend: /* * Return TRUE if "name" is in $PATH. - * TODO: Should also check if it's really executable. + * TODO: Should somehow check if it's really executable. */ static int executable_exists(char *name) @@ -2556,7 +2556,43 @@ mch_writable(char_u *name) int mch_can_exe(char_u *name) { - return executable_exists((char *)name); + char_u buf[_MAX_PATH]; + int len = STRLEN(name); + char_u *p; + + if (len >= _MAX_PATH) /* safety check */ + return FALSE; + + /* If there already is an extension try using the name directly. Also do + * this with a Unix-shell like 'shell'. */ + if (vim_strchr(gettail(name), '.') != NULL + || strstr((char *)gettail(p_sh), "sh") != NULL) + if (executable_exists((char *)name)) + return TRUE; + + /* + * Loop over all extensions in $PATHEXT. + */ + STRNCPY(buf, name, _MAX_PATH); + p = mch_getenv("PATHEXT"); + if (p == NULL) + p = (char_u *)".com;.exe;.bat;.cmd"; + while (*p) + { + if (p[0] == '.' && (p[1] == NUL || p[1] == ';')) + { + /* A single "." means no extension is added. */ + buf[len] = NUL; + ++p; + if (*p) + ++p; + } + else + copy_option_part(&p, buf + len, _MAX_PATH - len, ";"); + if (executable_exists((char *)buf)) + return TRUE; + } + return FALSE; } #endif @@ -4659,14 +4695,14 @@ copy_infostreams(char_u *from, char_u *to) { streamname[len - 6] = 0; copy_substream(sh, &context, tow, streamname, - (long)sid.Size.LowPart); + (long)sid.Size.u.LowPart); } } /* Advance to the next stream. We might try seeking too far, * but BackupSeek() doesn't skip over stream borders, thus * that's OK. */ - (void)BackupSeek(sh, sid.Size.LowPart, sid.Size.HighPart, + (void)BackupSeek(sh, sid.Size.LowPart, sid.Size.u.HighPart, &lo, &hi, &context); } |