//+-------------------------------------------------------------------------- // // 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" 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]; 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(); _tcscpy(szExportedDb,g_szDatabaseDir); _tcscat(szExportedDb,TLSBACKUP_EXPORT_DIR); CreateDirectoryEx(g_szDatabaseDir, szExportedDb, NULL); // Ignore errors, they'll show up in CopyFile _tcscat(szExportedDb, _TEXT("\\")); _tcscat(szExportedDb,g_szDatabaseFname); // 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 RpcServerRegisterIf(TermServLicensing_v1_0_s_ifspec, NULL, NULL); RpcServerRegisterIf(HydraLicenseService_v1_0_s_ifspec, NULL, NULL); } 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 RpcServerRegisterIf(TermServLicensing_v1_0_s_ifspec, NULL, NULL); RpcServerRegisterIf(HydraLicenseService_v1_0_s_ifspec, NULL, NULL); } g_fDoingBackupRestore = FALSE; g_csBackupRestore.UnLock(); return hr; }