diff options
| author | Rob Mensching <rob@firegiant.com> | 2025-02-10 17:38:43 -0800 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2025-02-11 15:49:33 -0800 |
| commit | 83cb7864064fa6181902c28fc56d26f236881abe (patch) | |
| tree | b7e1e58bcf17c8ba161ad68dde3da5fcc6581ae3 /src | |
| parent | a797638d231b568b3e53bb2f478c28b6c0d5a1dc (diff) | |
| download | wix-83cb7864064fa6181902c28fc56d26f236881abe.tar.gz wix-83cb7864064fa6181902c28fc56d26f236881abe.tar.bz2 wix-83cb7864064fa6181902c28fc56d26f236881abe.zip | |
Support CreateFile with retries
Diffstat (limited to '')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/fileutil.cpp | 53 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/fileutil.h | 29 |
2 files changed, 69 insertions, 13 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/fileutil.cpp b/src/libs/dutil/WixToolset.DUtil/fileutil.cpp index 31802d29..abe1f6ad 100644 --- a/src/libs/dutil/WixToolset.DUtil/fileutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/fileutil.cpp | |||
| @@ -32,7 +32,7 @@ __out LPWSTR *ppwzFileNameNoExtension | |||
| 32 | ) | 32 | ) |
| 33 | { | 33 | { |
| 34 | Assert(wzFileName && *wzFileName); | 34 | Assert(wzFileName && *wzFileName); |
| 35 | 35 | ||
| 36 | HRESULT hr = S_OK; | 36 | HRESULT hr = S_OK; |
| 37 | size_t cchFileName = 0; | 37 | size_t cchFileName = 0; |
| 38 | LPWSTR pwzFileNameNoExtension = NULL; | 38 | LPWSTR pwzFileNameNoExtension = NULL; |
| @@ -90,7 +90,7 @@ extern "C" HRESULT DAPI FileChangeExtension( | |||
| 90 | 90 | ||
| 91 | LExit: | 91 | LExit: |
| 92 | ReleaseStr(sczFileName); | 92 | ReleaseStr(sczFileName); |
| 93 | 93 | ||
| 94 | return hr; | 94 | return hr; |
| 95 | } | 95 | } |
| 96 | 96 | ||
| @@ -140,7 +140,7 @@ extern "C" HRESULT DAPI FileAddSuffixToBaseName( | |||
| 140 | 140 | ||
| 141 | LExit: | 141 | LExit: |
| 142 | ReleaseStr(sczNewFileName); | 142 | ReleaseStr(sczNewFileName); |
| 143 | 143 | ||
| 144 | return hr; | 144 | return hr; |
| 145 | } | 145 | } |
| 146 | 146 | ||
| @@ -1340,6 +1340,51 @@ LExit: | |||
| 1340 | 1340 | ||
| 1341 | 1341 | ||
| 1342 | /******************************************************************* | 1342 | /******************************************************************* |
| 1343 | FileCreateWithRetry - create a file with multiple attempts if necessary | ||
| 1344 | |||
| 1345 | ********************************************************************/ | ||
| 1346 | extern "C" HRESULT DAPI FileCreateWithRetry( | ||
| 1347 | __in LPCWSTR wzFile, | ||
| 1348 | __in DWORD dwDesiredAccess, | ||
| 1349 | __in DWORD dwShareMode, | ||
| 1350 | __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, | ||
| 1351 | __in DWORD dwCreationDisposition, | ||
| 1352 | __in DWORD dwFlagsAndAttributes, | ||
| 1353 | __in DWORD cRetry, | ||
| 1354 | __in DWORD dwWaitMilliseconds, | ||
| 1355 | __out HANDLE* phFile | ||
| 1356 | ) | ||
| 1357 | { | ||
| 1358 | HRESULT hr = HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE); | ||
| 1359 | |||
| 1360 | *phFile = INVALID_HANDLE_VALUE; | ||
| 1361 | |||
| 1362 | for (DWORD i = 0; i <= cRetry; ++i) | ||
| 1363 | { | ||
| 1364 | if (0 < i) | ||
| 1365 | { | ||
| 1366 | ::Sleep(dwWaitMilliseconds); | ||
| 1367 | } | ||
| 1368 | |||
| 1369 | *phFile = ::CreateFileW(wzFile, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||
| 1370 | if (INVALID_HANDLE_VALUE == *phFile) | ||
| 1371 | { | ||
| 1372 | DWORD er = ::GetLastError(); | ||
| 1373 | hr = HRESULT_FROM_WIN32(er ? er : ERROR_INVALID_HANDLE); | ||
| 1374 | } | ||
| 1375 | else | ||
| 1376 | { | ||
| 1377 | hr = S_OK; | ||
| 1378 | break; | ||
| 1379 | } | ||
| 1380 | } | ||
| 1381 | FileExitOnRootFailure(hr, "Failed to create file: %ls after %u retries.", wzFile, cRetry); | ||
| 1382 | |||
| 1383 | LExit: | ||
| 1384 | return hr; | ||
| 1385 | } | ||
| 1386 | |||
| 1387 | /******************************************************************* | ||
| 1343 | FileIsSame | 1388 | FileIsSame |
| 1344 | 1389 | ||
| 1345 | ********************************************************************/ | 1390 | ********************************************************************/ |
| @@ -1479,7 +1524,7 @@ extern "C" HRESULT DAPI FileResetTime( | |||
| 1479 | 1524 | ||
| 1480 | hFile = ::CreateFileW(wzFile, FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); | 1525 | hFile = ::CreateFileW(wzFile, FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); |
| 1481 | FileExitOnInvalidHandleWithLastError(hFile, hr, "Failed to open file. File = '%ls'", wzFile); | 1526 | FileExitOnInvalidHandleWithLastError(hFile, hr, "Failed to open file. File = '%ls'", wzFile); |
| 1482 | 1527 | ||
| 1483 | if (!::GetFileTime(hFile, &ftCreateTime, NULL, NULL)) | 1528 | if (!::GetFileTime(hFile, &ftCreateTime, NULL, NULL)) |
| 1484 | { | 1529 | { |
| 1485 | FileExitWithLastError(hr, "Failed to get file time for file. File = '%ls'", wzFile); | 1530 | FileExitWithLastError(hr, "Failed to get file time for file. File = '%ls'", wzFile); |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/fileutil.h b/src/libs/dutil/WixToolset.DUtil/inc/fileutil.h index 868312dc..c206fc5c 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/fileutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/fileutil.h | |||
| @@ -49,8 +49,8 @@ HRESULT DAPI FileAddSuffixToBaseName( | |||
| 49 | __out_z LPWSTR* psczNewFileName | 49 | __out_z LPWSTR* psczNewFileName |
| 50 | ); | 50 | ); |
| 51 | HRESULT DAPI FileVersionFromString( | 51 | HRESULT DAPI FileVersionFromString( |
| 52 | __in_z LPCWSTR wzVersion, | 52 | __in_z LPCWSTR wzVersion, |
| 53 | __out DWORD *pdwVerMajor, | 53 | __out DWORD *pdwVerMajor, |
| 54 | __out DWORD* pdwVerMinor | 54 | __out DWORD* pdwVerMinor |
| 55 | ); | 55 | ); |
| 56 | HRESULT DAPI FileVersionFromStringEx( | 56 | HRESULT DAPI FileVersionFromStringEx( |
| @@ -73,11 +73,11 @@ HRESULT DAPI FileSize( | |||
| 73 | __out LONGLONG* pllSize | 73 | __out LONGLONG* pllSize |
| 74 | ); | 74 | ); |
| 75 | HRESULT DAPI FileSizeByHandle( | 75 | HRESULT DAPI FileSizeByHandle( |
| 76 | __in HANDLE hFile, | 76 | __in HANDLE hFile, |
| 77 | __out LONGLONG* pllSize | 77 | __out LONGLONG* pllSize |
| 78 | ); | 78 | ); |
| 79 | BOOL DAPI FileExistsEx( | 79 | BOOL DAPI FileExistsEx( |
| 80 | __in_z LPCWSTR wzPath, | 80 | __in_z LPCWSTR wzPath, |
| 81 | __out_opt DWORD *pdwAttributes | 81 | __out_opt DWORD *pdwAttributes |
| 82 | ); | 82 | ); |
| 83 | BOOL DAPI FileExistsAfterRestart( | 83 | BOOL DAPI FileExistsAfterRestart( |
| @@ -166,8 +166,8 @@ HRESULT DAPI FileEnsureCopyWithRetry( | |||
| 166 | __in DWORD dwWaitMilliseconds | 166 | __in DWORD dwWaitMilliseconds |
| 167 | ); | 167 | ); |
| 168 | HRESULT DAPI FileEnsureMove( | 168 | HRESULT DAPI FileEnsureMove( |
| 169 | __in_z LPCWSTR wzSource, | 169 | __in_z LPCWSTR wzSource, |
| 170 | __in_z LPCWSTR wzTarget, | 170 | __in_z LPCWSTR wzTarget, |
| 171 | __in BOOL fOverwrite, | 171 | __in BOOL fOverwrite, |
| 172 | __in BOOL fAllowCopy | 172 | __in BOOL fAllowCopy |
| 173 | ); | 173 | ); |
| @@ -191,9 +191,20 @@ HRESULT DAPI FileCreateTempW( | |||
| 191 | __deref_opt_out_z LPWSTR* ppwzTempFile, | 191 | __deref_opt_out_z LPWSTR* ppwzTempFile, |
| 192 | __out_opt HANDLE* phTempFile | 192 | __out_opt HANDLE* phTempFile |
| 193 | ); | 193 | ); |
| 194 | HRESULT DAPI FileCreateWithRetry( | ||
| 195 | __in LPCWSTR wzFile, | ||
| 196 | __in DWORD dwDesiredAccess, | ||
| 197 | __in DWORD dwShareMode, | ||
| 198 | __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, | ||
| 199 | __in DWORD dwCreationDisposition, | ||
| 200 | __in DWORD dwFlagsAndAttributes, | ||
| 201 | __in DWORD cRetry, | ||
| 202 | __in DWORD dwWaitMilliseconds, | ||
| 203 | __out HANDLE* phFile | ||
| 204 | ); | ||
| 194 | HRESULT DAPI FileVersion( | 205 | HRESULT DAPI FileVersion( |
| 195 | __in_z LPCWSTR wzFilename, | 206 | __in_z LPCWSTR wzFilename, |
| 196 | __out DWORD *pdwVerMajor, | 207 | __out DWORD *pdwVerMajor, |
| 197 | __out DWORD* pdwVerMinor | 208 | __out DWORD* pdwVerMinor |
| 198 | ); | 209 | ); |
| 199 | HRESULT DAPI FileIsSame( | 210 | HRESULT DAPI FileIsSame( |
| @@ -205,7 +216,7 @@ HRESULT DAPI FileEnsureDelete( | |||
| 205 | __in_z LPCWSTR wzFile | 216 | __in_z LPCWSTR wzFile |
| 206 | ); | 217 | ); |
| 207 | HRESULT DAPI FileGetTime( | 218 | HRESULT DAPI FileGetTime( |
| 208 | __in_z LPCWSTR wzFile, | 219 | __in_z LPCWSTR wzFile, |
| 209 | __out_opt LPFILETIME lpCreationTime, | 220 | __out_opt LPFILETIME lpCreationTime, |
| 210 | __out_opt LPFILETIME lpLastAccessTime, | 221 | __out_opt LPFILETIME lpLastAccessTime, |
| 211 | __out_opt LPFILETIME lpLastWriteTime | 222 | __out_opt LPFILETIME lpLastWriteTime |
