|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
holdrpc.c
Abstract:
utility to test hold intracluster RPC feature
Author:
Charlie Wickham (charlwi) 22-Jul-1999
Environment:
User mode
Revision History:
--*/
#define UNICODE 1
#define _UNICODE 1
#define CMDWINDOW
#include "cluster.h"
#include "api_rpc.h"
int __cdecl wmain( int argc, WCHAR *argv[] )
/*++
Routine Description:
main routine for utility. first arg is sleep time in seconds. 2nd through Nth arg are node names of cluster nodes
Arguments:
standard command line args
Return Value:
0 if it worked successfully
--*/
{ DWORD status; PWCHAR lpszClusterName; WCHAR *strBinding = NULL; RPC_BINDING_HANDLE rpcHandle[10]; DWORD numNodes; DWORD sleepTime; DWORD i;
sleepTime = _wtoi( argv[1] );
argc -= 2; numNodes = 0; while ( argc-- ) { lpszClusterName = argv[2 + numNodes]; printf("Contacting node %ws\n", lpszClusterName );
//
// Determine which node we should connect to. If someone has
// passed in NULL, we know we can connect to the cluster service
// over LPC. Otherwise, use RPC.
//
if ((lpszClusterName == NULL) || (lpszClusterName[0] == '\0')) {
status = RpcStringBindingComposeW(L"b97db8b2-4c63-11cf-bff6-08002be23f2f", L"ncalrpc", NULL, L"clusapi", NULL, &strBinding); if (status != RPC_S_OK) { goto error_exit; }
status = RpcBindingFromStringBindingW(strBinding, &rpcHandle[numNodes]); RpcStringFreeW(&strBinding); if (status != RPC_S_OK) { goto error_exit; } } else {
//
// Try to connect directly to the cluster.
//
status = RpcStringBindingComposeW(L"b97db8b2-4c63-11cf-bff6-08002be23f2f", L"ncadg_ip_udp", (LPWSTR)lpszClusterName, NULL, NULL, &strBinding); if (status != RPC_S_OK) { goto error_exit; } status = RpcBindingFromStringBindingW(strBinding, &rpcHandle[numNodes]); RpcStringFreeW(&strBinding); if (status != RPC_S_OK) { goto error_exit; }
//
// Resolve the binding handle endpoint
//
status = RpcEpResolveBinding(rpcHandle[numNodes], clusapi_v2_0_c_ifspec); if (status != RPC_S_OK) { goto error_exit; } }
status = RpcBindingSetAuthInfoW(rpcHandle[numNodes], NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_AUTHN_WINNT, NULL, RPC_C_AUTHZ_NAME); if (status != RPC_S_OK) { goto error_exit; } ++numNodes; }
//
// issue hold
//
for( i = 0; i < numNodes; ++i ) { status = ApiHoldRpcCalls(rpcHandle[i]); printf("Hold status for node %u = %u\n", i, status ); }
Sleep( sleepTime * 1000 );
//
// issue release
//
for( i = 0; i < numNodes; ++i ) { status = ApiReleaseRpcCalls(rpcHandle[i]); printf("Release status for node %u = %u\n", i, status ); }
for( i = 0; i < numNodes; ++i ) { RpcBindingFree( &rpcHandle[i] ); } return 0;
error_exit: printf("died: status = %u\n", status ); return status;
} // wmain
/* end holdrpc.c */
|