windows-nt/Source/XPSP1/NT/base/cluster/service/api/node.c

349 lines
4.8 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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 );
}