Jens Collin <jens.collin@lakhei.com>

Add PATHEXT env var and use it to locate command

svn path=/trunk/; revision=10081
This commit is contained in:
Gé van Geldorp 2004-07-11 16:13:44 +00:00
parent 839cdb0644
commit c8d9ece95d
3 changed files with 111 additions and 187 deletions

View file

@ -103,6 +103,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","Path",0x000
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00020000,".COM;.EXE;.BAT;.CMD"
; Known DLLs ; Known DLLs
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","DllDirectory",0x00020000,"%SystemRoot%\system32" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","DllDirectory",0x00020000,"%SystemRoot%\system32"

View file

@ -359,7 +359,8 @@ BOOL IsValidPathName (LPCTSTR pszPath)
BOOL IsValidFileName (LPCTSTR pszPath) BOOL IsValidFileName (LPCTSTR pszPath)
{ {
return (GetFileAttributes (pszPath) != 0xFFFFFFFF); DWORD attr = GetFileAttributes (pszPath);
return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) );
} }

View file

@ -67,6 +67,11 @@
* *
* 20-Apr-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) * 20-Apr-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Some minor changes and improvements. * Some minor changes and improvements.
*
* 10-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
* Fixed searxhing for files with specific extensions in PATHEXT order..
*
*/ */
#include "config.h" #include "config.h"
@ -82,29 +87,23 @@
#define ENV_BUFFER_SIZE 1024 #define ENV_BUFFER_SIZE 1024
static LPTSTR ext[] = {_T(".bat"), _T(".cmd"), _T(".com"), _T(".exe")};
static INT nExtCount = sizeof(ext) / sizeof(LPTSTR);
/* searches for file using path info. */ /* searches for file using path info. */
BOOL BOOL
SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension)
{ {
TCHAR szPathBuffer[MAX_PATH]; TCHAR szPathBuffer[MAX_PATH];
LPTSTR pszBuffer = NULL; LPTSTR pszBuffer = NULL;
DWORD dwBuffer, len; DWORD dwBuffer, len;
INT n; LPTSTR s,f;
LPTSTR p,s,f; // initialize full name buffer
/* initialize full name buffer */
*pFullName = _T('\0'); *pFullName = _T('\0');
#ifdef _DEBUG #ifdef _DEBUG
DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName); DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension);
#endif #endif
// Check if valid directly on specified path
if (_tcschr (pFileName, _T('\\')) != NULL) if (_tcschr (pFileName, _T('\\')) != NULL)
{ {
LPTSTR pFilePart; LPTSTR pFilePart;
@ -120,47 +119,45 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
if(pFilePart == 0) if(pFilePart == 0)
return FALSE; return FALSE;
// Add extension and test file:
if (pExtension)
_tcscat(szPathBuffer, pExtension);
if (IsValidFileName (szPathBuffer))
if (_tcschr (pFilePart, _T('.')) != NULL) {
{
#ifdef _DEBUG #ifdef _DEBUG
DebugPrintf (_T("Filename extension!\n")); DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif #endif
_tcscpy (pFullName, szPathBuffer); _tcscpy (pFullName, szPathBuffer);
return TRUE; return TRUE;
}
return FALSE;
}
} // search in current directory
else len = GetCurrentDirectory (MAX_PATH, szPathBuffer);
{ if (szPathBuffer[len - 1] != _T('\\'))
{
szPathBuffer[len] = _T('\\');
szPathBuffer[len + 1] = _T('\0');
}
_tcscat (szPathBuffer, pFileName);
if (pExtension)
_tcscat (szPathBuffer, pExtension);
if (IsValidFileName (szPathBuffer))
{
#ifdef _DEBUG #ifdef _DEBUG
DebugPrintf (_T("No filename extension!\n")); DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif #endif
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
p = szPathBuffer + _tcslen (szPathBuffer);
for (n = 0; n < nExtCount; n++)
{
_tcscpy (p, ext[n]);
#ifdef _DEBUG // load environment varable PATH into buffer
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
#endif
if (IsValidFileName (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
}
return FALSE;
}
}
/* load environment varable PATH into buffer */
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
if (dwBuffer > ENV_BUFFER_SIZE) if (dwBuffer > ENV_BUFFER_SIZE)
@ -169,16 +166,26 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR)); GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR));
} }
if (!(p = _tcsrchr (pFileName, _T('.'))) ||
_tcschr (p + 1, _T('\\')))
{
/* There is no extension ==> test all the extensions. */
#ifdef _DEBUG
DebugPrintf (_T("No filename extension!\n"));
#endif
/* search in current directory */ // search in PATH
len = GetCurrentDirectory (MAX_PATH, szPathBuffer); s = pszBuffer;
while (s && *s)
{
f = _tcschr (s, _T(';'));
if (f)
{
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
szPathBuffer[f-s] = _T('\0');
s = f + 1;
}
else
{
_tcscpy (szPathBuffer, s);
s = NULL;
}
len = _tcslen(szPathBuffer);
if (szPathBuffer[len - 1] != _T('\\')) if (szPathBuffer[len - 1] != _T('\\'))
{ {
szPathBuffer[len] = _T('\\'); szPathBuffer[len] = _T('\\');
@ -186,95 +193,9 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
} }
_tcscat (szPathBuffer, pFileName); _tcscat (szPathBuffer, pFileName);
p = szPathBuffer + _tcslen (szPathBuffer); if (pExtension)
_tcscat (szPathBuffer, pExtension);
for (n = 0; n < nExtCount; n++)
{
_tcscpy (p, ext[n]);
#ifdef _DEBUG
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
#endif
if (IsValidFileName (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
free (pszBuffer);
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
}
/* search in PATH */
s = pszBuffer;
while (s && *s)
{
f = _tcschr (s, _T(';'));
if (f)
{
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
szPathBuffer[f-s] = _T('\0');
s = f + 1;
}
else
{
_tcscpy (szPathBuffer, s);
s = NULL;
}
len = _tcslen(szPathBuffer);
if (szPathBuffer[len - 1] != _T('\\'))
{
szPathBuffer[len] = _T('\\');
szPathBuffer[len + 1] = _T('\0');
}
_tcscat (szPathBuffer, pFileName);
p = szPathBuffer + _tcslen (szPathBuffer);
for (n = 0; n < nExtCount; n++)
{
_tcscpy (p, ext[n]);
#ifdef _DEBUG
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
#endif
if (IsValidFileName (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
free (pszBuffer);
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
}
}
}
else
{
/* There is an extension and it is in the last path component, */
/* so don't test all the extensions. */
#ifdef _DEBUG
DebugPrintf (_T("Filename extension!\n"));
#endif
/* search in current directory */
len = GetCurrentDirectory (MAX_PATH, szPathBuffer);
if (szPathBuffer[len - 1] != _T('\\'))
{
szPathBuffer[len] = _T('\\');
szPathBuffer[len + 1] = _T('\0');
}
_tcscat (szPathBuffer, pFileName);
#ifdef _DEBUG
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
#endif
if (IsValidFileName (szPathBuffer)) if (IsValidFileName (szPathBuffer))
{ {
#ifdef _DEBUG #ifdef _DEBUG
@ -284,50 +205,51 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
_tcscpy (pFullName, szPathBuffer); _tcscpy (pFullName, szPathBuffer);
return TRUE; return TRUE;
} }
/* search in PATH */
s = pszBuffer;
while (s && *s)
{
f = _tcschr (s, _T(';'));
if (f)
{
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
szPathBuffer[f-s] = _T('\0');
s = f + 1;
}
else
{
_tcscpy (szPathBuffer, s);
s = NULL;
}
len = _tcslen(szPathBuffer);
if (szPathBuffer[len - 1] != _T('\\'))
{
szPathBuffer[len] = _T('\\');
szPathBuffer[len + 1] = _T('\0');
}
_tcscat (szPathBuffer, pFileName);
#ifdef _DEBUG
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
#endif
if (IsValidFileName (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
free (pszBuffer);
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
}
} }
free (pszBuffer); free (pszBuffer);
return FALSE;
}
BOOL
SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
{
LPTSTR pszBuffer = NULL;
LPTSTR pCh;
DWORD dwBuffer;
#ifdef _DEBUG
DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName);
#endif
// check the filename directly
if (SearchForExecutableSingle(pFileName, pFullName, NULL))
{
return TRUE;
}
// load environment varable PATHEXT
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE);
if (dwBuffer > ENV_BUFFER_SIZE)
{
pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer * sizeof (TCHAR));
}
#ifdef _DEBUG
DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer);
#endif
pCh = _tcstok(pszBuffer, ";");
while (pCh)
{
if (SearchForExecutableSingle(pFileName, pFullName, pCh))
{
free(pszBuffer);
return TRUE;
}
pCh = _tcstok(NULL, ";");
}
free(pszBuffer);
return FALSE; return FALSE;
} }