From fe01bf4a38c4b001d6d89aafde1fd53784d69a90 Mon Sep 17 00:00:00 2001 From: Rose <83477269+AtariDreams@users.noreply.github.com> Date: Mon, 6 Jun 2022 18:19:31 -0400 Subject: [PATCH 1/4] Refactor filesystem code for clarity This makes the code more readable as well as lowers operations to code paths that actually need them. --- stl/inc/cvt/one_one | 2 +- stl/inc/cvt/utf8 | 2 +- stl/inc/experimental/filesystem | 12 ++-- stl/inc/filesystem | 4 +- stl/src/filesys.cpp | 121 +++++++++++++++----------------- stl/src/filesystem.cpp | 100 +++++++++++++------------- 6 files changed, 118 insertions(+), 123 deletions(-) diff --git a/stl/inc/cvt/one_one b/stl/inc/cvt/one_one index 13b0e47eb0c..23b680d20ce 100644 --- a/stl/inc/cvt/one_one +++ b/stl/inc/cvt/one_one @@ -25,7 +25,7 @@ namespace stdext { using _Statype = _CSTD mbstate_t; _STL_DISABLE_DEPRECATED_WARNING - template class codecvt_one_one : public _STD diff --git a/stl/inc/cvt/utf8 b/stl/inc/cvt/utf8 index 76a61f773bb..161c03919f0 100644 --- a/stl/inc/cvt/utf8 +++ b/stl/inc/cvt/utf8 @@ -25,7 +25,7 @@ namespace stdext { using _Statype = _CSTD mbstate_t; _STL_DISABLE_DEPRECATED_WARNING - template + template class codecvt_utf8 : public _STD codecvt<_Elem, char, _Statype> { // facet for converting between _Elem and UTF-8 byte sequences diff --git a/stl/inc/experimental/filesystem b/stl/inc/experimental/filesystem index f4534b25650..0cd538ff644 100644 --- a/stl/inc/experimental/filesystem +++ b/stl/inc/experimental/filesystem @@ -283,7 +283,7 @@ struct _Path_cvt, } wstring_convert, wchar_t> _Wcvt; - wchar_t* _Last1 = &_Fname_wide[0]; + wchar_t* _Last1 = _Fname_wide; while (*_Last1 != L'\0') { ++_Last1; } - return _STD move(_Str.append(_Wcvt.to_bytes(&_Fname_wide[0], _Last1))); + return _STD move(_Str.append(_Wcvt.to_bytes(_Fname_wide, _Last1))); } }; @@ -359,7 +359,7 @@ struct _Path_cvt<_Char8_t, char, _Outtraits, _Xinvalid_argument("invalid UTF8 filename argument"); } - return _STD move(_Str.append(&_Fname_byte[0])); + return _STD move(_Str.append(_Fname_byte)); } }; @@ -1649,7 +1649,7 @@ public: } void pop() { // pop a level - if (1 < _Mylist.size()) { + if (_Mylist.size() > 1) { _Mylist.pop_front(); // something to pop, do it } } diff --git a/stl/inc/filesystem b/stl/inc/filesystem index 17192a3ba60..4ce98b73325 100644 --- a/stl/inc/filesystem +++ b/stl/inc/filesystem @@ -3526,12 +3526,12 @@ namespace filesystem { } _NODISCARD inline bool is_other(const path& _Path) { - // tests whether _Path is an other file (such as a junction) + // tests whether _Path is an "other" file (such as a junction) return _STD filesystem::is_other(_STD filesystem::status(_Path)); } _NODISCARD inline bool is_other(const path& _Path, error_code& _Ec) noexcept { - // tests whether _Path is an other file (such as a junction) + // tests whether _Path is an "other" file (such as a junction) return _STD filesystem::is_other(_STD filesystem::status(_Path, _Ec)); } diff --git a/stl/src/filesys.cpp b/stl/src/filesys.cpp index 9a68da5480d..1ed416bfa22 100644 --- a/stl/src/filesys.cpp +++ b/stl/src/filesys.cpp @@ -15,8 +15,6 @@ #include -#include "awint.hpp" - _FS_BEGIN static file_type _Map_mode(int _Mode) { // map Windows file attributes to file_status constexpr int _File_attribute_regular = @@ -60,12 +58,7 @@ _FS_DLL wchar_t* __CLRCALL_PURE_OR_CDECL _Read_dir( wchar_t (&_Dest)[_MAX_FILESYS_NAME], void* _Handle, file_type& _Ftype) { // read a directory entry WIN32_FIND_DATAW _Dentry; - for (;;) { - if (FindNextFileW(_Handle, &_Dentry) == 0) { // fail - _Ftype = file_type::unknown; - return _Strcpy(_Dest, L""); - } - + while (FindNextFileW(_Handle, &_Dentry) != 0) { if (_Dentry.cFileName[0] != L'.' || (_Dentry.cFileName[1] != L'\0' && (_Dentry.cFileName[1] != L'.' @@ -74,13 +67,16 @@ _FS_DLL wchar_t* __CLRCALL_PURE_OR_CDECL _Read_dir( return _Strcpy(_Dest, &_Dentry.cFileName[0]); } } + + _Ftype = file_type::unknown; + return _Strcpy(_Dest, L""); } static unsigned int _Filesys_code_page() { // determine appropriate code page #if defined(_ONECORE) return CP_ACP; #else // defined(_ONECORE) - if (AreFileApisANSI()) { + if (AreFileApisANSI() != 0) { return CP_ACP; } else { return CP_OEMCP; @@ -122,17 +118,16 @@ _FS_DLL void* __CLRCALL_PURE_OR_CDECL _Open_dir( && (_Dentry.cFileName[1] == L'\0' || _Dentry.cFileName[1] == L'.' && _Dentry.cFileName[2] == L'\0')) { // skip "." and ".." _Read_dir(_Dest, _Handle, _Ftype); - if (_Dest[0] != L'\0') { - return _Handle; + if (_Dest[0] == L'\0') { + // no entries, release handle + _Close_dir(_Handle); + return nullptr; } - - // no entries, release handle - _Close_dir(_Handle); - return nullptr; + return _Handle; } // get file type and return handle - _Strcpy(_Dest, &_Dentry.cFileName[0]); + _Strcpy(_Dest, _Dentry.cFileName); _Ftype = _Map_mode(_Dentry.dwFileAttributes); return _Handle; } @@ -161,21 +156,19 @@ _FS_DLL bool __CLRCALL_PURE_OR_CDECL _Current_set(const wchar_t* _Dirname) { _FS_DLL wchar_t* __CLRCALL_PURE_OR_CDECL _Symlink_get(wchar_t (&_Dest)[_MAX_FILESYS_NAME], const wchar_t*) { // get symlink -- DUMMY _Dest[0] = L'\0'; - return &_Dest[0]; + return _Dest; } _FS_DLL wchar_t* __CLRCALL_PURE_OR_CDECL _Temp_get(wchar_t (&_Dest)[_MAX_FILESYS_NAME]) { // get temp directory wchar_t _Dentry[MAX_PATH]; - return _Strcpy(_Dest, GetTempPathW(MAX_PATH, &_Dentry[0]) == 0 ? L"." : &_Dentry[0]); + return _Strcpy(_Dest, GetTempPathW(MAX_PATH, _Dentry) != 0 ? _Dentry : L"."); } _FS_DLL int __CLRCALL_PURE_OR_CDECL _Make_dir(const wchar_t* _Fname, const wchar_t*) { // make a new directory (ignore attributes) - int _Ans = CreateDirectoryW(_Fname, nullptr); - - if (_Ans != 0) { + if (CreateDirectoryW(_Fname, nullptr) != 0) { return 1; } else if (GetLastError() == ERROR_ALREADY_EXISTS) { return 0; @@ -191,26 +184,29 @@ _FS_DLL bool __CLRCALL_PURE_OR_CDECL _Remove_dir(const wchar_t* _Fname) { // rem _FS_DLL file_type __CLRCALL_PURE_OR_CDECL _Stat(const wchar_t* _Fname, perms* _Pmode) { // get file status WIN32_FILE_ATTRIBUTE_DATA _Data; - if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { + if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) != 0) { // get file type and return permissions if (_Pmode != nullptr) { constexpr perms _Write_perms = perms::owner_write | perms::group_write | perms::others_write; constexpr perms _Readonly_perms = perms::all & ~_Write_perms; - *_Pmode = _Data.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? _Readonly_perms : perms::all; + *_Pmode = (_Data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0u ? _Readonly_perms : perms::all; } return _Map_mode(_Data.dwFileAttributes); } // invalid, get error code - int _Errno = GetLastError(); - - if (_Errno == ERROR_BAD_NETPATH || _Errno == ERROR_BAD_PATHNAME || _Errno == ERROR_FILE_NOT_FOUND - || _Errno == ERROR_INVALID_DRIVE || _Errno == ERROR_INVALID_NAME || _Errno == ERROR_INVALID_PARAMETER - || _Errno == ERROR_PATH_NOT_FOUND) { + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_INVALID_NAME: + case ERROR_INVALID_DRIVE: + case ERROR_INVALID_PARAMETER: + case ERROR_BAD_NETPATH: + case ERROR_BAD_PATHNAME: return file_type::not_found; - } else { + default: return file_type::unknown; } } @@ -221,39 +217,39 @@ _FS_DLL file_type __CLRCALL_PURE_OR_CDECL _Lstat(const wchar_t* _Fname, perms* _ return _Stat(_Fname, _Pmode); // symlink not supported } -_FS_DLL unsigned long long __CLRCALL_PURE_OR_CDECL _Hard_links(const wchar_t* _Fname) { +_FS_DLL uintmax_t __CLRCALL_PURE_OR_CDECL _Hard_links(const wchar_t* _Fname) { // get hard link count HANDLE _Handle = _FilesysOpenFile(_Fname, FILE_READ_ATTRIBUTES, FILE_FLAG_BACKUP_SEMANTICS); + if (_Handle == INVALID_HANDLE_VALUE) { + return static_cast(-1); + } + #ifdef _CRT_APP FILE_STANDARD_INFO _Info = {0}; - bool _Ok = false; - if (_Handle != INVALID_HANDLE_VALUE) { // get file info - _Ok = GetFileInformationByHandleEx(_Handle, FileStandardInfo, &_Info, sizeof(_Info)) != 0; - CloseHandle(_Handle); - } - return _Ok ? _Info.NumberOfLinks : static_cast(-1); + // get file info + const auto _Ok = GetFileInformationByHandleEx(_Handle, FileStandardInfo, &_Info, sizeof(_Info)); + CloseHandle(_Handle); + return _Ok != 0 ? _Info.NumberOfLinks : static_cast(-1); #else // _CRT_APP BY_HANDLE_FILE_INFORMATION _Info = {0}; - bool _Ok = false; - if (_Handle != INVALID_HANDLE_VALUE) { // get file info - _Ok = GetFileInformationByHandle(_Handle, &_Info) != 0; - CloseHandle(_Handle); - } - return _Ok ? _Info.nNumberOfLinks : static_cast(-1); + // get file info + const auto _Ok = GetFileInformationByHandle(_Handle, &_Info); + CloseHandle(_Handle); + return _Ok != 0 ? _Info.nNumberOfLinks : static_cast(-1); #endif // _CRT_APP } -_FS_DLL unsigned long long __CLRCALL_PURE_OR_CDECL _File_size(const wchar_t* _Fname) { // get file size +_FS_DLL uintmax_t __CLRCALL_PURE_OR_CDECL _File_size(const wchar_t* _Fname) { // get file size WIN32_FILE_ATTRIBUTE_DATA _Data; - if (!GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { - return static_cast(-1); + if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) != 0) { + return static_cast(_Data.nFileSizeHigh) << 32 | _Data.nFileSizeLow; } else { - return static_cast(_Data.nFileSizeHigh) << 32 | _Data.nFileSizeLow; + return static_cast(-1); } } @@ -274,13 +270,13 @@ constexpr uint64_t _Win_ticks_from_epoch = ((1970 - 1601) * 365 + 3 * 24 + 17) * _FS_DLL int64_t __CLRCALL_PURE_OR_CDECL _Last_write_time(const wchar_t* _Fname) { // get last write time WIN32_FILE_ATTRIBUTE_DATA _Data; - if (!GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { + if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) == 0) { return -1; } // success, convert time - unsigned long long _Wtime = static_cast(_Data.ftLastWriteTime.dwHighDateTime) << 32 - | _Data.ftLastWriteTime.dwLowDateTime; + uint64_t _Wtime = + static_cast(_Data.ftLastWriteTime.dwHighDateTime) << 32 | _Data.ftLastWriteTime.dwLowDateTime; return static_cast(_Wtime - _Win_ticks_from_epoch); } @@ -294,9 +290,9 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Set_last_write_time(const wchar_t* _Fname, } // convert to FILETIME and set - unsigned long long _Wtime = static_cast(_When) + _Win_ticks_from_epoch; + uint64_t _Wtime = static_cast(_When) + _Win_ticks_from_epoch; FILETIME _Ft; - _Ft.dwLowDateTime = static_cast(_Wtime); // intentionally discard upper bits + _Ft.dwLowDateTime = static_cast(_Wtime & 0xFFFFFFFFUL); _Ft.dwHighDateTime = static_cast(_Wtime >> 32); int _Result = SetFileTime(_Handle, nullptr, nullptr, &_Ft); CloseHandle(_Handle); @@ -317,7 +313,7 @@ _FS_DLL space_info __CLRCALL_PURE_OR_CDECL _Statvfs(const wchar_t* _Fname) { _ULARGE_INTEGER _Capacity; _ULARGE_INTEGER _Free; - if (GetDiskFreeSpaceExW(_Devname.c_str(), &_Available, &_Capacity, &_Free)) { // convert values + if (GetDiskFreeSpaceExW(_Devname.c_str(), &_Available, &_Capacity, &_Free) != 0) { // convert values _Ans.capacity = _Capacity.QuadPart; _Ans.free = _Free.QuadPart; _Ans.available = _Available.QuadPart; @@ -351,10 +347,7 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Equivalent( } else if (!_Ok1 || !_Ok2) { return 0; } else { // test existing files for equivalence - return _Info1.VolumeSerialNumber != _Info2.VolumeSerialNumber - || memcmp(&_Info1.FileId, &_Info2.FileId, sizeof(_Info1.FileId)) != 0 - ? 0 - : 1; + return memcmp(&_Info1, &_Info2, sizeof(_FILE_ID_INFO)) == 0 ? 1 : 0; } #else // _CRT_APP BY_HANDLE_FILE_INFORMATION _Info1 = {0}; @@ -379,10 +372,10 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Equivalent( } else if (!_Ok1 || !_Ok2) { return 0; } else { // test existing files for equivalence - return _Info1.dwVolumeSerialNumber != _Info2.dwVolumeSerialNumber - || _Info1.nFileIndexHigh != _Info2.nFileIndexHigh || _Info1.nFileIndexLow != _Info2.nFileIndexLow - ? 0 - : 1; + return _Info1.dwVolumeSerialNumber == _Info2.dwVolumeSerialNumber + && _Info1.nFileIndexHigh == _Info2.nFileIndexHigh && _Info1.nFileIndexLow == _Info2.nFileIndexLow + ? 1 + : 0; } #endif // _CRT_APP } @@ -458,20 +451,22 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Chmod(const wchar_t* _Fname, perms _Newmode // change file mode to _Newmode WIN32_FILE_ATTRIBUTE_DATA _Data; - if (!GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { + if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) == 0) { return -1; } // got mode, alter readonly bit DWORD _Oldmode = _Data.dwFileAttributes; - DWORD _Mode = _Oldmode & ~FILE_ATTRIBUTE_READONLY; + DWORD _Mode = _Oldmode; constexpr perms _Write_perms = perms::owner_write | perms::group_write | perms::others_write; if ((_Newmode & _Write_perms) == perms::none) { _Mode |= FILE_ATTRIBUTE_READONLY; + } else { + _Mode &= ~FILE_ATTRIBUTE_READONLY; } - return _Mode == _Oldmode ? 0 : SetFileAttributesW(_Fname, _Mode) != 0 ? 0 : -1; + return _Mode == _Oldmode || SetFileAttributesW(_Fname, _Mode) != 0 ? 0 : -1; } _FS_END diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 6ec69b5988e..d935c146c03 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -78,7 +78,7 @@ namespace { // take lower bits to undo HRESULT_FROM_WIN32 return {false, __std_win_error{_Copy_result & 0x0000FFFFU}}; #else // ^^^ defined(_CRT_APP) ^^^ // vvv !defined(_CRT_APP) vvv - if (CopyFileW(_Source, _Target, _Fail_if_exists)) { + if (CopyFileW(_Source, _Target, static_cast(_Fail_if_exists)) != 0) { return {true, __std_win_error::_Success}; } @@ -89,7 +89,7 @@ namespace { [[nodiscard]] __std_win_error __stdcall _Create_symlink( const wchar_t* const _Symlink_file_name, const wchar_t* const _Target_file_name, const DWORD _Flags) noexcept { if (__vcrt_CreateSymbolicLinkW( - _Symlink_file_name, _Target_file_name, _Flags | 0x2 /* SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE */) + _Symlink_file_name, _Target_file_name, _Flags | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE) != 0) { return __std_win_error::_Success; } @@ -119,7 +119,7 @@ namespace { // read the last write time from _Handle and store it in _Last_write_filetime FILE_BASIC_INFO _Ex_info; if (GetFileInformationByHandleEx(_Handle, FileBasicInfo, &_Ex_info, sizeof(_Ex_info)) != 0) { - _CSTD memcpy(_Last_write_filetime, &_Ex_info.LastWriteTime, sizeof(*_Last_write_filetime)); + *_Last_write_filetime = _Ex_info.LastWriteTime.QuadPart; return __std_win_error::_Success; } @@ -128,13 +128,14 @@ namespace { [[nodiscard]] __std_win_error __stdcall _Get_file_id_by_handle( const HANDLE _Handle, _Out_ FILE_ID_INFO* const _Id) noexcept { - __std_win_error _Last_error; if (GetFileInformationByHandleEx(_Handle, FileIdInfo, _Id, sizeof(*_Id)) != 0) { // if we could get FILE_ID_INFO, use that as the source of truth return __std_win_error::_Success; } - _Last_error = __std_win_error{GetLastError()}; + __std_win_error _Last_error = __std_win_error{GetLastError()}; + +#ifndef _CRT_APP switch (_Last_error) { case __std_win_error::_Not_supported: case __std_win_error::_Invalid_parameter: @@ -143,7 +144,6 @@ namespace { return _Last_error; // real error, bail to the caller } -#ifndef _CRT_APP // try GetFileInformationByHandle as a fallback BY_HANDLE_FILE_INFORMATION _Info; if (GetFileInformationByHandle(_Handle, &_Info) != 0) { @@ -165,7 +165,8 @@ namespace { // See minwinbase.h and WinBase.h. FILE_DISPOSITION_INFO_EX _Info_ex{FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS}; if (SetFileInformationByHandle( - reinterpret_cast(_Handle), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex))) { + reinterpret_cast(_Handle), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex)) + != 0) { return __std_win_error::_Success; } @@ -181,14 +182,15 @@ namespace { } FILE_DISPOSITION_INFO _Info{/* .Delete= */ TRUE}; - if (SetFileInformationByHandle(reinterpret_cast(_Handle), FileDispositionInfo, &_Info, sizeof(_Info))) { + if (SetFileInformationByHandle(reinterpret_cast(_Handle), FileDispositionInfo, &_Info, sizeof(_Info)) + != 0) { return __std_win_error::_Success; } return __std_win_error{GetLastError()}; } - [[nodiscard]] unsigned long long _Merge_to_ull(unsigned long _High, unsigned long _Low) noexcept { + [[nodiscard]] unsigned long long _Merge_to_ull(DWORD _High, DWORD _Low) noexcept { return (static_cast(_High) << 32) | static_cast(_Low); } } // unnamed namespace @@ -272,14 +274,14 @@ static_assert(alignof(WIN32_FIND_DATAW) == alignof(__std_fs_find_data)); } void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle _Handle) noexcept { - if (_Handle != __std_fs_dir_handle::_Invalid && !FindClose(reinterpret_cast(_Handle))) { + if (_Handle != __std_fs_dir_handle::_Invalid && FindClose(reinterpret_cast(_Handle)) == 0) { terminate(); } } [[nodiscard]] __std_win_error __stdcall __std_fs_directory_iterator_advance( _In_ const __std_fs_dir_handle _Handle, _Out_ __std_fs_find_data* const _Results) noexcept { - if (FindNextFileW(reinterpret_cast(_Handle), reinterpret_cast(_Results))) { + if (FindNextFileW(reinterpret_cast(_Handle), reinterpret_cast(_Results)) != 0) { return __std_win_error::_Success; } @@ -292,7 +294,7 @@ void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle } #if !defined(_ONECORE) - if (!AreFileApisANSI()) { + if (AreFileApisANSI() == 0) { return __std_code_page{CP_OEMCP}; } #endif // !defined(_ONECORE) @@ -325,8 +327,8 @@ void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle _Result._Len = WideCharToMultiByte(static_cast(_Code_page), WC_NO_BEST_FIT_CHARS, _Input_str, _Input_len, _Output_str, _Output_len, nullptr, &_Used_default_char); - if (_Used_default_char) { // Report round-tripping failure with ERROR_NO_UNICODE_TRANSLATION, - // "No mapping for the Unicode character exists in the target multi-byte code page." + if (_Used_default_char != 0) { // Report round-tripping failure with ERROR_NO_UNICODE_TRANSLATION, + // "No mapping for the Unicode character exists in the target multi-byte code page." return {0, __std_win_error{ERROR_NO_UNICODE_TRANSLATION}}; } } @@ -434,10 +436,7 @@ void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle return {false, _Last_error}; } - if (_Source_id.VolumeSerialNumber == _Target_id.VolumeSerialNumber - && _CSTD memcmp(_Source_id.FileId.Identifier, _Target_id.FileId.Identifier, - sizeof(_Source_id.FileId.Identifier)) - == 0) { + if (_CSTD memcmp(&_Source_id, &_Target_id, sizeof(FILE_ID_INFO)) == 0) { // the files are equivalent return {false, __std_win_error::_Sharing_violation}; } @@ -500,9 +499,9 @@ _Success_(return == __std_win_error::_Success) __std_win_error _Out_writes_bytes_(_Buffer_size) void* const _Buffer, _In_ const unsigned long _Buffer_size) noexcept { unsigned long _Bytes_returned; // If DeviceIoControl fails, it returns 0 and _Bytes_returned is 0. - if (0 - == DeviceIoControl(reinterpret_cast(_Handle), FSCTL_GET_REPARSE_POINT, nullptr, 0, _Buffer, - _Buffer_size, &_Bytes_returned, nullptr)) { + if (DeviceIoControl(reinterpret_cast(_Handle), FSCTL_GET_REPARSE_POINT, nullptr, 0, _Buffer, _Buffer_size, + &_Bytes_returned, nullptr) + == 0) { return __std_win_error{GetLastError()}; } @@ -539,7 +538,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error return _Last_error; } - if (SetFileTime(_Handle._Get(), nullptr, nullptr, reinterpret_cast(&_Last_write_filetime))) { + if (SetFileTime(_Handle._Get(), nullptr, nullptr, reinterpret_cast(&_Last_write_filetime)) != 0) { return __std_win_error::_Success; } @@ -572,7 +571,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // Windows 10 1809 added support for FILE_DISPOSITION_FLAG_IGNORE_READONLY_ATTRIBUTE. FILE_DISPOSITION_INFO_EX _Info_ex{FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS | FILE_DISPOSITION_FLAG_IGNORE_READONLY_ATTRIBUTE}; - if (SetFileInformationByHandle(_Handle._Get(), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex))) { + if (SetFileInformationByHandle(_Handle._Get(), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex)) != 0) { return {true, __std_win_error::_Success}; } @@ -597,14 +596,14 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Last_error == __std_win_error::_Access_denied && _Able_to_change_attributes) { FILE_BASIC_INFO _Basic_info; - if (!GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { + if (GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { return {false, __std_win_error{GetLastError()}}; } // check if FILE_ATTRIBUTE_READONLY is set - if (_Basic_info.FileAttributes & FILE_ATTRIBUTE_READONLY) { + if ((_Basic_info.FileAttributes & FILE_ATTRIBUTE_READONLY) != 0u) { // try to remove FILE_ATTRIBUTE_READONLY _Basic_info.FileAttributes ^= FILE_ATTRIBUTE_READONLY; - if (!SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { + if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { return {false, __std_win_error{GetLastError()}}; } // removed FILE_ATTRIBUTE_READONLY, now try to set the delete flag again @@ -615,7 +614,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // looks like we failed to set the delete flag, after clearing the FILE_ATTRIBUTE_READONLY flag // perform rollback _Basic_info.FileAttributes |= FILE_ATTRIBUTE_READONLY; - if (!SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { + if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { return {false, __std_win_error{GetLastError()}}; } return {false, _Last_error}; @@ -638,7 +637,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } const DWORD _Readonly_test = _Readonly ? FILE_ATTRIBUTE_READONLY : 0; - if ((_Old_attributes & FILE_ATTRIBUTE_REPARSE_POINT) && _Follow_symlinks) { + if ((_Old_attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0u && _Follow_symlinks) { __std_win_error _Err; _STD _Fs_file _Handle(_Path, __std_access_rights::_File_read_attributes | __std_access_rights::_File_write_attributes, @@ -649,7 +648,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } FILE_BASIC_INFO _Basic_info; - if (!GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { + if (GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { return __std_win_error{GetLastError()}; } @@ -658,7 +657,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } _Basic_info.FileAttributes ^= FILE_ATTRIBUTE_READONLY; - if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { + if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) != 0) { return __std_win_error::_Success; } @@ -669,7 +668,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error return __std_win_error::_Success; } - if (SetFileAttributesW(_Path, _Old_attributes ^ FILE_ATTRIBUTE_READONLY)) { + if (SetFileAttributesW(_Path, _Old_attributes ^ FILE_ATTRIBUTE_READONLY) != 0) { return __std_win_error::_Success; } @@ -678,7 +677,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error [[nodiscard]] __std_win_error __stdcall __std_fs_rename( _In_z_ const wchar_t* const _Source, _In_z_ const wchar_t* const _Target) noexcept { - if (MoveFileExW(_Source, _Target, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING)) { + if (MoveFileExW(_Source, _Target, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0) { return __std_win_error::_Success; } @@ -711,7 +710,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error const auto _Available_c = reinterpret_cast(_Available); const auto _Total_bytes_c = reinterpret_cast(_Total_bytes); const auto _Free_bytes_c = reinterpret_cast(_Free_bytes); - if (GetDiskFreeSpaceExW(_Target, _Available_c, _Total_bytes_c, _Free_bytes_c)) { + if (GetDiskFreeSpaceExW(_Target, _Available_c, _Total_bytes_c, _Free_bytes_c) != 0) { return __std_win_error::_Success; } @@ -770,7 +769,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } while (*_Cursor != L'\\'); *_Cursor = L'\0'; - if (GetDiskFreeSpaceExW(_Ptr, _Available_c, _Total_bytes_c, _Free_bytes_c)) { + if (GetDiskFreeSpaceExW(_Ptr, _Available_c, _Total_bytes_c, _Free_bytes_c) != 0) { return __std_win_error::_Success; } @@ -793,11 +792,11 @@ _Success_(return == __std_win_error::_Success) __std_win_error // Effects: If exists(p) is false or is_directory(p) is false, an error is reported const DWORD _Attributes = GetFileAttributesW(_Target); - if (_Attributes == INVALID_FILE_ATTRIBUTES || !(_Attributes & FILE_ATTRIBUTE_DIRECTORY)) { + if (_Attributes == INVALID_FILE_ATTRIBUTES || (_Attributes & FILE_ATTRIBUTE_DIRECTORY) == 0u) { return {_Size, __std_win_error::_Max}; } - if (_Attributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if ((_Attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0u) { __std_fs_file_handle _Handle; const auto _Last_error = __std_fs_open_handle( &_Handle, _Target, __std_access_rights::_File_read_attributes, __std_fs_file_flags::_Backup_semantics); @@ -841,7 +840,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // GetFileAttributesExW/FindFirstFileW would return the right answer WIN32_FILE_ATTRIBUTE_DATA _Data; - if (!GetFileAttributesExW(_Path, GetFileExInfoStandard, &_Data)) { + if (GetFileAttributesExW(_Path, GetFileExInfoStandard, &_Data) == 0) { // In some cases, ERROR_SHARING_VIOLATION is returned from GetFileAttributesExW; // FindFirstFileW will work in those cases if we have read permissions on the directory. if (const __std_win_error _Last_error{GetLastError()}; @@ -899,7 +898,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Bitmask_includes(_Flags, _Basic_info_data | __std_fs_stats_flags::_Reparse_tag)) { FILE_BASIC_INFO _Info; - if (!GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Info, sizeof(_Info))) { + if (GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Info, sizeof(_Info)) == 0) { return __std_win_error{GetLastError()}; } @@ -909,9 +908,10 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Bitmask_includes(_Flags, __std_fs_stats_flags::_Reparse_tag)) { // Calling GetFileInformationByHandleEx with FileAttributeTagInfo fails on FAT file system with // ERROR_INVALID_PARAMETER. We avoid calling this for non-reparse-points. - if (_Info.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if ((_Info.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0u) { FILE_ATTRIBUTE_TAG_INFO _TagInfo; - if (!GetFileInformationByHandleEx(_Handle._Get(), FileAttributeTagInfo, &_TagInfo, sizeof(_TagInfo))) { + if (GetFileInformationByHandleEx(_Handle._Get(), FileAttributeTagInfo, &_TagInfo, sizeof(_TagInfo)) + == 0) { return __std_win_error{GetLastError()}; } @@ -925,7 +925,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Bitmask_includes(_Flags, _Standard_info_data)) { FILE_STANDARD_INFO _Info; - if (!GetFileInformationByHandleEx(_Handle._Get(), FileStandardInfo, &_Info, sizeof(_Info))) { + if (GetFileInformationByHandleEx(_Handle._Get(), FileStandardInfo, &_Info, sizeof(_Info)) == 0) { return __std_win_error{GetLastError()}; } @@ -945,7 +945,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error [[nodiscard]] __std_fs_create_directory_result __stdcall __std_fs_create_directory( _In_z_ const wchar_t* const _New_directory) noexcept { - if (CreateDirectoryW(_New_directory, nullptr)) { + if (CreateDirectoryW(_New_directory, nullptr) != 0) { return {true, __std_win_error::_Success}; } @@ -970,7 +970,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error (void) _Template_directory; return __std_fs_create_directory(_New_directory); #else // ^^^ defined(_CRT_APP) ^^^ // vvv !defined(_CRT_APP) vvv - if (CreateDirectoryExW(_Template_directory, _New_directory, nullptr)) { + if (CreateDirectoryExW(_Template_directory, _New_directory, nullptr) != 0) { return {true, __std_win_error::_Success}; } @@ -989,20 +989,20 @@ _Success_(return == __std_win_error::_Success) __std_win_error // If getting the path failed, GetCurrentDirectoryW returns 0; otherwise, returns the size of the expected // directory. const auto _Size = GetCurrentDirectoryW(_Target_size, _Target); - if (_Size == 0 || _Size > _Target_size) { - return {_Size, __std_win_error{GetLastError()}}; + if (_Size != 0 && _Size <= _Target_size) { + return {_Size, __std_win_error::_Success}; } - return {_Size, __std_win_error::_Success}; + return {_Size, __std_win_error{GetLastError()}}; } [[nodiscard]] __std_win_error __stdcall __std_fs_set_current_path(_In_z_ const wchar_t* const _Target) noexcept { // If setting the path failed, SetCurrentDirectoryW returns 0; otherwise returns non-zero. - const auto _Succeeded = SetCurrentDirectoryW(_Target); - if (_Succeeded == 0) { - return __std_win_error{GetLastError()}; + if (SetCurrentDirectoryW(_Target) != 0) { + return __std_win_error::_Success; } - return __std_win_error::_Success; + + return __std_win_error{GetLastError()}; } _END_EXTERN_C From 506db9d8d3236ada8857ada79e150acc1e6ca393 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 12 Jun 2022 17:48:29 -0700 Subject: [PATCH 2/4] Use direct-initialization. --- stl/src/filesystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index d935c146c03..4c712b9dca2 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -133,7 +133,7 @@ namespace { return __std_win_error::_Success; } - __std_win_error _Last_error = __std_win_error{GetLastError()}; + __std_win_error _Last_error{GetLastError()}; #ifndef _CRT_APP switch (_Last_error) { From 63f8794293ef56ee07d76cec8f44d829056e1429 Mon Sep 17 00:00:00 2001 From: Rose <83477269+AtariDreams@users.noreply.github.com> Date: Tue, 21 Jun 2022 09:13:07 -0400 Subject: [PATCH 3/4] Update stl/src/filesystem.cpp Co-authored-by: nicole mazzuca <83086508+strega-nil-ms@users.noreply.github.com> --- stl/src/filesystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 4c712b9dca2..7b6bc79c4ed 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -78,7 +78,7 @@ namespace { // take lower bits to undo HRESULT_FROM_WIN32 return {false, __std_win_error{_Copy_result & 0x0000FFFFU}}; #else // ^^^ defined(_CRT_APP) ^^^ // vvv !defined(_CRT_APP) vvv - if (CopyFileW(_Source, _Target, static_cast(_Fail_if_exists)) != 0) { + if (CopyFileW(_Source, _Target, _Fail_if_exists)) { return {true, __std_win_error::_Success}; } From ff3ff3db98819244e1b2930c35491805681f1e39 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 21 Jun 2022 19:38:03 -0700 Subject: [PATCH 4/4] Directly test BOOL and BOOLEAN with `if (val)` or `if (!val)`. This also reverses the `DeviceIoControl()` test to become if-success. --- stl/src/filesys.cpp | 28 +++++++-------- stl/src/filesystem.cpp | 79 ++++++++++++++++++++---------------------- 2 files changed, 51 insertions(+), 56 deletions(-) diff --git a/stl/src/filesys.cpp b/stl/src/filesys.cpp index 1ed416bfa22..4ef5b02356a 100644 --- a/stl/src/filesys.cpp +++ b/stl/src/filesys.cpp @@ -58,7 +58,7 @@ _FS_DLL wchar_t* __CLRCALL_PURE_OR_CDECL _Read_dir( wchar_t (&_Dest)[_MAX_FILESYS_NAME], void* _Handle, file_type& _Ftype) { // read a directory entry WIN32_FIND_DATAW _Dentry; - while (FindNextFileW(_Handle, &_Dentry) != 0) { + while (FindNextFileW(_Handle, &_Dentry)) { if (_Dentry.cFileName[0] != L'.' || (_Dentry.cFileName[1] != L'\0' && (_Dentry.cFileName[1] != L'.' @@ -76,7 +76,7 @@ static unsigned int _Filesys_code_page() { // determine appropriate code page #if defined(_ONECORE) return CP_ACP; #else // defined(_ONECORE) - if (AreFileApisANSI() != 0) { + if (AreFileApisANSI()) { return CP_ACP; } else { return CP_OEMCP; @@ -168,7 +168,7 @@ _FS_DLL wchar_t* __CLRCALL_PURE_OR_CDECL _Temp_get(wchar_t (&_Dest)[_MAX_FILESYS _FS_DLL int __CLRCALL_PURE_OR_CDECL _Make_dir(const wchar_t* _Fname, const wchar_t*) { // make a new directory (ignore attributes) - if (CreateDirectoryW(_Fname, nullptr) != 0) { + if (CreateDirectoryW(_Fname, nullptr)) { return 1; } else if (GetLastError() == ERROR_ALREADY_EXISTS) { return 0; @@ -184,7 +184,7 @@ _FS_DLL bool __CLRCALL_PURE_OR_CDECL _Remove_dir(const wchar_t* _Fname) { // rem _FS_DLL file_type __CLRCALL_PURE_OR_CDECL _Stat(const wchar_t* _Fname, perms* _Pmode) { // get file status WIN32_FILE_ATTRIBUTE_DATA _Data; - if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) != 0) { + if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { // get file type and return permissions if (_Pmode != nullptr) { constexpr perms _Write_perms = perms::owner_write | perms::group_write | perms::others_write; @@ -231,14 +231,14 @@ _FS_DLL uintmax_t __CLRCALL_PURE_OR_CDECL _Hard_links(const wchar_t* _Fname) { // get file info const auto _Ok = GetFileInformationByHandleEx(_Handle, FileStandardInfo, &_Info, sizeof(_Info)); CloseHandle(_Handle); - return _Ok != 0 ? _Info.NumberOfLinks : static_cast(-1); + return _Ok ? _Info.NumberOfLinks : static_cast(-1); #else // _CRT_APP BY_HANDLE_FILE_INFORMATION _Info = {0}; // get file info const auto _Ok = GetFileInformationByHandle(_Handle, &_Info); CloseHandle(_Handle); - return _Ok != 0 ? _Info.nNumberOfLinks : static_cast(-1); + return _Ok ? _Info.nNumberOfLinks : static_cast(-1); #endif // _CRT_APP } @@ -246,7 +246,7 @@ _FS_DLL uintmax_t __CLRCALL_PURE_OR_CDECL _Hard_links(const wchar_t* _Fname) { _FS_DLL uintmax_t __CLRCALL_PURE_OR_CDECL _File_size(const wchar_t* _Fname) { // get file size WIN32_FILE_ATTRIBUTE_DATA _Data; - if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) != 0) { + if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { return static_cast(_Data.nFileSizeHigh) << 32 | _Data.nFileSizeLow; } else { return static_cast(-1); @@ -270,7 +270,7 @@ constexpr uint64_t _Win_ticks_from_epoch = ((1970 - 1601) * 365 + 3 * 24 + 17) * _FS_DLL int64_t __CLRCALL_PURE_OR_CDECL _Last_write_time(const wchar_t* _Fname) { // get last write time WIN32_FILE_ATTRIBUTE_DATA _Data; - if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) == 0) { + if (!GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { return -1; } @@ -313,7 +313,7 @@ _FS_DLL space_info __CLRCALL_PURE_OR_CDECL _Statvfs(const wchar_t* _Fname) { _ULARGE_INTEGER _Capacity; _ULARGE_INTEGER _Free; - if (GetDiskFreeSpaceExW(_Devname.c_str(), &_Available, &_Capacity, &_Free) != 0) { // convert values + if (GetDiskFreeSpaceExW(_Devname.c_str(), &_Available, &_Capacity, &_Free)) { // convert values _Ans.capacity = _Capacity.QuadPart; _Ans.free = _Free.QuadPart; _Ans.available = _Available.QuadPart; @@ -388,7 +388,7 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Link(const wchar_t* _Fname1, const wchar_t* (void) _Fname2; return errno = EDOM; // hardlinks not supported #else // _CRT_APP - return CreateHardLinkW(_Fname2, _Fname1, nullptr) != 0 ? 0 : GetLastError(); + return CreateHardLinkW(_Fname2, _Fname1, nullptr) ? 0 : GetLastError(); #endif // _CRT_APP } @@ -399,7 +399,7 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Symlink(const wchar_t* _Fname1, const wchar (void) _Fname2; return errno = EDOM; // symlinks not supported #else // _CRT_APP - return CreateSymbolicLinkW(_Fname2, _Fname1, 0) != 0 ? 0 : GetLastError(); + return CreateSymbolicLinkW(_Fname2, _Fname1, 0) ? 0 : GetLastError(); #endif // _CRT_APP } @@ -442,7 +442,7 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Copy_file(const wchar_t* _Fname1, const wch // take lower bits to undo HRESULT_FROM_WIN32 return _Copy_result & 0x0000FFFFU; #else // defined(_ONECORE) - return CopyFileW(_Fname1, _Fname2, 0) != 0 ? 0 : GetLastError(); + return CopyFileW(_Fname1, _Fname2, 0) ? 0 : GetLastError(); #endif // defined(_ONECORE) } @@ -451,7 +451,7 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Chmod(const wchar_t* _Fname, perms _Newmode // change file mode to _Newmode WIN32_FILE_ATTRIBUTE_DATA _Data; - if (GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data) == 0) { + if (!GetFileAttributesExW(_Fname, GetFileExInfoStandard, &_Data)) { return -1; } @@ -467,6 +467,6 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Chmod(const wchar_t* _Fname, perms _Newmode _Mode &= ~FILE_ATTRIBUTE_READONLY; } - return _Mode == _Oldmode || SetFileAttributesW(_Fname, _Mode) != 0 ? 0 : -1; + return _Mode == _Oldmode || SetFileAttributesW(_Fname, _Mode) ? 0 : -1; } _FS_END diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 7b6bc79c4ed..10303345f4c 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -89,14 +89,13 @@ namespace { [[nodiscard]] __std_win_error __stdcall _Create_symlink( const wchar_t* const _Symlink_file_name, const wchar_t* const _Target_file_name, const DWORD _Flags) noexcept { if (__vcrt_CreateSymbolicLinkW( - _Symlink_file_name, _Target_file_name, _Flags | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE) - != 0) { + _Symlink_file_name, _Target_file_name, _Flags | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)) { return __std_win_error::_Success; } DWORD _Last_error = GetLastError(); if (_Last_error == ERROR_INVALID_PARAMETER) { - if (__vcrt_CreateSymbolicLinkW(_Symlink_file_name, _Target_file_name, _Flags) != 0) { + if (__vcrt_CreateSymbolicLinkW(_Symlink_file_name, _Target_file_name, _Flags)) { return __std_win_error::_Success; } @@ -118,7 +117,7 @@ namespace { const HANDLE _Handle, long long* const _Last_write_filetime) { // read the last write time from _Handle and store it in _Last_write_filetime FILE_BASIC_INFO _Ex_info; - if (GetFileInformationByHandleEx(_Handle, FileBasicInfo, &_Ex_info, sizeof(_Ex_info)) != 0) { + if (GetFileInformationByHandleEx(_Handle, FileBasicInfo, &_Ex_info, sizeof(_Ex_info))) { *_Last_write_filetime = _Ex_info.LastWriteTime.QuadPart; return __std_win_error::_Success; } @@ -128,7 +127,7 @@ namespace { [[nodiscard]] __std_win_error __stdcall _Get_file_id_by_handle( const HANDLE _Handle, _Out_ FILE_ID_INFO* const _Id) noexcept { - if (GetFileInformationByHandleEx(_Handle, FileIdInfo, _Id, sizeof(*_Id)) != 0) { + if (GetFileInformationByHandleEx(_Handle, FileIdInfo, _Id, sizeof(*_Id))) { // if we could get FILE_ID_INFO, use that as the source of truth return __std_win_error::_Success; } @@ -146,7 +145,7 @@ namespace { // try GetFileInformationByHandle as a fallback BY_HANDLE_FILE_INFORMATION _Info; - if (GetFileInformationByHandle(_Handle, &_Info) != 0) { + if (GetFileInformationByHandle(_Handle, &_Info)) { _Id->VolumeSerialNumber = _Info.dwVolumeSerialNumber; _CSTD memcpy(&_Id->FileId.Identifier[0], &_Info.nFileIndexHigh, 8); _CSTD memset(&_Id->FileId.Identifier[8], 0, 8); @@ -165,8 +164,7 @@ namespace { // See minwinbase.h and WinBase.h. FILE_DISPOSITION_INFO_EX _Info_ex{FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS}; if (SetFileInformationByHandle( - reinterpret_cast(_Handle), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex)) - != 0) { + reinterpret_cast(_Handle), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex))) { return __std_win_error::_Success; } @@ -182,8 +180,7 @@ namespace { } FILE_DISPOSITION_INFO _Info{/* .Delete= */ TRUE}; - if (SetFileInformationByHandle(reinterpret_cast(_Handle), FileDispositionInfo, &_Info, sizeof(_Info)) - != 0) { + if (SetFileInformationByHandle(reinterpret_cast(_Handle), FileDispositionInfo, &_Info, sizeof(_Info))) { return __std_win_error::_Success; } @@ -214,7 +211,7 @@ _EXTERN_C } void __stdcall __std_fs_close_handle(const __std_fs_file_handle _Handle) noexcept { // calls CloseHandle - if (_Handle != __std_fs_file_handle::_Invalid && CloseHandle(reinterpret_cast(_Handle)) == 0) { + if (_Handle != __std_fs_file_handle::_Invalid && !CloseHandle(reinterpret_cast(_Handle))) { terminate(); } } @@ -226,7 +223,7 @@ void __stdcall __std_fs_close_handle(const __std_fs_file_handle _Handle) noexcep const HANDLE _As_plain_handle = reinterpret_cast(_Handle); FILE_BASIC_INFO _Ex_info; - if (GetFileInformationByHandleEx(_As_plain_handle, FileBasicInfo, &_Ex_info, sizeof(_Ex_info)) != 0) { + if (GetFileInformationByHandleEx(_As_plain_handle, FileBasicInfo, &_Ex_info, sizeof(_Ex_info))) { *_File_attributes = _Ex_info.FileAttributes; return __std_win_error::_Success; } @@ -274,14 +271,14 @@ static_assert(alignof(WIN32_FIND_DATAW) == alignof(__std_fs_find_data)); } void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle _Handle) noexcept { - if (_Handle != __std_fs_dir_handle::_Invalid && FindClose(reinterpret_cast(_Handle)) == 0) { + if (_Handle != __std_fs_dir_handle::_Invalid && !FindClose(reinterpret_cast(_Handle))) { terminate(); } } [[nodiscard]] __std_win_error __stdcall __std_fs_directory_iterator_advance( _In_ const __std_fs_dir_handle _Handle, _Out_ __std_fs_find_data* const _Results) noexcept { - if (FindNextFileW(reinterpret_cast(_Handle), reinterpret_cast(_Results)) != 0) { + if (FindNextFileW(reinterpret_cast(_Handle), reinterpret_cast(_Results))) { return __std_win_error::_Success; } @@ -294,7 +291,7 @@ void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle } #if !defined(_ONECORE) - if (AreFileApisANSI() == 0) { + if (!AreFileApisANSI()) { return __std_code_page{CP_OEMCP}; } #endif // !defined(_ONECORE) @@ -327,8 +324,8 @@ void __stdcall __std_fs_directory_iterator_close(_In_ const __std_fs_dir_handle _Result._Len = WideCharToMultiByte(static_cast(_Code_page), WC_NO_BEST_FIT_CHARS, _Input_str, _Input_len, _Output_str, _Output_len, nullptr, &_Used_default_char); - if (_Used_default_char != 0) { // Report round-tripping failure with ERROR_NO_UNICODE_TRANSLATION, - // "No mapping for the Unicode character exists in the target multi-byte code page." + if (_Used_default_char) { // Report round-tripping failure with ERROR_NO_UNICODE_TRANSLATION, + // "No mapping for the Unicode character exists in the target multi-byte code page." return {0, __std_win_error{ERROR_NO_UNICODE_TRANSLATION}}; } } @@ -482,7 +479,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error (void) _Existing_file_name; return __std_win_error::_Not_supported; #else // ^^^ defined(_CRT_APP) ^^^ // vvv !defined(_CRT_APP) vvv - if (CreateHardLinkW(_File_name, _Existing_file_name, nullptr) != 0) { + if (CreateHardLinkW(_File_name, _Existing_file_name, nullptr)) { return __std_win_error::_Success; } @@ -498,14 +495,13 @@ _Success_(return == __std_win_error::_Success) __std_win_error [[nodiscard]] __std_win_error __stdcall __std_fs_read_reparse_data_buffer(_In_ const __std_fs_file_handle _Handle, _Out_writes_bytes_(_Buffer_size) void* const _Buffer, _In_ const unsigned long _Buffer_size) noexcept { unsigned long _Bytes_returned; - // If DeviceIoControl fails, it returns 0 and _Bytes_returned is 0. if (DeviceIoControl(reinterpret_cast(_Handle), FSCTL_GET_REPARSE_POINT, nullptr, 0, _Buffer, _Buffer_size, - &_Bytes_returned, nullptr) - == 0) { - return __std_win_error{GetLastError()}; + &_Bytes_returned, nullptr)) { + return __std_win_error::_Success; } - return __std_win_error::_Success; + // If DeviceIoControl fails, _Bytes_returned is 0. + return __std_win_error{GetLastError()}; } [[nodiscard]] _Success_(return == __std_win_error::_Success) __std_win_error @@ -538,7 +534,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error return _Last_error; } - if (SetFileTime(_Handle._Get(), nullptr, nullptr, reinterpret_cast(&_Last_write_filetime)) != 0) { + if (SetFileTime(_Handle._Get(), nullptr, nullptr, reinterpret_cast(&_Last_write_filetime))) { return __std_win_error::_Success; } @@ -571,7 +567,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // Windows 10 1809 added support for FILE_DISPOSITION_FLAG_IGNORE_READONLY_ATTRIBUTE. FILE_DISPOSITION_INFO_EX _Info_ex{FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS | FILE_DISPOSITION_FLAG_IGNORE_READONLY_ATTRIBUTE}; - if (SetFileInformationByHandle(_Handle._Get(), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex)) != 0) { + if (SetFileInformationByHandle(_Handle._Get(), FileDispositionInfoEx, &_Info_ex, sizeof(_Info_ex))) { return {true, __std_win_error::_Success}; } @@ -596,14 +592,14 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Last_error == __std_win_error::_Access_denied && _Able_to_change_attributes) { FILE_BASIC_INFO _Basic_info; - if (GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { + if (!GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { return {false, __std_win_error{GetLastError()}}; } // check if FILE_ATTRIBUTE_READONLY is set if ((_Basic_info.FileAttributes & FILE_ATTRIBUTE_READONLY) != 0u) { // try to remove FILE_ATTRIBUTE_READONLY _Basic_info.FileAttributes ^= FILE_ATTRIBUTE_READONLY; - if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { + if (!SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { return {false, __std_win_error{GetLastError()}}; } // removed FILE_ATTRIBUTE_READONLY, now try to set the delete flag again @@ -614,7 +610,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // looks like we failed to set the delete flag, after clearing the FILE_ATTRIBUTE_READONLY flag // perform rollback _Basic_info.FileAttributes |= FILE_ATTRIBUTE_READONLY; - if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { + if (!SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { return {false, __std_win_error{GetLastError()}}; } return {false, _Last_error}; @@ -648,7 +644,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } FILE_BASIC_INFO _Basic_info; - if (GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) == 0) { + if (!GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { return __std_win_error{GetLastError()}; } @@ -657,7 +653,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } _Basic_info.FileAttributes ^= FILE_ATTRIBUTE_READONLY; - if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info)) != 0) { + if (SetFileInformationByHandle(_Handle._Get(), FileBasicInfo, &_Basic_info, sizeof(_Basic_info))) { return __std_win_error::_Success; } @@ -668,7 +664,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error return __std_win_error::_Success; } - if (SetFileAttributesW(_Path, _Old_attributes ^ FILE_ATTRIBUTE_READONLY) != 0) { + if (SetFileAttributesW(_Path, _Old_attributes ^ FILE_ATTRIBUTE_READONLY)) { return __std_win_error::_Success; } @@ -677,7 +673,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error [[nodiscard]] __std_win_error __stdcall __std_fs_rename( _In_z_ const wchar_t* const _Source, _In_z_ const wchar_t* const _Target) noexcept { - if (MoveFileExW(_Source, _Target, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0) { + if (MoveFileExW(_Source, _Target, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING)) { return __std_win_error::_Success; } @@ -710,7 +706,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error const auto _Available_c = reinterpret_cast(_Available); const auto _Total_bytes_c = reinterpret_cast(_Total_bytes); const auto _Free_bytes_c = reinterpret_cast(_Free_bytes); - if (GetDiskFreeSpaceExW(_Target, _Available_c, _Total_bytes_c, _Free_bytes_c) != 0) { + if (GetDiskFreeSpaceExW(_Target, _Available_c, _Total_bytes_c, _Free_bytes_c)) { return __std_win_error::_Success; } @@ -769,7 +765,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error } while (*_Cursor != L'\\'); *_Cursor = L'\0'; - if (GetDiskFreeSpaceExW(_Ptr, _Available_c, _Total_bytes_c, _Free_bytes_c) != 0) { + if (GetDiskFreeSpaceExW(_Ptr, _Available_c, _Total_bytes_c, _Free_bytes_c)) { return __std_win_error::_Success; } @@ -840,7 +836,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // GetFileAttributesExW/FindFirstFileW would return the right answer WIN32_FILE_ATTRIBUTE_DATA _Data; - if (GetFileAttributesExW(_Path, GetFileExInfoStandard, &_Data) == 0) { + if (!GetFileAttributesExW(_Path, GetFileExInfoStandard, &_Data)) { // In some cases, ERROR_SHARING_VIOLATION is returned from GetFileAttributesExW; // FindFirstFileW will work in those cases if we have read permissions on the directory. if (const __std_win_error _Last_error{GetLastError()}; @@ -898,7 +894,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Bitmask_includes(_Flags, _Basic_info_data | __std_fs_stats_flags::_Reparse_tag)) { FILE_BASIC_INFO _Info; - if (GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Info, sizeof(_Info)) == 0) { + if (!GetFileInformationByHandleEx(_Handle._Get(), FileBasicInfo, &_Info, sizeof(_Info))) { return __std_win_error{GetLastError()}; } @@ -910,8 +906,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error // ERROR_INVALID_PARAMETER. We avoid calling this for non-reparse-points. if ((_Info.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0u) { FILE_ATTRIBUTE_TAG_INFO _TagInfo; - if (GetFileInformationByHandleEx(_Handle._Get(), FileAttributeTagInfo, &_TagInfo, sizeof(_TagInfo)) - == 0) { + if (!GetFileInformationByHandleEx(_Handle._Get(), FileAttributeTagInfo, &_TagInfo, sizeof(_TagInfo))) { return __std_win_error{GetLastError()}; } @@ -925,7 +920,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error if (_Bitmask_includes(_Flags, _Standard_info_data)) { FILE_STANDARD_INFO _Info; - if (GetFileInformationByHandleEx(_Handle._Get(), FileStandardInfo, &_Info, sizeof(_Info)) == 0) { + if (!GetFileInformationByHandleEx(_Handle._Get(), FileStandardInfo, &_Info, sizeof(_Info))) { return __std_win_error{GetLastError()}; } @@ -945,7 +940,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error [[nodiscard]] __std_fs_create_directory_result __stdcall __std_fs_create_directory( _In_z_ const wchar_t* const _New_directory) noexcept { - if (CreateDirectoryW(_New_directory, nullptr) != 0) { + if (CreateDirectoryW(_New_directory, nullptr)) { return {true, __std_win_error::_Success}; } @@ -970,7 +965,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error (void) _Template_directory; return __std_fs_create_directory(_New_directory); #else // ^^^ defined(_CRT_APP) ^^^ // vvv !defined(_CRT_APP) vvv - if (CreateDirectoryExW(_Template_directory, _New_directory, nullptr) != 0) { + if (CreateDirectoryExW(_Template_directory, _New_directory, nullptr)) { return {true, __std_win_error::_Success}; } @@ -998,7 +993,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error [[nodiscard]] __std_win_error __stdcall __std_fs_set_current_path(_In_z_ const wchar_t* const _Target) noexcept { // If setting the path failed, SetCurrentDirectoryW returns 0; otherwise returns non-zero. - if (SetCurrentDirectoryW(_Target) != 0) { + if (SetCurrentDirectoryW(_Target)) { return __std_win_error::_Success; }