From bb18c9c4f0e6da640775b85ebda68b31f2b391ed Mon Sep 17 00:00:00 2001 From: Nir Bar Date: Thu, 12 Aug 2021 14:16:01 -0500 Subject: Set the log file path for MSI transactions. --- src/burn/engine/elevation.cpp | 15 ++++++++--- src/burn/engine/logging.cpp | 35 ++++++++++++++++++++---- src/burn/engine/logging.h | 7 +++++ src/burn/engine/package.cpp | 62 +++++++++++++++++++++---------------------- src/burn/engine/package.h | 1 + src/burn/engine/plan.cpp | 6 +++-- 6 files changed, 84 insertions(+), 42 deletions(-) (limited to 'src/burn') 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( hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); - pRollbackBoundary->sczLogPath = sczLogPath; + if (sczLogPath && *sczLogPath) + { + pRollbackBoundary->sczLogPath = sczLogPath; + } hr = MsiEngineBeginTransaction(pRollbackBoundary); @@ -3284,7 +3287,10 @@ static HRESULT OnMsiCommitTransaction( hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); - pRollbackBoundary->sczLogPath = sczLogPath; + if (sczLogPath && *sczLogPath) + { + pRollbackBoundary->sczLogPath = sczLogPath; + } hr = MsiEngineCommitTransaction(pRollbackBoundary); @@ -3322,7 +3328,10 @@ static HRESULT OnMsiRollbackTransaction( hr = PackageFindRollbackBoundaryById(pPackages, sczId, &pRollbackBoundary); ExitOnFailure(hr, "Failed to find rollback boundary: %ls", sczId); - pRollbackBoundary->sczLogPath = sczLogPath; + if (sczLogPath && *sczLogPath) + { + pRollbackBoundary->sczLogPath = sczLogPath; + } hr = MsiEngineRollbackTransaction(pRollbackBoundary); 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( // Make sure that no package log files are created when logging has been disabled via Log element. if (BURN_LOGGING_STATE_DISABLED == pLog->state) { - if (psczLogPath) - { - *psczLogPath = NULL; - } - ExitFunction(); } @@ -272,6 +267,36 @@ LExit: return hr; } +extern "C" HRESULT LoggingSetTransactionVariable( + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, + __in_z_opt LPCWSTR wzSuffix, + __in BURN_LOGGING* pLog, + __in BURN_VARIABLES* pVariables + ) +{ + HRESULT hr = S_OK; + + // Make sure that no log files are created when logging has been disabled via Log element. + if (BURN_LOGGING_STATE_DISABLED == pLog->state) + { + ExitFunction(); + } + + if (pRollbackBoundary && pRollbackBoundary->sczLogPathVariable && *pRollbackBoundary->sczLogPathVariable) + { + hr = StrAllocFormatted(&pRollbackBoundary->sczLogPath, L"%ls%hs%ls_%03u_%ls.%ls", pLog->sczPrefix, wzSuffix && *wzSuffix ? "_" : "", wzSuffix && *wzSuffix ? wzSuffix : L"", vdwPackageSequence, pRollbackBoundary->sczId, pLog->sczExtension); + ExitOnFailure(hr, "Failed to allocate path for transaction log."); + + hr = VariableSetString(pVariables, pRollbackBoundary->sczLogPathVariable, pRollbackBoundary->sczLogPath, FALSE, FALSE); + ExitOnFailure(hr, "Failed to set log path into variable."); + } + +LExit: + ++vdwPackageSequence; + + return hr; +} + extern "C" LPCSTR LoggingBurnActionToString( __in BOOTSTRAPPER_ACTION action ) 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( __out_opt LPWSTR* psczLogPath ); +HRESULT LoggingSetTransactionVariable( + __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary, + __in_z_opt LPCWSTR wzSuffix, + __in BURN_LOGGING* pLog, + __in BURN_VARIABLES* pVariables + ); + LPCSTR LoggingBurnActionToString( __in BOOTSTRAPPER_ACTION action ); 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( BSTR bstrNodeName = NULL; DWORD cMspPackages = 0; LPWSTR scz = NULL; + BOOL fFoundXml = FALSE; // select rollback boundary nodes hr = XmlSelectNodes(pixnBundle, L"RollbackBoundary", &pixnNodes); @@ -63,15 +64,19 @@ extern "C" HRESULT PackagesParseFromXml( // @Id hr = XmlGetAttributeEx(pixnNode, L"Id", &pRollbackBoundary->sczId); - ExitOnFailure(hr, "Failed to get @Id."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Id."); // @Vital hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pRollbackBoundary->fVital); - ExitOnFailure(hr, "Failed to get @Vital."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Vital."); // @Transaction hr = XmlGetYesNoAttribute(pixnNode, L"Transaction", &pRollbackBoundary->fTransactionAuthored); - ExitOnFailure(hr, "Failed to get @Transaction."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Transaction."); + + // @LogPathVariable + hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pRollbackBoundary->sczLogPathVariable); + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @LogPathVariable."); // prepare next iteration ReleaseNullObject(pixnNode); @@ -110,11 +115,13 @@ extern "C" HRESULT PackagesParseFromXml( // @Id hr = XmlGetAttributeEx(pixnNode, L"Id", &pPackage->sczId); - ExitOnFailure(hr, "Failed to get @Id."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Id."); // @Cache hr = XmlGetAttributeEx(pixnNode, L"Cache", &scz); - if (SUCCEEDED(hr)) + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Cache."); + + if (fFoundXml) { if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"remove", -1)) { @@ -134,72 +141,62 @@ extern "C" HRESULT PackagesParseFromXml( ExitOnRootFailure(hr, "Invalid cache type: %ls", scz); } } - ExitOnFailure(hr, "Failed to get @Cache."); // @CacheId hr = XmlGetAttributeEx(pixnNode, L"CacheId", &pPackage->sczCacheId); - ExitOnFailure(hr, "Failed to get @CacheId."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @CacheId."); // @Size hr = XmlGetAttributeUInt64(pixnNode, L"Size", &pPackage->qwSize); - ExitOnFailure(hr, "Failed to get @Size."); + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @Size."); // @InstallSize hr = XmlGetAttributeUInt64(pixnNode, L"InstallSize", &pPackage->qwInstallSize); - ExitOnFailure(hr, "Failed to get @InstallSize."); + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallSize."); // @PerMachine hr = XmlGetYesNoAttribute(pixnNode, L"PerMachine", &pPackage->fPerMachine); - ExitOnFailure(hr, "Failed to get @PerMachine."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @PerMachine."); // @Permanent hr = XmlGetYesNoAttribute(pixnNode, L"Permanent", &pPackage->fUninstallable); - ExitOnFailure(hr, "Failed to get @Permanent."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Permanent."); pPackage->fUninstallable = !pPackage->fUninstallable; // TODO: change "Uninstallable" variable name to permanent, until then Uninstallable is the opposite of Permanent so fix the variable. pPackage->fCanAffectRegistration = pPackage->fUninstallable; // @Vital hr = XmlGetYesNoAttribute(pixnNode, L"Vital", &pPackage->fVital); - ExitOnFailure(hr, "Failed to get @Vital."); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get @Vital."); // @LogPathVariable hr = XmlGetAttributeEx(pixnNode, L"LogPathVariable", &pPackage->sczLogPathVariable); - if (E_NOTFOUND != hr) - { - ExitOnFailure(hr, "Failed to get @LogPathVariable."); - } + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @LogPathVariable."); // @RollbackLogPathVariable hr = XmlGetAttributeEx(pixnNode, L"RollbackLogPathVariable", &pPackage->sczRollbackLogPathVariable); - if (E_NOTFOUND != hr) - { - ExitOnFailure(hr, "Failed to get @RollbackLogPathVariable."); - } + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackLogPathVariable."); // @InstallCondition hr = XmlGetAttributeEx(pixnNode, L"InstallCondition", &pPackage->sczInstallCondition); - if (E_NOTFOUND != hr) - { - ExitOnFailure(hr, "Failed to get @InstallCondition."); - } + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @InstallCondition."); // @RollbackBoundaryForward hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryForward", &scz); - if (E_NOTFOUND != hr) - { - ExitOnFailure(hr, "Failed to get @RollbackBoundaryForward."); + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackBoundaryForward."); - hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryForward); + if (fFoundXml) + { + hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryForward); ExitOnFailure(hr, "Failed to find forward transaction boundary: %ls", scz); } // @RollbackBoundaryBackward hr = XmlGetAttributeEx(pixnNode, L"RollbackBoundaryBackward", &scz); - if (E_NOTFOUND != hr) - { - ExitOnFailure(hr, "Failed to get @RollbackBoundaryBackward."); + ExitOnOptionalXmlQueryFailure(hr, fFoundXml, "Failed to get @RollbackBoundaryBackward."); - hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryBackward); + if (fFoundXml) + { + hr = FindRollbackBoundaryById(pPackages, scz, &pPackage->pRollbackBoundaryBackward); ExitOnFailure(hr, "Failed to find backward transaction boundary: %ls", scz); } @@ -378,6 +375,7 @@ extern "C" void PackagesUninitialize( { ReleaseStr(pPackages->rgRollbackBoundaries[i].sczId); ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPath); + ReleaseStr(pPackages->rgRollbackBoundaries[i].sczLogPathVariable); } MemFree(pPackages->rgRollbackBoundaries); } 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 BOOL fTransactionAuthored; BOOL fTransaction; BOOL fActiveTransaction; // only valid during Apply. + LPWSTR sczLogPathVariable; LPWSTR sczLogPath; } BURN_ROLLBACK_BOUNDARY; 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: extern "C" HRESULT PlanRollbackBoundaryBegin( __in BURN_PLAN* pPlan, __in BURN_USER_EXPERIENCE* pUX, - __in BURN_LOGGING* /*pLog*/, - __in BURN_VARIABLES* /*pVariables*/, + __in BURN_LOGGING* pLog, + __in BURN_VARIABLES* pVariables, __in BURN_ROLLBACK_BOUNDARY* pRollbackBoundary ) { @@ -1744,6 +1744,8 @@ extern "C" HRESULT PlanRollbackBoundaryBegin( } else { + LoggingSetTransactionVariable(pRollbackBoundary, NULL, pLog, pVariables); // ignore errors. + // Add begin MSI transaction to execute plan. hr = PlanExecuteCheckpoint(pPlan); ExitOnFailure(hr, "Failed to append checkpoint before MSI transaction begin action."); -- cgit v1.2.3-55-g6feb