|
|
@@ -250,17 +250,46 @@ inline int Chdir(const kwsys_stl::string& dir)
|
|
|
return _wchdir(KWSYS_NAMESPACE::Encoding::ToWide(dir).c_str());
|
|
|
#endif
|
|
|
}
|
|
|
-inline void Realpath(const kwsys_stl::string& path, kwsys_stl::string & resolved_path)
|
|
|
+inline void Realpath(const kwsys_stl::string& path,
|
|
|
+ kwsys_stl::string& resolved_path,
|
|
|
+ kwsys_stl::string* errorMessage = 0)
|
|
|
{
|
|
|
kwsys_stl::wstring tmp = KWSYS_NAMESPACE::Encoding::ToWide(path);
|
|
|
wchar_t *ptemp;
|
|
|
wchar_t fullpath[MAX_PATH];
|
|
|
- if( GetFullPathNameW(tmp.c_str(), sizeof(fullpath)/sizeof(fullpath[0]),
|
|
|
- fullpath, &ptemp) )
|
|
|
+ DWORD bufferLen = GetFullPathNameW(tmp.c_str(),
|
|
|
+ sizeof(fullpath) / sizeof(fullpath[0]),
|
|
|
+ fullpath, &ptemp);
|
|
|
+ if( bufferLen < sizeof(fullpath)/sizeof(fullpath[0]) )
|
|
|
{
|
|
|
resolved_path = KWSYS_NAMESPACE::Encoding::ToNarrow(fullpath);
|
|
|
KWSYS_NAMESPACE::SystemTools::ConvertToUnixSlashes(resolved_path);
|
|
|
}
|
|
|
+ else if(errorMessage)
|
|
|
+ {
|
|
|
+ if(bufferLen)
|
|
|
+ {
|
|
|
+ *errorMessage = "Destination path buffer size too small.";
|
|
|
+ }
|
|
|
+ else if(unsigned int errorId = GetLastError())
|
|
|
+ {
|
|
|
+ LPSTR message = NULL;
|
|
|
+ DWORD size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
|
|
|
+ | FORMAT_MESSAGE_FROM_SYSTEM
|
|
|
+ | FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
|
+ NULL, errorId,
|
|
|
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
|
+ (LPSTR)&message, 0, NULL);
|
|
|
+ *errorMessage = std::string(message, size);
|
|
|
+ LocalFree(message);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ *errorMessage = "Unknown error.";
|
|
|
+ }
|
|
|
+
|
|
|
+ resolved_path = "";
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
resolved_path = path;
|
|
|
@@ -287,15 +316,31 @@ inline int Chdir(const kwsys_stl::string& dir)
|
|
|
{
|
|
|
return chdir(dir.c_str());
|
|
|
}
|
|
|
-inline void Realpath(const kwsys_stl::string& path, kwsys_stl::string & resolved_path)
|
|
|
+inline void Realpath(const kwsys_stl::string& path,
|
|
|
+ kwsys_stl::string& resolved_path,
|
|
|
+ kwsys_stl::string* errorMessage = 0)
|
|
|
{
|
|
|
char resolved_name[KWSYS_SYSTEMTOOLS_MAXPATH];
|
|
|
|
|
|
+ errno = 0;
|
|
|
char *ret = realpath(path.c_str(), resolved_name);
|
|
|
if(ret)
|
|
|
{
|
|
|
resolved_path = ret;
|
|
|
}
|
|
|
+ else if(errorMessage)
|
|
|
+ {
|
|
|
+ if(errno)
|
|
|
+ {
|
|
|
+ *errorMessage = strerror(errno);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ *errorMessage = "Unknown error.";
|
|
|
+ }
|
|
|
+
|
|
|
+ resolved_path = "";
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
// if path resolution fails, return what was passed in
|
|
|
@@ -3046,10 +3091,11 @@ kwsys_stl::string SystemTools
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
-kwsys_stl::string SystemTools::GetRealPath(const kwsys_stl::string& path)
|
|
|
+kwsys_stl::string SystemTools::GetRealPath(const kwsys_stl::string& path,
|
|
|
+ kwsys_stl::string* errorMessage)
|
|
|
{
|
|
|
kwsys_stl::string ret;
|
|
|
- Realpath(path, ret);
|
|
|
+ Realpath(path, ret, errorMessage);
|
|
|
return ret;
|
|
|
}
|
|
|
|