X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FWindows%2FPathV2.inc;h=e9ce5d9097a32e40af144729be329f198ae818e7;hb=2dbd7844e831caa107c6c9c57889f3d89b843ef3;hp=afb5533dc82eaf05f32a69a8429f180ca6e1606c;hpb=1dd2ee7bf4d848e368829cb01033f297afb674ab;p=oota-llvm.git diff --git a/lib/Support/Windows/PathV2.inc b/lib/Support/Windows/PathV2.inc index afb5533dc82..e9ce5d9097a 100644 --- a/lib/Support/Windows/PathV2.inc +++ b/lib/Support/Windows/PathV2.inc @@ -62,7 +62,7 @@ namespace { utf16.push_back(0); utf16.pop_back(); - return success; + return error_code::success(); } error_code UTF16ToUTF8(const wchar_t *utf16, size_t utf16_len, @@ -92,7 +92,7 @@ namespace { utf8.push_back(0); utf8.pop_back(); - return success; + return error_code::success(); } error_code TempDir(SmallVectorImpl &result) { @@ -108,7 +108,7 @@ namespace { } result.set_size(len); - return success; + return error_code::success(); } bool is_separator(const wchar_t value) { @@ -167,7 +167,7 @@ retry_cur_dir: if (len == 0) return windows_error(::GetLastError()); - return success; + return error_code::success(); } error_code copy_file(const Twine &from, const Twine &to, copy_option copt) { @@ -190,7 +190,7 @@ error_code copy_file(const Twine &from, const Twine &to, copy_option copt) { if (res == 0) return windows_error(::GetLastError()); - return success; + return error_code::success(); } error_code create_directory(const Twine &path, bool &existed) { @@ -210,7 +210,7 @@ error_code create_directory(const Twine &path, bool &existed) { } else existed = false; - return success; + return error_code::success(); } error_code create_hard_link(const Twine &to, const Twine &from) { @@ -229,7 +229,7 @@ error_code create_hard_link(const Twine &to, const Twine &from) { if (!::CreateHardLinkW(wide_from.begin(), wide_to.begin(), NULL)) return windows_error(::GetLastError()); - return success; + return error_code::success(); } error_code create_symlink(const Twine &to, const Twine &from) { @@ -252,7 +252,7 @@ error_code create_symlink(const Twine &to, const Twine &from) { if (!create_symbolic_link_api(wide_from.begin(), wide_to.begin(), 0)) return windows_error(::GetLastError()); - return success; + return error_code::success(); } error_code remove(const Twine &path, bool &existed) { @@ -285,7 +285,7 @@ error_code remove(const Twine &path, bool &existed) { existed = true; } - return success; + return error_code::success(); } error_code rename(const Twine &from, const Twine &to) { @@ -305,7 +305,7 @@ error_code rename(const Twine &from, const Twine &to) { MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING)) return windows_error(::GetLastError()); - return success; + return error_code::success(); } error_code resize_file(const Twine &path, uint64_t size) { @@ -347,70 +347,26 @@ error_code exists(const Twine &path, bool &result) { result = false; } else result = true; - return success; + return error_code::success(); } -error_code equivalent(const Twine &A, const Twine &B, bool &result) { - // Get arguments. - SmallString<128> a_storage; - SmallString<128> b_storage; - StringRef a = A.toStringRef(a_storage); - StringRef b = B.toStringRef(b_storage); - - // Convert to utf-16. - SmallVector wide_a; - SmallVector wide_b; - if (error_code ec = UTF8ToUTF16(a, wide_a)) return ec; - if (error_code ec = UTF8ToUTF16(b, wide_b)) return ec; - - ScopedFileHandle HandleB( - ::CreateFileW(wide_b.begin(), - 0, - FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, - 0, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, - 0)); - - ScopedFileHandle HandleA( - ::CreateFileW(wide_a.begin(), - 0, - FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, - 0, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, - 0)); - - // If both handles are invalid, it's an error. - if (!HandleA && !HandleB) - return windows_error(::GetLastError()); - - // If only one is invalid, it's false. - if (!HandleA || !HandleB) { - result = false; - return success; - } - - // Get file information. - BY_HANDLE_FILE_INFORMATION InfoA, InfoB; - if (!::GetFileInformationByHandle(HandleA, &InfoA)) - return windows_error(::GetLastError()); - if (!::GetFileInformationByHandle(HandleB, &InfoB)) - return windows_error(::GetLastError()); +bool equivalent(file_status A, file_status B) { + assert(status_known(A) && status_known(B)); + return A.FileIndexHigh == B.FileIndexHigh && + A.FileIndexLow == B.FileIndexLow && + A.FileSizeHigh == B.FileSizeHigh && + A.FileSizeLow == B.FileSizeLow && + A.LastWriteTimeHigh == B.LastWriteTimeHigh && + A.LastWriteTimeLow == B.LastWriteTimeLow && + A.VolumeSerialNumber == B.VolumeSerialNumber; +} - // See if it's all the same. - result = - InfoA.dwVolumeSerialNumber == InfoB.dwVolumeSerialNumber && - InfoA.nFileIndexHigh == InfoB.nFileIndexHigh && - InfoA.nFileIndexLow == InfoB.nFileIndexLow && - InfoA.nFileSizeHigh == InfoB.nFileSizeHigh && - InfoA.nFileSizeLow == InfoB.nFileSizeLow && - InfoA.ftLastWriteTime.dwLowDateTime == - InfoB.ftLastWriteTime.dwLowDateTime && - InfoA.ftLastWriteTime.dwHighDateTime == - InfoB.ftLastWriteTime.dwHighDateTime; - - return success; +error_code equivalent(const Twine &A, const Twine &B, bool &result) { + file_status fsA, fsB; + if (error_code ec = status(A, fsA)) return ec; + if (error_code ec = status(B, fsB)) return ec; + result = equivalent(fsA, fsB); + return error_code::success(); } error_code file_size(const Twine &path, uint64_t &result) { @@ -431,7 +387,7 @@ error_code file_size(const Twine &path, uint64_t &result) { (uint64_t(FileData.nFileSizeHigh) << (sizeof(FileData.nFileSizeLow) * 8)) + FileData.nFileSizeLow; - return success; + return error_code::success(); } static bool isReservedName(StringRef path) { @@ -464,11 +420,10 @@ error_code status(const Twine &path, file_status &result) { StringRef path8 = path.toStringRef(path_storage); if (isReservedName(path8)) { result = file_status(file_type::character_file); - return success; + return error_code::success(); } - if (error_code ec = UTF8ToUTF16(path8, - path_utf16)) + if (error_code ec = UTF8ToUTF16(path8, path_utf16)) return ec; DWORD attr = ::GetFileAttributesW(path_utf16.begin()); @@ -491,10 +446,31 @@ error_code status(const Twine &path, file_status &result) { if (attr & FILE_ATTRIBUTE_DIRECTORY) result = file_status(file_type::directory_file); - else + else { result = file_status(file_type::regular_file); + ScopedFileHandle h( + ::CreateFileW(path_utf16.begin(), + 0, // Attributes only. + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + 0)); + if (!h) + goto handle_status_error; + BY_HANDLE_FILE_INFORMATION Info; + if (!::GetFileInformationByHandle(h, &Info)) + goto handle_status_error; + result.FileIndexHigh = Info.nFileIndexHigh; + result.FileIndexLow = Info.nFileIndexLow; + result.FileSizeHigh = Info.nFileSizeHigh; + result.FileSizeLow = Info.nFileSizeLow; + result.LastWriteTimeHigh = Info.ftLastWriteTime.dwHighDateTime; + result.LastWriteTimeLow = Info.ftLastWriteTime.dwLowDateTime; + result.VolumeSerialNumber = Info.dwVolumeSerialNumber; + } - return success; + return error_code::success(); handle_status_error: error_code ec = windows_error(::GetLastError()); @@ -508,7 +484,7 @@ handle_status_error: return ec; } - return success; + return error_code::success(); } error_code unique_file(const Twine &model, int &result_fd, @@ -635,7 +611,7 @@ retry_create_file: } result_fd = fd; - return success; + return error_code::success(); } error_code get_magic(const Twine &path, uint32_t len, @@ -677,7 +653,7 @@ error_code get_magic(const Twine &path, uint32_t len, } result.set_size(len); - return success; + return error_code::success(); } error_code detail::directory_iterator_construct(detail::DirIterState &it, @@ -729,7 +705,7 @@ error_code detail::directory_iterator_construct(detail::DirIterState &it, path::append(directory_entry_path, directory_entry_name_utf8.str()); it.CurrentEntry = directory_entry(directory_entry_path.str()); - return success; + return error_code::success(); } error_code detail::directory_iterator_destruct(detail::DirIterState &it) { @@ -738,7 +714,7 @@ error_code detail::directory_iterator_destruct(detail::DirIterState &it) { ScopedFindHandle close(HANDLE(it.IterationHandle)); it.IterationHandle = 0; it.CurrentEntry = directory_entry(); - return success; + return error_code::success(); } error_code detail::directory_iterator_increment(detail::DirIterState &it) { @@ -764,7 +740,7 @@ error_code detail::directory_iterator_increment(detail::DirIterState &it) { return ec; it.CurrentEntry.replace_filename(Twine(directory_entry_path_utf8)); - return success; + return error_code::success(); } } // end namespace fs