|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
clussprt.c
Abstract:
Public interfaces for managing clusters.
Author:
Sunita Shrivastava (sunitas) 15-Jan-1997
Revision History:
--*/ #include "clusprtp.h"
//
// General Cluster Support Routines for base components
//
/****
@doc EXTERNAL INTERFACES CLUSSVC CLUSSPRT EVTLOG ****/
/****
@func HANDLE WINAPI | BindToClusterSvc| This returns a handle via which you can talk to the cluster service.
@parm IN LPWSTR | lpszClusterName | A pointer to the cluster name. If NULL, this connects to the local cluster service.
@rdesc Returns a handle to the binding if successful, else returns NULL. Error can be obtained by calling GetLastError().
@comm The handle obtained from this must be passed on to other apis exported by this module. It must be freed eventually by calling UnbindFromClusterSvc().
@xref <f UnbindFromClusterSvc> ****/ HANDLE WINAPI BindToClusterSvc(IN LPWSTR lpszClusterName) { WCHAR *pBinding = NULL; PCLUSTER_SPRT pCluster; DWORD Status = ERROR_SUCCESS; pCluster = LocalAlloc(LMEM_ZEROINIT, sizeof(CLUSTER_SPRT)); if (pCluster == NULL) { Status = ERROR_NOT_ENOUGH_MEMORY; SetLastError( Status ); return NULL; } pCluster->dwSignature = CLUSTER_SPRT_SIGNATURE;
if ((lpszClusterName == NULL) || (lpszClusterName[0] == '\0')) { Status = RpcStringBindingComposeW(L"b97db8b2-4c63-11cf-bff6-08002be23f2f", L"ncalrpc", NULL, NULL, // dynamic endpoint
NULL, &pBinding); if (Status != RPC_S_OK) { goto FnExit; }
} else { //
// Try to connect to the cluster via UDP.
//
Status = RpcStringBindingComposeW(L"b97db8b2-4c63-11cf-bff6-08002be23f2f", L"ncadg_ip_udp", (LPWSTR)lpszClusterName, NULL, NULL, &pBinding); if (Status != RPC_S_OK) { goto FnExit; } } //bind to the cluster svc and save the binding handle
Status = RpcBindingFromStringBindingW(pBinding, &pCluster->RpcBinding); RpcStringFreeW(&pBinding); if (Status != RPC_S_OK) { goto FnExit; }
Status = RpcBindingSetAuthInfoW(pCluster->RpcBinding, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_AUTHN_WINNT, NULL, RPC_C_AUTHZ_NAME);
FnExit: if (Status != ERROR_SUCCESS) { if (pCluster->RpcBinding) RpcBindingFree(&(pCluster->RpcBinding)); LocalFree(pCluster); pCluster=NULL; SetLastError(Status); } return((HANDLE)pCluster); }
/****
@func DWORD | UnbindFromClusterSvc| This uninitializes the cluster wide eventlog replicating services.
@parm IN HANDLE | hCluster | A handle to the binding context obtained via BindToClusterSvc(). @rdesc Returns a result code. ERROR_SUCCESS on success.
@comm Frees the context related with this binding.
@xref <f UnbindFromClusterSvc> ****/ DWORD WINAPI UnbindFromClusterSvc(IN HANDLE hCluster) { DWORD Status = ERROR_SUCCESS; PCLUSTER_SPRT pCluster = (PCLUSTER_SPRT)hCluster; if (!pCluster || (pCluster->dwSignature != CLUSTER_SPRT_SIGNATURE) || !(pCluster->RpcBinding)) { Status = ERROR_INVALID_PARAMETER; goto FnExit; } RpcBindingFree(&(pCluster->RpcBinding)); LocalFree(pCluster);
FnExit: return(Status); }
/****
@func DWORD | PropagateEvents| This eventlog service calls the local cluster service via this api to propagate events within a cluster.
@parm IN HANDLE | hCluster | handle to a cluster binding context returned by BindToClusterSvc().
@parm IN DWORD | dwEventInfoSize | Size of the event info structure that contains the events to be propagated.
@parm IN PPACKEDEVENTINFO| pPackedEventInfo | A pointer to the packed event information structure. @rdesc Returns a result code. ERROR_SUCCESS on success.
@comm This calls ApiEvPropEvents() in the cluster via lrpc.
@xref <f BindToClusterSvc> ****/ DWORD WINAPI PropagateEvents( IN HANDLE hCluster, IN DWORD dwEventInfoSize, IN PPACKEDEVENTINFO pPackedEventInfo) { DWORD Status=ERROR_SUCCESS; PCLUSTER_SPRT pCluster=(PCLUSTER_SPRT)hCluster;
if (!pCluster || (pCluster->dwSignature != CLUSTER_SPRT_SIGNATURE) || !(pCluster->RpcBinding)) { Status = ERROR_INVALID_PARAMETER; goto FnExit; } RpcTryExcept { //call the cluster service
Status = ApiEvPropEvents(pCluster->RpcBinding, dwEventInfoSize, (UCHAR *)pPackedEventInfo); } RpcExcept (I_RpcExceptionFilter(RpcExceptionCode())) { Status = RpcExceptionCode(); } RpcEndExcept
FnExit: return(Status); }
|