//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996-1999 // // File: tlsbkup.cpp // // Contents: // Backup/restore of database // // History: // 5/28/99 Created RobLeit //--------------------------------------------------------------------------- #include "pch.cpp" #include "globals.h" #include "init.h" #define STRSAFE_NO_DEPRECATE #include extern "C" VOID ServiceStop(); static BOOL g_fDoingBackupRestore = FALSE; static CCriticalSection g_csBackupRestore; //////////////////////////////////////////////////////////////////////////// extern "C" HRESULT WINAPI ExportTlsDatabase( ) /*++ --*/ { RPC_STATUS rpcStatus; HRESULT hr = S_OK; TCHAR szExportedDb[MAX_PATH+1]; TCHAR *pszExportedDbEnd; size_t cbRemaining; if (g_fDoingBackupRestore) { return HRESULT_FROM_WIN32(ERROR_BUSY); } g_csBackupRestore.Lock(); if (g_fDoingBackupRestore) { g_csBackupRestore.UnLock(); return HRESULT_FROM_WIN32(ERROR_BUSY); } // ignore all call if service is shutting down if( IsServiceShuttingdown() == TRUE ) { g_csBackupRestore.UnLock(); return HRESULT_FROM_WIN32(ERROR_BUSY); } g_fDoingBackupRestore = TRUE; // Tell RPC threads to stop handling clients ServiceSignalShutdown(); // Stop listening to other RPC interfaces (VOID)RpcServerUnregisterIf(TermServLicensing_v1_0_s_ifspec, NULL, // UUID TRUE); // Wait for calls to complete (VOID)RpcServerUnregisterIf(HydraLicenseService_v1_0_s_ifspec, NULL, // UUID TRUE); // Wait for calls to complete // Release handles to database TLSPrepareForBackupRestore(); hr = StringCbCopyEx(szExportedDb,sizeof(szExportedDb),g_szDatabaseDir,&pszExportedDbEnd, &cbRemaining,0); if (FAILED(hr)) { goto cleanup; } hr = StringCbCopyEx(pszExportedDbEnd,cbRemaining,TLSBACKUP_EXPORT_DIR,&pszExportedDbEnd, &cbRemaining,0); if (FAILED(hr)) { goto cleanup; } CreateDirectoryEx(g_szDatabaseDir, szExportedDb, NULL); // Ignore errors, they'll show up in CopyFile hr = StringCbCopyEx(pszExportedDbEnd,cbRemaining,_TEXT("\\"),&pszExportedDbEnd, &cbRemaining,0); if (FAILED(hr)) { goto cleanup; } hr = StringCbCopyEx(pszExportedDbEnd,cbRemaining,g_szDatabaseFname,NULL,NULL,0); if (FAILED(hr)) { goto cleanup; } // Copy database file if (!CopyFile(g_szDatabaseFile,szExportedDb,FALSE)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto cleanup; } cleanup: // Restart RPC and work manager ServiceResetShutdownEvent(); // Restart after backup hr = TLSRestartAfterBackupRestore(TRUE); if( ERROR_SUCCESS != hr ) { // force a shutdown... ServiceSignalShutdown(); ServiceStop(); } else { // Begin listening again hr = RpcServerRegisterIf(TermServLicensing_v1_0_s_ifspec, NULL, NULL); if(SUCCEEDED(hr)) { hr = RpcServerRegisterIf(HydraLicenseService_v1_0_s_ifspec, NULL, NULL); } if(FAILED(hr)) { // force a shutdown... ServiceSignalShutdown(); ServiceStop(); } } g_fDoingBackupRestore = FALSE; g_csBackupRestore.UnLock(); return hr; } //////////////////////////////////////////////////////////////////////////// extern "C" HRESULT WINAPI ImportTlsDatabase( ) /*++ --*/ { HRESULT hr = S_OK; if (g_fDoingBackupRestore) { return HRESULT_FROM_WIN32(ERROR_BUSY); } g_csBackupRestore.Lock(); if (g_fDoingBackupRestore) { g_csBackupRestore.UnLock(); return HRESULT_FROM_WIN32(ERROR_BUSY); } // ignore all call if service is shutting down if( IsServiceShuttingdown() == TRUE ) { g_csBackupRestore.UnLock(); return HRESULT_FROM_WIN32(ERROR_BUSY); } g_fDoingBackupRestore = TRUE; // Tell RPC threads to stop handling clients ServiceSignalShutdown(); // Stop listening to other RPC interfaces (VOID)RpcServerUnregisterIf(TermServLicensing_v1_0_s_ifspec, NULL, // UUID TRUE); // Wait for calls to complete (VOID)RpcServerUnregisterIf(HydraLicenseService_v1_0_s_ifspec, NULL, // UUID TRUE); // Wait for calls to complete TLSPrepareForBackupRestore(); // Restart RPC ServiceResetShutdownEvent(); // not restart after backup hr = TLSRestartAfterBackupRestore(FALSE); if( ERROR_SUCCESS != hr ) { // force a shutdown... ServiceSignalShutdown(); ServiceStop(); } else { // Begin listening again hr = RpcServerRegisterIf(TermServLicensing_v1_0_s_ifspec, NULL, NULL); if(SUCCEEDED(hr)) { hr = RpcServerRegisterIf(HydraLicenseService_v1_0_s_ifspec, NULL, NULL); } if(FAILED(hr)) { // force a shutdown... ServiceSignalShutdown(); ServiceStop(); } } g_fDoingBackupRestore = FALSE; g_csBackupRestore.UnLock(); return hr; }