You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
5.1 KiB
348 lines
5.1 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
node.c
|
|
|
|
Abstract:
|
|
|
|
Public interfaces for managing the nodes of a cluster
|
|
|
|
Author:
|
|
|
|
John Vert (jvert) 11-Jan-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "apip.h"
|
|
|
|
|
|
HNODE_RPC
|
|
s_ApiOpenNode(
|
|
IN handle_t IDL_handle,
|
|
IN LPCWSTR lpszNodeName,
|
|
OUT error_status_t *Status
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Opens a handle to an existing node object.
|
|
|
|
Arguments:
|
|
|
|
IDL_handle - RPC binding handle, not used.
|
|
|
|
lpszNodeName - Supplies the name of the node to open.
|
|
|
|
Status - Returns any error
|
|
|
|
Return Value:
|
|
|
|
A context handle to a node object if successful
|
|
|
|
NULL otherwise.
|
|
|
|
--*/
|
|
|
|
{
|
|
HNODE_RPC Node;
|
|
PAPI_HANDLE Handle;
|
|
|
|
if (ApiState != ApiStateOnline) {
|
|
*Status = ERROR_SHARING_PAUSED;
|
|
return(NULL);
|
|
}
|
|
Handle = LocalAlloc(LMEM_FIXED, sizeof(API_HANDLE));
|
|
if (Handle == NULL) {
|
|
*Status = ERROR_NOT_ENOUGH_MEMORY;
|
|
return(NULL);
|
|
}
|
|
|
|
Node = OmReferenceObjectByName(ObjectTypeNode, lpszNodeName);
|
|
if (Node != NULL) {
|
|
*Status = ERROR_SUCCESS;
|
|
} else {
|
|
*Status = ERROR_CLUSTER_NODE_NOT_FOUND;
|
|
LocalFree(Handle);
|
|
return(NULL);
|
|
}
|
|
Handle->Type = API_NODE_HANDLE;
|
|
Handle->Node = Node;
|
|
Handle->Flags = 0;
|
|
InitializeListHead(&Handle->NotifyList);
|
|
return(Handle);
|
|
}
|
|
|
|
|
|
error_status_t
|
|
s_ApiGetNodeId(
|
|
IN HNODE_RPC hNode,
|
|
OUT LPWSTR *pGuid
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the unique identifier for a node.
|
|
|
|
Arguments:
|
|
|
|
hNode - Supplies the node whose identifer is to be returned
|
|
|
|
pGuid - Returns the unique identifier. This memory must be freed on the
|
|
client side.
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS if successful
|
|
|
|
Win32 error code otherwise.
|
|
|
|
--*/
|
|
|
|
{
|
|
PNM_NODE Node;
|
|
DWORD IdLen;
|
|
LPCWSTR Id;
|
|
|
|
API_ASSERT_INIT();
|
|
|
|
VALIDATE_NODE(Node, hNode);
|
|
|
|
Id = OmObjectId(Node);
|
|
CL_ASSERT(Id != NULL);
|
|
|
|
IdLen = (lstrlenW(Id)+1)*sizeof(WCHAR);
|
|
*pGuid = MIDL_user_allocate(IdLen);
|
|
if (*pGuid == NULL) {
|
|
return(ERROR_NOT_ENOUGH_MEMORY);
|
|
}
|
|
CopyMemory(*pGuid, Id, IdLen);
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|
|
|
|
error_status_t
|
|
s_ApiCloseNode(
|
|
IN OUT HNODE_RPC *phNode
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Closes an open node context handle.
|
|
|
|
Arguments:
|
|
|
|
Node - Supplies a pointer to the HNODE_RPC to be closed.
|
|
Returns NULL
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
PNM_NODE Node;
|
|
PAPI_HANDLE Handle;
|
|
|
|
API_ASSERT_INIT();
|
|
|
|
VALIDATE_NODE(Node, *phNode);
|
|
|
|
Handle = (PAPI_HANDLE)*phNode;
|
|
ApipRundownNotify(Handle);
|
|
|
|
OmDereferenceObject(Node);
|
|
LocalFree(*phNode);
|
|
*phNode = NULL;
|
|
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
HNODE_RPC_rundown(
|
|
IN HNODE_RPC Node
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
RPC rundown procedure for a HNODE_RPC. Just closes the handle.
|
|
|
|
Arguments:
|
|
|
|
Node - supplies the HNODE_RPC that is to be rundown.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
s_ApiCloseNode(&Node);
|
|
|
|
}
|
|
|
|
|
|
error_status_t
|
|
s_ApiGetNodeState(
|
|
IN HNODE_RPC hNode,
|
|
OUT DWORD *lpState
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Returns the current state of the specified node.
|
|
|
|
Arguments:
|
|
|
|
hNode - Supplies the node whose state is to be returned.
|
|
|
|
lpState - Returns the current state of the node
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS if successful
|
|
|
|
Win32 error code otherwise
|
|
|
|
--*/
|
|
|
|
{
|
|
PNM_NODE Node;
|
|
|
|
API_ASSERT_INIT();
|
|
|
|
VALIDATE_NODE(Node, hNode);
|
|
|
|
// *lpState = NmGetNodeState( Node );
|
|
*lpState = NmGetExtendedNodeState( Node );
|
|
return( ERROR_SUCCESS );
|
|
}
|
|
|
|
|
|
error_status_t
|
|
s_ApiPauseNode(
|
|
IN HNODE_RPC hNode
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Pauses a node in the cluster
|
|
|
|
Arguments:
|
|
|
|
hNode - Supplies the node to be paused.
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS if successful
|
|
|
|
Win32 error code otherwise
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD Status;
|
|
PNM_NODE Node;
|
|
|
|
API_ASSERT_INIT();
|
|
|
|
VALIDATE_NODE(Node, hNode);
|
|
|
|
Status = NmPauseNode( Node );
|
|
return( Status );
|
|
|
|
}
|
|
|
|
|
|
error_status_t
|
|
s_ApiResumeNode(
|
|
IN HNODE_RPC hNode
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Resumes a node in the cluster
|
|
|
|
Arguments:
|
|
|
|
hNode - Supplies the node to be resumed.
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS if successful
|
|
|
|
Win32 error code otherwise
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD Status;
|
|
PNM_NODE Node;
|
|
|
|
API_ASSERT_INIT();
|
|
|
|
VALIDATE_NODE(Node, hNode);
|
|
|
|
Status = NmResumeNode( Node );
|
|
return( Status );
|
|
|
|
}
|
|
|
|
|
|
error_status_t
|
|
s_ApiEvictNode(
|
|
IN HNODE_RPC hNode
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Pauses a node in the cluster
|
|
|
|
Arguments:
|
|
|
|
hNode - Supplies the node to be evicted.
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS if successful
|
|
|
|
Win32 error code otherwise
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD Status;
|
|
PNM_NODE Node;
|
|
|
|
API_ASSERT_INIT();
|
|
|
|
VALIDATE_NODE(Node, hNode);
|
|
|
|
Status = NmEvictNode( Node );
|
|
return( Status );
|
|
|
|
}
|