/*++

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 */