Skip to content
Snippets Groups Projects
Commit 836b8b3b authored by Brad King's avatar Brad King
Browse files

BUG: Fix SharedForward in-tree detection

To detect when the launcher is running from the build tree we now test
if the directory containing it is the same as the build-tree directory
using an inode test instead of string comparison.  This makes it more
robust on case-insensitive filesystems and other quirky situations.
parent ea3cb185
No related branches found
No related tags found
No related merge requests found
...@@ -159,6 +159,7 @@ ...@@ -159,6 +159,7 @@
# include <process.h> # include <process.h>
#else #else
# include <unistd.h> # include <unistd.h>
# include <sys/stat.h>
#endif #endif
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
...@@ -283,6 +284,37 @@ static int kwsys_shared_forward_realpath(const char* in_path, char* out_path) ...@@ -283,6 +284,37 @@ static int kwsys_shared_forward_realpath(const char* in_path, char* out_path)
#endif #endif
} }
/*--------------------------------------------------------------------------*/
static int kwsys_shared_forward_samepath(const char* file1, const char* file2)
{
#if defined(_WIN32)
int result = 0;
HANDLE h1 = CreateFile(file1, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
HANDLE h2 = CreateFile(file2, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if(h1 != INVALID_HANDLE_VALUE && h2 != INVALID_HANDLE_VALUE)
{
BY_HANDLE_FILE_INFORMATION fi1;
BY_HANDLE_FILE_INFORMATION fi2;
GetFileInformationByHandle(h1, &fi1);
GetFileInformationByHandle(h2, &fi2);
result = (fi1.dwVolumeSerialNumber == fi2.dwVolumeSerialNumber &&
fi1.nFileIndexHigh == fi2.nFileIndexHigh &&
fi1.nFileIndexLow == fi2.nFileIndexLow);
}
CloseHandle(h1);
CloseHandle(h2);
return result;
#else
struct stat fs1, fs2;
return (stat(file1, &fs1) == 0 && stat(file2, &fs2) == 0 &&
memcmp(&fs2.st_dev, &fs1.st_dev, sizeof(fs1.st_dev)) == 0 &&
memcmp(&fs2.st_ino, &fs1.st_ino, sizeof(fs1.st_ino)) == 0 &&
fs2.st_size == fs1.st_size);
#endif
}
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/* Function to report a system error message. */ /* Function to report a system error message. */
static void kwsys_shared_forward_strerror(char* message) static void kwsys_shared_forward_strerror(char* message)
...@@ -535,7 +567,7 @@ static int kwsys_shared_forward_get_settings(const char* self_path, ...@@ -535,7 +567,7 @@ static int kwsys_shared_forward_get_settings(const char* self_path,
/* Check whether we are running in the build tree or an install tree. */ /* Check whether we are running in the build tree or an install tree. */
if(kwsys_shared_forward_realpath(build_path, build_path_real) && if(kwsys_shared_forward_realpath(build_path, build_path_real) &&
strcmp(self_path_real, build_path_real) == 0) kwsys_shared_forward_samepath(self_path_real, build_path_real))
{ {
/* Running in build tree. Use the build path and exe. */ /* Running in build tree. Use the build path and exe. */
search_path = search_path_build; search_path = search_path_build;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment