diff --git a/include/llvm/System/Path.h b/include/llvm/System/Path.h index 34373ae6a37..578bb3cca08 100644 --- a/include/llvm/System/Path.h +++ b/include/llvm/System/Path.h @@ -40,17 +40,19 @@ namespace sys { uint32_t mode; ///< Mode of the file, if applicable uint32_t user; ///< User ID of owner, if applicable uint32_t group; ///< Group ID of owner, if applicable + uint64_t uniqueID; ///< A number to uniquely ID this file bool isDir : 1; ///< True if this is a directory. bool isFile : 1; ///< True if this is a file. FileStatus() : fileSize(0), modTime(0,0), mode(0777), user(999), - group(999), isDir(false) { } + group(999), uniqueID(0), isDir(false), isFile(false) { } TimeValue getTimestamp() const { return modTime; } uint64_t getSize() const { return fileSize; } uint32_t getMode() const { return mode; } uint32_t getUser() const { return user; } uint32_t getGroup() const { return group; } + uint32_t getUniqueID() const { return uniqueID; } }; /// This class provides an abstraction for the path to a file or directory diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index b155213ec62..5557282964e 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -375,6 +375,7 @@ Path::getFileStatus(FileStatus &info, bool update, std::string *ErrStr) const { status->mode = buf.st_mode; status->user = buf.st_uid; status->group = buf.st_gid; + status->uniqueID = uint64_t(buf.st_ino); status->isDir = S_ISDIR(buf.st_mode); status->isFile = S_ISREG(buf.st_mode); } diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc index 1f809ecfa56..f5edaa07edb 100644 --- a/lib/System/Win32/Path.inc +++ b/lib/System/Win32/Path.inc @@ -319,6 +319,13 @@ Path::getFileStatus(FileStatus &info, bool update, std::string *ErrStr) const { status->user = 9999; // Not applicable to Windows, so... status->group = 9999; // Not applicable to Windows, so... + // FIXME: this is only unique if the file is accessed by the same file path. + // How do we do this for C:\dir\file and ..\dir\file ? Unix has inode + // numbers, but the concept doesn't exist in Windows. + status->uniqueID = 0; + for (unsigned i = 0; i < path.length(); ++i) + status->uniqueID += path[i]; + __int64 ft = *reinterpret_cast<__int64*>(&fi.ftLastWriteTime); status->modTime.fromWin32Time(ft);