| 884 | } |
| 885 | |
| 886 | static HANDLE windows_lock_open(const wchar_t *path) { |
| 887 | for (unsigned int attempt = 0; attempt < 100; attempt++) { |
| 888 | HANDLE file = CreateFileW( |
| 889 | /* Read access is sufficient for LockFileEx. Keeping this handle |
| 890 | * read-only makes it share-compatible with the brief DACL repair |
| 891 | * handle, whose FILE_SHARE_READ still admits every live locker. */ |
| 892 | path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, |
| 893 | FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OPEN_REPARSE_POINT, NULL); |
| 894 | if (file != INVALID_HANDLE_VALUE) { |
| 895 | LARGE_INTEGER size; |
| 896 | if (windows_log_handle_valid(file, &size)) { |
| 897 | (void)SetHandleInformation(file, HANDLE_FLAG_INHERIT, 0); |
| 898 | return file; |
| 899 | } |
| 900 | (void)CloseHandle(file); |
| 901 | return INVALID_HANDLE_VALUE; |
| 902 | } |
| 903 | DWORD error = GetLastError(); |
| 904 | if (error != ERROR_SHARING_VIOLATION && error != ERROR_LOCK_VIOLATION) { |
| 905 | return INVALID_HANDLE_VALUE; |
| 906 | } |
| 907 | Sleep(2); |
| 908 | } |
| 909 | return INVALID_HANDLE_VALUE; |
| 910 | } |
| 911 | |
| 912 | static bool windows_lock_exclusive(HANDLE file, OVERLAPPED *range) { |
| 913 | memset(range, 0, sizeof(*range)); |
no test coverage detected