forked from aniani/vim
patch 8.1.0453: MS-Windows: executable() is not reliable
Problem: MS-Windows: executable() is not reliable. Solution: Use $PATHEXT properly. (Yasuhiro Matsumoto, closes #3412)
This commit is contained in:
@@ -3535,21 +3535,44 @@ mch_can_exe(char_u *name, char_u **path, int use_path)
|
||||
{
|
||||
char_u buf[_MAX_PATH];
|
||||
int len = (int)STRLEN(name);
|
||||
char_u *p;
|
||||
char_u *p, *saved;
|
||||
|
||||
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)
|
||||
/* Ty using the name directly when a Unix-shell like 'shell'. */
|
||||
if (strstr((char *)gettail(p_sh), "sh") != NULL)
|
||||
if (executable_exists((char *)name, path, use_path))
|
||||
return TRUE;
|
||||
|
||||
/*
|
||||
* Loop over all extensions in $PATHEXT.
|
||||
*/
|
||||
p = mch_getenv("PATHEXT");
|
||||
if (p == NULL)
|
||||
p = (char_u *)".com;.exe;.bat;.cmd";
|
||||
saved = vim_strsave(p);
|
||||
if (saved == NULL)
|
||||
return FALSE;
|
||||
p = saved;
|
||||
while (*p)
|
||||
{
|
||||
char_u *tmp = vim_strchr(p, ';');
|
||||
|
||||
if (tmp != NULL)
|
||||
*tmp = NUL;
|
||||
if (_stricoll((char *)name + len - STRLEN(p), (char *)p) == 0
|
||||
&& executable_exists((char *)name, path, use_path))
|
||||
{
|
||||
vim_free(saved);
|
||||
return TRUE;
|
||||
}
|
||||
if (tmp == NULL)
|
||||
break;
|
||||
p = tmp + 1;
|
||||
}
|
||||
vim_free(saved);
|
||||
|
||||
vim_strncpy(buf, name, _MAX_PATH - 1);
|
||||
p = mch_getenv("PATHEXT");
|
||||
if (p == NULL)
|
||||
|
Reference in New Issue
Block a user