windows-nt/Source/XPSP1/NT/termsrv/license/tlserver/server/tlsbkup.cpp
2020-09-26 16:20:57 +08:00

213 lines
4.7 KiB
C++

//+--------------------------------------------------------------------------
//
// 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;
}