aboutsummaryrefslogtreecommitdiff
path: root/src/burn
diff options
context:
space:
mode:
authorNir Bar <nir.bar@panel-sw.co.il>2021-08-12 14:16:01 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-08-12 14:50:55 -0500
commitbb18c9c4f0e6da640775b85ebda68b31f2b391ed (patch)
tree5ce6107321293f7af7a0504588e3d0c6642472ff /src/burn
parent0042e3d4554a0d92e1da6141854b0f1aafa07d5b (diff)
downloadwix-bb18c9c4f0e6da640775b85ebda68b31f2b391ed.tar.gz
wix-bb18c9c4f0e6da640775b85ebda68b31f2b391ed.tar.bz2
wix-bb18c9c4f0e6da640775b85ebda68b31f2b391ed.zip
Set the log file path for MSI transactions.
Diffstat (limited to 'src/burn')
-rw-r--r--src/burn/engine/elevation.cpp15
-rw-r--r--src/burn/engine/logging.cpp35
-rw-r--r--src/burn/engine/logging.h7
-rw-r--r--src/burn/engine/package.cpp62
-rw-r--r--src/burn/engine/package.h1
-rw-r--r--src/burn/engine/plan.cpp6
6 files changed, 84 insertions, 42 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp
index 0e1cf0b7..ba6b1dd3 100644
--- a/src/burn/engine/elevation.cpp
+++ b/src/burn/engine/elevation.cpp
@@ -3246,7 +3246,10 @@ static HRESULT OnMsiBeginTransaction(
3246 hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); 3246 hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary);
3247 ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); 3247 ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId);
3248 3248
3249 pRollbackBoundary->sczLogPath = sczLogPath; 3249 if (sczLogPath && *sczLogPath)
3250 {
3251 pRollbackBoundary->sczLogPath = sczLogPath;
3252 }
3250 3253
3251 hr = MsiEngineBeginTransaction(pRollbackBoundary); 3254 hr = MsiEngineBeginTransaction(pRollbackBoundary);
3252 3255
@@ -3284,7 +3287,10 @@ static HRESULT OnMsiCommitTransaction(
3284 hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); 3287 hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary);
3285 ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); 3288 ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId);
3286 3289
3287 pRollbackBoundary->sczLogPath = sczLogPath; 3290 if (sczLogPath && *sczLogPath)
3291 {
3292 pRollbackBoundary->sczLogPath = sczLogPath;
3293 }
3288 3294
3289 hr = MsiEngineCommitTransaction(pRollbackBoundary); 3295 hr = MsiEngineCommitTransaction(pRollbackBoundary);
3290 3296
@@ -3322,7 +3328,10 @@ static HRESULT OnMsiRollbackTransaction(
3322 hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); 3328 hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary);
3323 ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); 3329 ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId);
3324 3330
3325 pRollbackBoundary->sczLogPath = sczLogPath; 3331 if (sczLogPath && *sczLogPath)
3332 {
3333 pRollbackBoundary->sczLogPath = sczLogPath;
3334 }
3326 3335
3327 hr = MsiEngineRollbackTransaction(pRollbackBoundary); 3336 hr = MsiEngineRollbackTransaction(pRollbackBoundary);
3328 3337
diff --git a/src/burn/engine/logging.cpp b/src/burn/engine/logging.cpp
index 9aaf60ed..33295acd 100644
--- a/src/burn/engine/logging.cpp
+++ b/src/burn/engine/logging.cpp
@@ -242,11 +242,6 @@ extern "C" HRESULT LoggingSetPackageVariable(
242 // Make sure that no package log files are created when logging has been disabled via Log element. 242 // Make sure that no package log files are created when logging has been disabled via Log element.
243 if (BURN_LOGGING_STATE_DISABLED == pLog->state) 243 if (BURN_LOGGING_STATE_DISABLED == pLog->state)
244 { 244 {
245 if (psczLogPath)
246 {
247 *psczLogPath = NULL;
248 }
249
250 ExitFunction(); 245 ExitFunction();
251 } 246 }
252 247
@@ -272,6 +267,36 @@ LExit:
272 return hr; 267 return hr;
273} 268}
274 269
270extern "C" HRESULT LoggingSetTransactionVariable(
271 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
272 __in_z_opt LPCWSTR wzSuffix,
273 __in BURN_LOGGING* pLog,
274 __in BURN_VARIABLES* pVariables
275 )
276{
277 HRESULT hr = S_OK;
278
279 // Make sure that no log files are created when logging has been disabled via Log element.
280 if (BURN_LOGGING_STATE_DISABLED == pLog->state)
281 {
282 ExitFunction();
283 }
284
285 if (pRollbackBoundary && pRollbackBoundary->sczLogPathVariable && *pRollbackBoundary->sczLogPathVariable)
286 {
287 hr = StrAllocFormatted(&pRollbackBoundary->sczLogPath, L"%ls%hs%ls_%03u_%ls.%ls", pLog->sczPrefix, wzSuffix && *wzSuffix ? "_" : "", wzSuffix && *wzSuffix ? wzSuffix : L"", vdwPackageSequence, pRollbackBoundary->sczId, pLog->sczExtension);
288 ExitOnFailure(hr, "Failed to allocate path for transaction log.");
289
290 hr = VariableSetString(pVariables, pRollbackBoundary->sczLogPathVariable, pRollbackBoundary->sczLogPath, FALSE, FALSE);
291 ExitOnFailure(hr, "Failed to set log path into variable.");
292 }
293
294LExit:
295 ++vdwPackageSequence;
296
297 return hr;
298}
299
275extern "C" LPCSTR LoggingBurnActionToString( 300extern "C" LPCSTR LoggingBurnActionToString(
276 __in BOOTSTRAPPER_ACTION action 301 __in BOOTSTRAPPER_ACTION action
277 ) 302 )
diff --git a/src/burn/engine/logging.h b/src/burn/engine/logging.h
index 492e14b6..367b94a3 100644
--- a/src/burn/engine/logging.h
+++ b/src/burn/engine/logging.h
@@ -62,6 +62,13 @@ HRESULT LoggingSetPackageVariable(
62 __out_opt LPWSTR* psczLogPath 62 __out_opt LPWSTR* psczLogPath
63 ); 63 );
64 64
65HRESULT LoggingSetTransactionVariable(
66 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary,
67 __in_z_opt LPCWSTR wzSuffix,
68 __in BURN_LOGGING* pLog,
69 __in BURN_VARIABLES* pVariables
70 );
71
65LPCSTR LoggingBurnActionToString( 72LPCSTR LoggingBurnActionToString(
66 __in BOOTSTRAPPER_ACTION action 73 __in BOOTSTRAPPER_ACTION action
67 ); 74 );
diff --git a/src/burn/engine/package.cpp b/src/burn/engine/package.cpp
index cd871bc5..bea48cb5 100644
--- a/src/burn/engine/package.cpp
+++ b/src/burn/engine/package.cpp
@@ -36,6 +36,7 @@ extern "C" HRESULT PackagesParseFromXml(
36 BSTR bstrNodeName = NULL; 36 BSTR bstrNodeName = NULL;
37 DWORD cMspPackages = 0; 37 DWORD cMspPackages = 0;
38 LPWSTR scz = NULL; 38 LPWSTR scz = NULL;
39 BOOL fFoundXml = FALSE;
39 40
40 // select rollback boundary nodes 41 // select rollback boundary nodes
41 hr = XmlSelectNodes(pixnBundle, L"RollbackBoundary", &pixnNodes); 42 hr = XmlSelectNodes(pixnBundle, L"RollbackBoundary", &pixnNodes);
@@ -63,15 +64,19 @@ extern "C" HRESULT PackagesParseFromXml(
63 64
64 // @Id 65 // @Id
65 hr = XmlGetAttributeEx(pixnNode, L"Id", &pRollbackBoundary->sczId); 66 hr = XmlGetAttributeEx(pixnNode, L"Id", &pRollbackBoundary->sczId);
66 ExitOnFailure(hr, "Failed to get @Id."); 67 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Id.");
67 68
68 // @Vital 69 // @Vital
69 hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pRollbackBoundary->fVital); 70 hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pRollbackBoundary->fVital);
70 ExitOnFailure(hr, "Failed to get @Vital."); 71 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Vital.");
71 72
72 // @Transaction 73 // @Transaction
73 hr = XmlGetYesNoAttribute(pixnNode, L"Transaction", &pRollbackBoundary->fTransactionAuthored); 74 hr = XmlGetYesNoAttribute(pixnNode, L"Transaction", &pRollbackBoundary->fTransactionAuthored);
74 ExitOnFailure(hr, "Failed to get @Transaction."); 75 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Transaction.");
76
77 // @LogPathVariable
78 hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pRollbackBoundary->sczLogPathVariable);
79 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @LogPathVariable.");
75 80
76 // prepare next iteration 81 // prepare next iteration
77 ReleaseNullObject(pixnNode); 82 ReleaseNullObject(pixnNode);
@@ -110,11 +115,13 @@ extern "C" HRESULT PackagesParseFromXml(
110 115
111 // @Id 116 // @Id
112 hr = XmlGetAttributeEx(pixnNode, L"Id", &pPackage->sczId); 117 hr = XmlGetAttributeEx(pixnNode, L"Id", &pPackage->sczId);
113 ExitOnFailure(hr, "Failed to get @Id."); 118 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Id.");
114 119
115 // @Cache 120 // @Cache
116 hr = XmlGetAttributeEx(pixnNode, L"Cache", &scz); 121 hr = XmlGetAttributeEx(pixnNode, L"Cache", &scz);
117 if (SUCCEEDED(hr)) 122 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Cache.");
123
124 if (fFoundXml)
118 { 125 {
119 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"remove", -1)) 126 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"remove", -1))
120 { 127 {
@@ -134,72 +141,62 @@ extern "C" HRESULT PackagesParseFromXml(
134 ExitOnRootFailure(hr, "Invalid cache type: %ls", scz); 141 ExitOnRootFailure(hr, "Invalid cache type: %ls", scz);
135 } 142 }
136 } 143 }
137 ExitOnFailure(hr, "Failed to get @Cache.");
138 144
139 // @CacheId 145 // @CacheId
140 hr = XmlGetAttributeEx(pixnNode, L"CacheId", &pPackage->sczCacheId); 146 hr = XmlGetAttributeEx(pixnNode, L"CacheId", &pPackage->sczCacheId);
141 ExitOnFailure(hr, "Failed to get @CacheId."); 147 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @CacheId.");
142 148
143 // @Size 149 // @Size
144 hr = XmlGetAttributeUInt64(pixnNode, L"Size", &pPackage->qwSize); 150 hr = XmlGetAttributeUInt64(pixnNode, L"Size", &pPackage->qwSize);
145 ExitOnFailure(hr, "Failed to get @Size."); 151 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Size.");
146 152
147 // @InstallSize 153 // @InstallSize
148 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize); 154 hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize);
149 ExitOnFailure(hr, "Failed to get @InstallSize."); 155 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize.");
150 156
151 // @PerMachine 157 // @PerMachine
152 hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine); 158 hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine);
153 ExitOnFailure(hr, "Failed to get @PerMachine."); 159 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @PerMachine.");
154 160
155 // @Permanent 161 // @Permanent
156 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fUninstallable); 162 hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fUninstallable);
157 ExitOnFailure(hr, "Failed to get @Permanent."); 163 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Permanent.");
158 pPackage->fUninstallable = !pPackage->fUninstallable; // TODO: change "Uninstallable" variable name to permanent, until then Uninstallable is the opposite of Permanent so fix the variable. 164 pPackage->fUninstallable = !pPackage->fUninstallable; // TODO: change "Uninstallable" variable name to permanent, until then Uninstallable is the opposite of Permanent so fix the variable.
159 pPackage->fCanAffectRegistration = pPackage->fUninstallable; 165 pPackage->fCanAffectRegistration = pPackage->fUninstallable;
160 166
161 // @Vital 167 // @Vital
162 hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital); 168 hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital);
163 ExitOnFailure(hr, "Failed to get @Vital."); 169 ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Vital.");
164 170
165 // @LogPathVariable 171 // @LogPathVariable
166 hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pPackage->sczLogPathVariable); 172 hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pPackage->sczLogPathVariable);
167 if (E_NOTFOUND != hr) 173 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @LogPathVariable.");
168 {
169 ExitOnFailure(hr, "Failed to get @LogPathVariable.");
170 }
171 174
172 // @RollbackLogPathVariable 175 // @RollbackLogPathVariable
173 hr = XmlGetAttributeEx(pixnNode, L"RollbackLogPathVariable", &pPackage->sczRollbackLogPathVariable); 176 hr = XmlGetAttributeEx(pixnNode, L"RollbackLogPathVariable", &pPackage->sczRollbackLogPathVariable);
174 if (E_NOTFOUND != hr) 177 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackLogPathVariable.");
175 {
176 ExitOnFailure(hr, "Failed to get @RollbackLogPathVariable.");
177 }
178 178
179 // @InstallCondition 179 // @InstallCondition
180 hr = XmlGetAttributeEx(pixnNode, L"InstallCondition", &pPackage->sczInstallCondition); 180 hr = XmlGetAttributeEx(pixnNode, L"InstallCondition", &pPackage->sczInstallCondition);
181 if (E_NOTFOUND != hr) 181 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallCondition.");
182 {
183 ExitOnFailure(hr, "Failed to get @InstallCondition.");
184 }
185 182
186 // @RollbackBoundaryForward 183 // @RollbackBoundaryForward
187 hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryForward", &scz); 184 hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryForward", &scz);
188 if (E_NOTFOUND != hr) 185 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackBoundaryForward.");
189 {
190 ExitOnFailure(hr, "Failed to get @RollbackBoundaryForward.");
191 186
192 hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryForward); 187 if (fFoundXml)
188 {
189 hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryForward);
193 ExitOnFailure(hr, "Failed to find forward transaction boundary: %ls", scz); 190 ExitOnFailure(hr, "Failed to find forward transaction boundary: %ls", scz);
194 } 191 }
195 192
196 // @RollbackBoundaryBackward 193 // @RollbackBoundaryBackward
197 hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryBackward", &scz); 194 hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryBackward", &scz);
198 if (E_NOTFOUND != hr) 195 ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackBoundaryBackward.");
199 {
200 ExitOnFailure(hr, "Failed to get @RollbackBoundaryBackward.");
201 196
202 hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryBackward); 197 if (fFoundXml)
198 {
199 hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryBackward);
203 ExitOnFailure(hr, "Failed to find backward transaction boundary: %ls", scz); 200 ExitOnFailure(hr, "Failed to find backward transaction boundary: %ls", scz);
204 } 201 }
205 202
@@ -378,6 +375,7 @@ extern "C" void PackagesUninitialize(
378 { 375 {
379 ReleaseStr(pPackages->rgRollbackBoundaries[i].sczId); 376 ReleaseStr(pPackages->rgRollbackBoundaries[i].sczId);
380 ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPath); 377 ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPath);
378 ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPathVariable);
381 } 379 }
382 MemFree(pPackages->rgRollbackBoundaries); 380 MemFree(pPackages->rgRollbackBoundaries);
383 } 381 }
diff --git a/src/burn/engine/package.h b/src/burn/engine/package.h
index 3d8233d1..f2a1c304 100644
--- a/src/burn/engine/package.h
+++ b/src/burn/engine/package.h
@@ -195,6 +195,7 @@ typedef struct _BURN_ROLLBACK_BOUNDARY
195 BOOL fTransactionAuthored; 195 BOOL fTransactionAuthored;
196 BOOL fTransaction; 196 BOOL fTransaction;
197 BOOL fActiveTransaction; // only valid during Apply. 197 BOOL fActiveTransaction; // only valid during Apply.
198 LPWSTR sczLogPathVariable;
198 LPWSTR sczLogPath; 199 LPWSTR sczLogPath;
199} BURN_ROLLBACK_BOUNDARY; 200} BURN_ROLLBACK_BOUNDARY;
200 201
diff --git a/src/burn/engine/plan.cpp b/src/burn/engine/plan.cpp
index 85d958a6..58981352 100644
--- a/src/burn/engine/plan.cpp
+++ b/src/burn/engine/plan.cpp
@@ -1709,8 +1709,8 @@ LExit:
1709extern "C" HRESULT PlanRollbackBoundaryBegin( 1709extern "C" HRESULT PlanRollbackBoundaryBegin(
1710 __in BURN_PLAN* pPlan, 1710 __in BURN_PLAN* pPlan,
1711 __in BURN_USER_EXPERIENCE* pUX, 1711 __in BURN_USER_EXPERIENCE* pUX,
1712 __in BURN_LOGGING* /*pLog*/, 1712 __in BURN_LOGGING* pLog,
1713 __in BURN_VARIABLES* /*pVariables*/, 1713 __in BURN_VARIABLES* pVariables,
1714 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary 1714 __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary
1715 ) 1715 )
1716{ 1716{
@@ -1744,6 +1744,8 @@ extern "C" HRESULT PlanRollbackBoundaryBegin(
1744 } 1744 }
1745 else 1745 else
1746 { 1746 {
1747 LoggingSetTransactionVariable(pRollbackBoundary, NULL, pLog, pVariables); // ignore errors.
1748
1747 // Add begin MSI transaction to execute plan. 1749 // Add begin MSI transaction to execute plan.
1748 hr = PlanExecuteCheckpoint(pPlan); 1750 hr = PlanExecuteCheckpoint(pPlan);
1749 ExitOnFailure(hr, "Failed to append checkpoint before MSI transaction begin action."); 1751 ExitOnFailure(hr, "Failed to append checkpoint before MSI transaction begin action.");