159 lines
3.7 KiB
C
159 lines
3.7 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1996 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
fmvote.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Cluster FM Global Update processing routines.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Sunita shrivastava (sunitas) 24-Apr-1996
|
|||
|
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "fmp.h"
|
|||
|
|
|||
|
#include "ntrtl.h"
|
|||
|
|
|||
|
#define LOG_MODULE FMVOTE
|
|||
|
|
|||
|
|
|||
|
/****
|
|||
|
@func DWORD | FmpGumVoteHandler| This is invoked by gum when fm requests
|
|||
|
a vote for a given context.
|
|||
|
|
|||
|
@parm IN DWORD | dwContext| The gum update type for which the vote is
|
|||
|
being collected.
|
|||
|
|
|||
|
@parm IN DWORD | dwInputBufLength| The length of the input buffer.
|
|||
|
|
|||
|
@parm IN PVOID | pInputBuf| A pointer to the input buffer based on
|
|||
|
which a vote must be cast.
|
|||
|
|
|||
|
@parm IN DWORD | dwVoteLength | The length of the buffer pointed to
|
|||
|
by pVoteBuf.
|
|||
|
|
|||
|
@parm OUT POVID | pVoteBuf | A pointer to a buffer of size dwVoteLength
|
|||
|
where the vote must be cast.
|
|||
|
|
|||
|
|
|||
|
@comm The votes are collected by gum and returned to the node that is taking
|
|||
|
the poll.
|
|||
|
|
|||
|
@rdesc Returns a result code. ERROR_SUCCESS on success.
|
|||
|
|
|||
|
@xref <f DmSwitchToNewQuorumLog>
|
|||
|
****/
|
|||
|
|
|||
|
DWORD
|
|||
|
WINAPI
|
|||
|
FmpGumVoteHandler(
|
|||
|
IN DWORD dwContext,
|
|||
|
IN DWORD dwInputBufLength,
|
|||
|
IN PVOID pInputBuf,
|
|||
|
IN DWORD dwVoteLength,
|
|||
|
OUT PVOID pVoteBuf
|
|||
|
)
|
|||
|
{
|
|||
|
|
|||
|
DWORD dwStatus = ERROR_SUCCESS;
|
|||
|
|
|||
|
if ( !FmpFMGroupsInited ||
|
|||
|
FmpShutdown )
|
|||
|
{
|
|||
|
return(ERROR_NOT_READY);
|
|||
|
}
|
|||
|
|
|||
|
switch ( dwContext )
|
|||
|
{
|
|||
|
case FmUpdatePossibleNodeForResType:
|
|||
|
dwStatus = FmpVotePossibleNodeForResType(dwInputBufLength,
|
|||
|
(LPCWSTR)pInputBuf, dwVoteLength, pVoteBuf);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
dwStatus = ERROR_REQUEST_ABORTED;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return(dwStatus);
|
|||
|
|
|||
|
} // FmpGumVoteHandler
|
|||
|
|
|||
|
|
|||
|
/****
|
|||
|
@func DWORD | FmpGumVoteHandler| This is invoked by gum when fm requests
|
|||
|
a vote for a given context.
|
|||
|
|
|||
|
@parm IN DWORD | dwContext| The gum update type for which the vote is
|
|||
|
being collected.
|
|||
|
|
|||
|
@parm IN DWORD | dwInputBufLength| The length of the input buffer.
|
|||
|
|
|||
|
@parm IN PVOID | pInputBuf| A pointer to the input buffer based on
|
|||
|
which a vote must be cast.
|
|||
|
|
|||
|
@parm IN DWORD | dwVoteLength | The length of the buffer pointed to
|
|||
|
by pVoteBuf.
|
|||
|
|
|||
|
@parm OUT POVID | pVoteBuf | A pointer to a buffer of size dwVoteLength
|
|||
|
where the vote must be cast.
|
|||
|
|
|||
|
|
|||
|
@comm The votes are collected by gum and returned to the node that is taking
|
|||
|
the poll.
|
|||
|
|
|||
|
@rdesc Returns a result code. ERROR_SUCCESS on success.
|
|||
|
|
|||
|
@xref <f DmSwitchToNewQuorumLog>
|
|||
|
****/
|
|||
|
|
|||
|
DWORD FmpVotePossibleNodeForResType(
|
|||
|
IN DWORD dwInputBufLength,
|
|||
|
IN LPCWSTR lpszResType,
|
|||
|
IN DWORD dwVoteLength,
|
|||
|
OUT PVOID pVoteBuf
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD dwStatus = ERROR_SUCCESS;
|
|||
|
DWORD dwVoteStatus;
|
|||
|
PFMP_VOTE_POSSIBLE_NODE_FOR_RESTYPE pVoteResType;
|
|||
|
PFM_RESTYPE pResType=NULL;
|
|||
|
|
|||
|
|
|||
|
if (dwVoteLength != sizeof(FMP_VOTE_POSSIBLE_NODE_FOR_RESTYPE))
|
|||
|
return (ERROR_INVALID_PARAMETER);
|
|||
|
|
|||
|
pVoteResType = (PFMP_VOTE_POSSIBLE_NODE_FOR_RESTYPE)pVoteBuf;
|
|||
|
|
|||
|
pResType = OmReferenceObjectById(ObjectTypeResType, lpszResType);
|
|||
|
|
|||
|
if (!pResType)
|
|||
|
return (ERROR_INVALID_PARAMETER);
|
|||
|
|
|||
|
dwVoteStatus = FmpRmLoadResTypeDll(pResType);
|
|||
|
|
|||
|
pVoteResType->dwNodeId = NmLocalNodeId;
|
|||
|
pVoteResType->dwSize = sizeof(FMP_VOTE_POSSIBLE_NODE_FOR_RESTYPE);
|
|||
|
if (dwVoteStatus == ERROR_SUCCESS)
|
|||
|
pVoteResType->bPossibleNode = TRUE;
|
|||
|
else
|
|||
|
pVoteResType->bPossibleNode = FALSE;
|
|||
|
|
|||
|
|
|||
|
if (pResType) OmDereferenceObject(pResType);
|
|||
|
return(dwStatus);
|
|||
|
}
|
|||
|
|
|||
|
|