From 9f0e61afafd34ea2e96d5f2557432caeff1b93dd Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Fri, 26 Feb 2010 13:39:26 +0100 Subject: [PATCH] Pass jcr to VSS class + minor clean up of VSS code --- bacula/src/filed/job.c | 2 +- bacula/src/win32/filed/vss.cpp | 46 ++++++++-------- bacula/src/win32/filed/vss.h | 75 +++++++++++++------------- bacula/src/win32/filed/vss_generic.cpp | 58 ++++++++++---------- 4 files changed, 91 insertions(+), 90 deletions(-) diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index cf42130fa5..b7671bf18e 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -1584,7 +1584,7 @@ static int backup_cmd(JCR *jcr) #if defined(WIN32_VSS) /* START VSS ON WIN32 */ if (jcr->VSS) { - if (g_pVSSClient->InitializeForBackup()) { + if (g_pVSSClient->InitializeForBackup(jcr)) { /* tell vss which drives to snapshot */ char szWinDriveLetters[27]; if (get_win32_driveletters(jcr->ff, szWinDriveLetters)) { diff --git a/bacula/src/win32/filed/vss.cpp b/bacula/src/win32/filed/vss.cpp index 7a73c32fe4..5e78ef8ce9 100644 --- a/bacula/src/win32/filed/vss.cpp +++ b/bacula/src/win32/filed/vss.cpp @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2005-2008 Free Software Foundation Europe e.V. + Copyright (C) 2005-2010 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -74,7 +74,6 @@ void VSSInit() return; } /* Vista or Longhorn or later */ -// } else if (g_MajorVersion == 6 && g_MinorVersion == 0) { } else if (g_MajorVersion >= 6) { g_pVSSClient = new VSSClientVista(); atexit(VSSCleanup); @@ -121,30 +120,31 @@ VSSClient::~VSSClient() } DestroyWriterInfo(); - delete (alist*)m_pAlistWriterState; - delete (alist*)m_pAlistWriterInfoText; + delete m_pAlistWriterState; + delete m_pAlistWriterInfoText; // Call CoUninitialize if the CoInitialize was performed successfully if (m_bCoInitializeCalled) CoUninitialize(); } -BOOL VSSClient::InitializeForBackup() +bool VSSClient::InitializeForBackup(JCR *jcr) { //return Initialize (VSS_CTX_BACKUP); + m_jcr = jcr; return Initialize(0); } -BOOL VSSClient::GetShadowPath(const char *szFilePath, char *szShadowPath, int nBuflen) +bool VSSClient::GetShadowPath(const char *szFilePath, char *szShadowPath, int nBuflen) { if (!m_bBackupIsInitialized) - return FALSE; + return false; /* check for valid pathname */ - BOOL bIsValidName; + bool bIsValidName; bIsValidName = strlen(szFilePath) > 3; if (bIsValidName) @@ -159,23 +159,23 @@ BOOL VSSClient::GetShadowPath(const char *szFilePath, char *szShadowPath, int nB if (WideCharToMultiByte(CP_UTF8,0,m_szShadowCopyName[nDriveIndex],-1,szShadowPath,nBuflen-1,NULL,NULL)) { nBuflen -= (int)strlen(szShadowPath); bstrncat(szShadowPath, szFilePath+2, nBuflen); - return TRUE; + return true; } } } bstrncpy(szShadowPath, szFilePath, nBuflen); errno = EINVAL; - return FALSE; + return false; } -BOOL VSSClient::GetShadowPathW(const wchar_t *szFilePath, wchar_t *szShadowPath, int nBuflen) +bool VSSClient::GetShadowPathW(const wchar_t *szFilePath, wchar_t *szShadowPath, int nBuflen) { if (!m_bBackupIsInitialized) - return FALSE; + return false; /* check for valid pathname */ - BOOL bIsValidName; + bool bIsValidName; bIsValidName = wcslen(szFilePath) > 3; if (bIsValidName) @@ -189,39 +189,39 @@ BOOL VSSClient::GetShadowPathW(const wchar_t *szFilePath, wchar_t *szShadowPath, wcsncpy(szShadowPath, m_szShadowCopyName[nDriveIndex], nBuflen); nBuflen -= (int)wcslen(m_szShadowCopyName[nDriveIndex]); wcsncat(szShadowPath, szFilePath+2, nBuflen); - return TRUE; + return true; } } wcsncpy(szShadowPath, szFilePath, nBuflen); errno = EINVAL; - return FALSE; + return false; } const size_t VSSClient::GetWriterCount() { - alist* pV = (alist*)m_pAlistWriterInfoText; + alist* pV = m_pAlistWriterInfoText; return pV->size(); } const char* VSSClient::GetWriterInfo(int nIndex) { - alist* pV = (alist*)m_pAlistWriterInfoText; + alist* pV = m_pAlistWriterInfoText; return (char*)pV->get(nIndex); } const int VSSClient::GetWriterState(int nIndex) { - alist* pV = (alist*)m_pAlistWriterState; - return (intptr_t)pV->get(nIndex); + alist* pV = m_pAlistWriterState; + return (int64_t)pV->get(nIndex); } void VSSClient::AppendWriterInfo(int nState, const char* pszInfo) { - alist* pT = (alist*) m_pAlistWriterInfoText; - alist* pS = (alist*) m_pAlistWriterState; + alist* pT = m_pAlistWriterInfoText; + alist* pS = m_pAlistWriterState; pT->push(bstrdup(pszInfo)); pS->push((void*)nState); @@ -229,8 +229,8 @@ void VSSClient::AppendWriterInfo(int nState, const char* pszInfo) void VSSClient::DestroyWriterInfo() { - alist* pT = (alist*)m_pAlistWriterInfoText; - alist* pS = (alist*)m_pAlistWriterState; + alist* pT = m_pAlistWriterInfoText; + alist* pS = m_pAlistWriterState; while (!pT->empty()) free(pT->pop()); diff --git a/bacula/src/win32/filed/vss.h b/bacula/src/win32/filed/vss.h index 25709a60ec..e25de09d97 100644 --- a/bacula/src/win32/filed/vss.h +++ b/bacula/src/win32/filed/vss.h @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2006-2007 Free Software Foundation Europe e.V. + Copyright (C) 2006-2010 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -56,44 +56,45 @@ public: virtual ~VSSClient(); // Backup Process - BOOL InitializeForBackup(); - virtual BOOL CreateSnapshots(char* szDriveLetters) = 0; - virtual BOOL CloseBackup() = 0; + bool InitializeForBackup(JCR *jcr); + virtual bool CreateSnapshots(char* szDriveLetters) = 0; + virtual bool CloseBackup() = 0; virtual const char* GetDriverName() = 0; - BOOL GetShadowPath (const char* szFilePath, char* szShadowPath, int nBuflen); - BOOL GetShadowPathW (const wchar_t* szFilePath, wchar_t* szShadowPath, int nBuflen); /* nBuflen in characters */ + bool GetShadowPath (const char* szFilePath, char* szShadowPath, int nBuflen); + bool GetShadowPathW (const wchar_t* szFilePath, wchar_t* szShadowPath, int nBuflen); /* nBuflen in characters */ const size_t GetWriterCount(); const char* GetWriterInfo(int nIndex); const int GetWriterState(int nIndex); void DestroyWriterInfo(); void AppendWriterInfo(int nState, const char* pszInfo); - const BOOL IsInitialized() { return m_bBackupIsInitialized; }; + const bool IsInitialized() { return m_bBackupIsInitialized; }; private: - virtual BOOL Initialize(DWORD dwContext, BOOL bDuringRestore = FALSE) = 0; - virtual BOOL WaitAndCheckForAsyncOperation(IVssAsync* pAsync) = 0; + virtual bool Initialize(DWORD dwContext, bool bDuringRestore = FALSE) = 0; + virtual bool WaitAndCheckForAsyncOperation(IVssAsync* pAsync) = 0; virtual void QuerySnapshotSet(GUID snapshotSetID) = 0; protected: - HMODULE m_hLib; + HMODULE m_hLib; + JCR *m_jcr; - BOOL m_bCoInitializeCalled; - BOOL m_bCoInitializeSecurityCalled; - DWORD m_dwContext; + DWORD m_dwContext; - IUnknown* m_pVssObject; - GUID m_uidCurrentSnapshotSet; - // TRUE if we are during restore - BOOL m_bDuringRestore; - BOOL m_bBackupIsInitialized; + IUnknown* m_pVssObject; + GUID m_uidCurrentSnapshotSet; // drive A will be stored on position 0,Z on pos. 25 - wchar_t m_wszUniqueVolumeName[26][MAX_PATH]; // approx. 7 KB - wchar_t m_szShadowCopyName[26][MAX_PATH]; // approx. 7 KB + wchar_t m_wszUniqueVolumeName[26][MAX_PATH]; // approx. 7 KB + wchar_t m_szShadowCopyName[26][MAX_PATH]; // approx. 7 KB - void* m_pAlistWriterState; - void* m_pAlistWriterInfoText; + alist *m_pAlistWriterState; + alist *m_pAlistWriterInfoText; + + bool m_bCoInitializeCalled; + bool m_bCoInitializeSecurityCalled; + bool m_bDuringRestore; /* true if we are doing a restore */ + bool m_bBackupIsInitialized; }; class VSSClientXP:public VSSClient @@ -101,14 +102,14 @@ class VSSClientXP:public VSSClient public: VSSClientXP(); virtual ~VSSClientXP(); - virtual BOOL CreateSnapshots(char* szDriveLetters); - virtual BOOL CloseBackup(); + virtual bool CreateSnapshots(char* szDriveLetters); + virtual bool CloseBackup(); virtual const char* GetDriverName() { return "VSS WinXP"; }; private: - virtual BOOL Initialize(DWORD dwContext, BOOL bDuringRestore); - virtual BOOL WaitAndCheckForAsyncOperation(IVssAsync* pAsync); + virtual bool Initialize(DWORD dwContext, bool bDuringRestore); + virtual bool WaitAndCheckForAsyncOperation(IVssAsync* pAsync); virtual void QuerySnapshotSet(GUID snapshotSetID); - BOOL CheckWriterStatus(); + bool CheckWriterStatus(); }; class VSSClient2003:public VSSClient @@ -116,14 +117,14 @@ class VSSClient2003:public VSSClient public: VSSClient2003(); virtual ~VSSClient2003(); - virtual BOOL CreateSnapshots(char* szDriveLetters); - virtual BOOL CloseBackup(); + virtual bool CreateSnapshots(char* szDriveLetters); + virtual bool CloseBackup(); virtual const char* GetDriverName() { return "VSS Win 2003"; }; private: - virtual BOOL Initialize(DWORD dwContext, BOOL bDuringRestore); - virtual BOOL WaitAndCheckForAsyncOperation(IVssAsync* pAsync); + virtual bool Initialize(DWORD dwContext, bool bDuringRestore); + virtual bool WaitAndCheckForAsyncOperation(IVssAsync* pAsync); virtual void QuerySnapshotSet(GUID snapshotSetID); - BOOL CheckWriterStatus(); + bool CheckWriterStatus(); }; class VSSClientVista:public VSSClient @@ -131,14 +132,14 @@ class VSSClientVista:public VSSClient public: VSSClientVista(); virtual ~VSSClientVista(); - virtual BOOL CreateSnapshots(char* szDriveLetters); - virtual BOOL CloseBackup(); + virtual bool CreateSnapshots(char* szDriveLetters); + virtual bool CloseBackup(); virtual const char* GetDriverName() { return "VSS Vista"; }; private: - virtual BOOL Initialize(DWORD dwContext, BOOL bDuringRestore); - virtual BOOL WaitAndCheckForAsyncOperation(IVssAsync* pAsync); + virtual bool Initialize(DWORD dwContext, bool bDuringRestore); + virtual bool WaitAndCheckForAsyncOperation(IVssAsync* pAsync); virtual void QuerySnapshotSet(GUID snapshotSetID); - BOOL CheckWriterStatus(); + bool CheckWriterStatus(); }; diff --git a/bacula/src/win32/filed/vss_generic.cpp b/bacula/src/win32/filed/vss_generic.cpp index cdcf288456..7aa6f03ed1 100644 --- a/bacula/src/win32/filed/vss_generic.cpp +++ b/bacula/src/win32/filed/vss_generic.cpp @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2005-2008 Free Software Foundation Europe e.V. + Copyright (C) 2005-2010 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -232,12 +232,12 @@ VSSClientGeneric::~VSSClientGeneric() } // Initialize the COM infrastructure and the internal pointers -BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) +bool VSSClientGeneric::Initialize(DWORD dwContext, bool bDuringRestore) { if (!(p_CreateVssBackupComponents && p_VssFreeSnapshotProperties)) { Dmsg2(0, "VSSClientGeneric::Initialize: p_CreateVssBackupComponents = 0x%08X, p_VssFreeSnapshotProperties = 0x%08X\n", p_CreateVssBackupComponents, p_VssFreeSnapshotProperties); errno = ENOSYS; - return FALSE; + return false; } HRESULT hr; @@ -247,7 +247,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: CoInitialize returned 0x%08X\n", hr); errno = b_errno_win32; - return FALSE; + return false; } m_bCoInitializeCalled = true; } @@ -270,7 +270,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: CoInitializeSecurity returned 0x%08X\n", hr); errno = b_errno_win32; - return FALSE; + return false; } m_bCoInitializeSecurityCalled = true; } @@ -288,7 +288,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) Dmsg2(0, "VSSClientGeneric::Initialize: CreateVssBackupComponents returned 0x%08X. ERR=%s\n", hr, be.bstrerror(b_errno_win32)); errno = b_errno_win32; - return FALSE; + return false; } #if defined(B_VSS_W2K3) || defined(B_VSS_VISTA) @@ -297,7 +297,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->SetContext returned 0x%08X\n", hr); errno = b_errno_win32; - return FALSE; + return false; } } #endif @@ -308,7 +308,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->InitializeForBackup returned 0x%08X\n", hr); errno = b_errno_win32; - return FALSE; + return false; } // 2. SetBackupState @@ -316,7 +316,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->SetBackupState returned 0x%08X\n", hr); errno = b_errno_win32; - return FALSE; + return false; } CComPtr pAsync1; @@ -325,7 +325,7 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->GatherWriterMetadata returned 0x%08X\n", hr); errno = b_errno_win32; - return FALSE; + return false; } // Waits for the async operation to finish and checks the result WaitAndCheckForAsyncOperation(pAsync1.p); @@ -337,11 +337,11 @@ BOOL VSSClientGeneric::Initialize(DWORD dwContext, BOOL bDuringRestore) // Keep the context m_dwContext = dwContext; - return TRUE; + return true; } -BOOL VSSClientGeneric::WaitAndCheckForAsyncOperation(IVssAsync* pAsync) +bool VSSClientGeneric::WaitAndCheckForAsyncOperation(IVssAsync* pAsync) { // Wait until the async operation finishes // unfortunately we can't use a timeout here yet. @@ -368,7 +368,7 @@ BOOL VSSClientGeneric::WaitAndCheckForAsyncOperation(IVssAsync* pAsync) } while ((timeout-- > 0) && (hrReturned == VSS_S_ASYNC_PENDING)); if (hrReturned == VSS_S_ASYNC_FINISHED) - return TRUE; + return true; #ifdef xDEBUG @@ -389,10 +389,10 @@ BOOL VSSClientGeneric::WaitAndCheckForAsyncOperation(IVssAsync* pAsync) } #endif - return FALSE; + return false; } -BOOL VSSClientGeneric::CreateSnapshots(char* szDriveLetters) +bool VSSClientGeneric::CreateSnapshots(char* szDriveLetters) { /* szDriveLetters contains all drive letters in uppercase */ /* if a drive can not being added, it's converted to lowercase in szDriveLetters */ @@ -400,7 +400,7 @@ BOOL VSSClientGeneric::CreateSnapshots(char* szDriveLetters) if (!m_pVssObject || m_bBackupIsInitialized) { errno = ENOSYS; - return FALSE; + return false; } m_uidCurrentSnapshotSet = GUID_NULL; @@ -437,7 +437,7 @@ BOOL VSSClientGeneric::CreateSnapshots(char* szDriveLetters) /* PrepareForBackup */ if (FAILED(pVss->PrepareForBackup(&pAsync1.p))) { errno = b_errno_win32; - return FALSE; + return false; } // Waits for the async operation to finish and checks the result @@ -446,13 +446,13 @@ BOOL VSSClientGeneric::CreateSnapshots(char* szDriveLetters) /* get latest info about writer status */ if (!CheckWriterStatus()) { errno = b_errno_win32; - return FALSE; + return false; } /* DoSnapShotSet */ if (FAILED(pVss->DoSnapshotSet(&pAsync2.p))) { errno = b_errno_win32; - return FALSE; + return false; } // Waits for the async operation to finish and checks the result @@ -465,12 +465,12 @@ BOOL VSSClientGeneric::CreateSnapshots(char* szDriveLetters) m_bBackupIsInitialized = true; - return TRUE; + return true; } -BOOL VSSClientGeneric::CloseBackup() +bool VSSClientGeneric::CloseBackup() { - BOOL bRet = FALSE; + bool bRet = false; if (!m_pVssObject) errno = ENOSYS; else { @@ -484,7 +484,7 @@ BOOL VSSClientGeneric::CloseBackup() if (SUCCEEDED(pVss->BackupComplete(&pAsync.p))) { // Waits for the async operation to finish and checks the result WaitAndCheckForAsyncOperation(pAsync.p); - bRet = TRUE; + bRet = true; } else { errno = b_errno_win32; pVss->AbortBackup(); @@ -500,7 +500,7 @@ BOOL VSSClientGeneric::CloseBackup() pVss->DeleteSnapshots( m_uidCurrentSnapshotSet, VSS_OBJECT_SNAPSHOT_SET, - FALSE, + false, &lSnapshots, &idNonDeletedSnapshotID); @@ -578,7 +578,7 @@ void VSSClientGeneric::QuerySnapshotSet(GUID snapshotSetID) } // Check the status for all selected writers -BOOL VSSClientGeneric::CheckWriterStatus() +bool VSSClientGeneric::CheckWriterStatus() { /* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vss/base/ivssbackupcomponents_startsnapshotset.asp @@ -592,7 +592,7 @@ BOOL VSSClientGeneric::CheckWriterStatus() HRESULT hr = pVss->GatherWriterStatus(&pAsync.p); if (FAILED(hr)) { errno = b_errno_win32; - return FALSE; + return false; } // Waits for the async operation to finish and checks the result @@ -603,7 +603,7 @@ BOOL VSSClientGeneric::CheckWriterStatus() hr = pVss->GetWriterStatusCount(&cWriters); if (FAILED(hr)) { errno = b_errno_win32; - return FALSE; + return false; } int nState; @@ -671,11 +671,11 @@ BOOL VSSClientGeneric::CheckWriterStatus() if (FAILED(hr)) { errno = b_errno_win32; - return FALSE; + return false; } errno = 0; - return TRUE; + return true; } #endif /* WIN32_VSS */ -- 2.39.5