|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
instance.cxx
Abstract:
General server instance control utility functions.
Author:
Keith Moore (keithmo) 05-Feb-1997
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
//
// Private constants.
//
//
// Private types.
//
//
// Private globals.
//
//
// Private prototypes.
//
//
// Public functions.
//
HRESULT MdGetInstanceState( IN IMSAdminBase * AdmCom, IN LPWSTR InstanceName, OUT DWORD * CurrentState, OUT DWORD * CurrentWin32Status ) {
DWORD length; METADATA_HANDLE handle; HRESULT result; METADATA_RECORD record; WCHAR path[MAX_PATH];
//
// Setup locals so we know how to cleanup on exit.
//
handle = 0;
//
// Build the instance path.
//
swprintf( path, L"/%S/%s", IIS_MD_LOCAL_MACHINE_PATH, InstanceName );
//
// Open the metabase.
//
result = AdmCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, path, METADATA_PERMISSION_READ, METABASE_OPEN_TIMEOUT, &handle );
if( FAILED(result) ) { goto Cleanup; }
//
// Read the server state.
//
length = sizeof(*CurrentState);
INITIALIZE_METADATA_RECORD( &record, MD_SERVER_STATE, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, length, CurrentState );
result = AdmCom->GetData( handle, L"", &record, &length );
if( FAILED(result) ) { goto Cleanup; }
//
// Read the win32 status.
//
length = sizeof(*CurrentWin32Status);
INITIALIZE_METADATA_RECORD( &record, MD_WIN32_ERROR, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, length, CurrentWin32Status );
result = AdmCom->GetData( handle, L"", &record, &length );
if( FAILED(result) ) {
if( result == MD_ERROR_DATA_NOT_FOUND ) { *CurrentWin32Status = NO_ERROR; result = NO_ERROR; } else { goto Cleanup; }
}
Cleanup:
if( handle != 0 ) { (VOID)AdmCom->CloseKey( handle ); }
return result;
} // MdGetInstanceState
HRESULT MdControlInstance( IN IMSAdminBase * AdmCom, IN LPWSTR InstanceName, IN DWORD Command ) {
METADATA_HANDLE handle; HRESULT result; METADATA_RECORD record; WCHAR path[MAX_PATH];
//
// Setup locals so we know how to cleanup on exit.
//
handle = 0; result = NO_ERROR;
//
// Build the instance path.
//
swprintf( path, L"/%S/%s", IIS_MD_LOCAL_MACHINE_PATH, InstanceName );
//
// Open the metabase.
//
result = AdmCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, path, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, METABASE_OPEN_TIMEOUT, &handle );
if( SUCCEEDED(result) ) {
//
// Send the command.
//
INITIALIZE_METADATA_RECORD( &record, MD_SERVER_COMMAND, METADATA_INHERIT, IIS_MD_UT_SERVER, DWORD_METADATA, sizeof(Command), &Command );
result = AdmCom->SetData( handle, L"", &record );
//
// Close the meta object handle.
//
(VOID)AdmCom->CloseKey( handle );
}
return result;
} // MdControlInstance
HRESULT MdDisplayInstanceState( IN IMSAdminBase * AdmCom, IN LPWSTR InstanceName ) {
DWORD currentState; DWORD currentWin32Status; HRESULT result;
//
// Get the current state.
//
result = MdGetInstanceState( AdmCom, InstanceName, ¤tState, ¤tWin32Status );
if( SUCCEEDED(result) ) {
wprintf( L"%s: state = %lu (%s), status = %lu\n", InstanceName, currentState, MdInstanceStateToString( currentState ), currentWin32Status );
}
return result;
} // MdDisplayInstanceState
LPWSTR MdInstanceStateToString( IN DWORD State ) {
static WCHAR invalidState[sizeof("INVALID STATE 4294967296")];
switch( State ) {
case MD_SERVER_STATE_STARTING : return L"Starting";
case MD_SERVER_STATE_STARTED : return L"Started";
case MD_SERVER_STATE_STOPPING : return L"Stopping";
case MD_SERVER_STATE_STOPPED : return L"Stopped";
case MD_SERVER_STATE_PAUSING : return L"Pausing";
case MD_SERVER_STATE_PAUSED : return L"Paused";
case MD_SERVER_STATE_CONTINUING : return L"Continuing";
}
swprintf( invalidState, L"INVALID STATE %lu", State );
return invalidState;
} // MdInstanceStateToString
//
// Private functions.
//
|