349 lines
4.8 KiB
C
349 lines
4.8 KiB
C
/*++
|
||
|
||
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 );
|
||
|
||
}
|