/* --------------------------------------------------------------------

                      Microsoft OS/2 LAN Manager
		   Copyright(c) Microsoft Corp., 1990

		  RPC locator - Written by Steven Zeck


	This file contains a test driver for the RPC locator.
-------------------------------------------------------------------- */

#include "test.hxx"

CDEF
// #include "mailslot.hxx"
ENDDEF

int debug = -1; 		// debug trace level

struct {
    BYTE command;		// command
    BYTE szFrom[32];		// who this message is from
    BYTE buff[500];		// mailslot buffer
}mail;

// READ_MAIL_SLOT *hMail;

SZ pSelfName = "\\\\stevez1";
SZ szDomainName = "";

enum {			// mailslot communication messages
    nilMC,
    continueMC
}mailCommand;

// an array of test functions

int test0(int, SZ *), test1(int, SZ *), test2(int, SZ *), test3(int, SZ *);
int test4(int, SZ *), test5(int, SZ *);

#ifdef RPC_CXX_20
#define RpcGetch    _getch
#else
#define RpcGetch    getch
#endif

int (*pFn[])(int, SZ *) = {

    test0, test1, test2, test3, test4, test5
};

//char OSdebug, ClearExclusiveSem, CurrentTime, QueryNetProtoStack, RequestExclusiveSem;
//char maxCacheAge, pESaccess, perf, QueryNetQuery, QueryNetQueryServer;
//char MarshallEntryBaseItem, MarshallEntryGroupItem;
//char MarshallEntryServerItem, QueryNetQueryGroup;
//char FlushBufferConsoleStream, FlushBufferDebugStream;

void RaiseAssert() {}



void ReadMail ( 		// read mail from the slot

  // returns values into global mail
) //-----------------------------------------------------------------------//
{
    int cbReturnName;
    int status;

#if 0
    if (!hMail) {
       printf("No mail slot to Read\n");
       exit(-1);
    }

    printf("Waiting for Mail...");

    status = hMail->Read((PB)&mail, cbReturnName);
    printf("from: %s\n", mail.szFrom);
#endif
}

void WriteMail (		// write mail from the slot
SZ szMachine			// machine to write to

  // writes values into global mail
) //-----------------------------------------------------------------------//
{
#if 0
    int status;
    unsigned short Mstatus;
    char szNamet[100];
    WRITE_MAIL_SLOT Mail((SZ) strcat(strcpy(szNamet, szMachine), MAILNAME(t)), 0, &Mstatus);

    strcpy((char *) mail.szFrom, pSelfName);

    printf("Writing Mail to %s\n", szMachine);

    status = Mail.Write((PB)&mail, sizeof(mail));
#endif
}



int CreateMulipleBindings(

) //-----------------------------------------------------------------------//
{
    BindingVectorIn->Count = 1;

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface2, BindingVectorIn, 0)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    BindingVectorIn->Count = CountAllBindings;

//    for (int i=0; i < 8; i++) {
//    SInterface1.InterfaceId.SyntaxVersion.MinorVersion++;

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, 0)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }
//}
    return(0);
}


int test0 (			// stand alone tests
int cArgs,
SZ *paSZargs

) //-----------------------------------------------------------------------//
{
    USED(paSZargs); USED(cArgs);

    // Export a single binding.  Then look it up to see that it matched.

    BindingVectorIn->Count = 1;
    ObjectVector->Count = 1;

//    ObjectVector->Count = 2;
//    ObjectVector->Uuid[1] = &Object1;

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, 0)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    if (ClientLookup(&SInterface1, StringBinding1, 1))
        return(1);


    // Check for Version major.minor functionality

    SInterface1.InterfaceId.SyntaxVersion.MinorVersion--;

    if (ClientImport(EntryName1, &SInterface1, 0, StringBinding1, IMPORT_OK))
        return(1);

    if (ClientImport(0, &SInterface1, 0, StringBinding1, IMPORT_OK))
        return(1);

    SInterface1.InterfaceId.SyntaxVersion.MinorVersion++;

    // Check for lookup with object functinoality.

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, ObjectVector)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    if (ClientImport(EntryName1, 0, &Object1, StringBinding1, IMPORT_OK))
        return(1);

    if (ClientImport(EntryName1, &SInterface1, &Object1, StringBinding1, IMPORT_OK))
        return(1);

    if (ClientImport(0, 0, &Object1, StringBinding1, IMPORT_OK))
        return(1);


    // Check to make sure no bindings are returned when none are expected.

    if (ClientImport(EntryName1, &SInterface2, 0, StringBinding1, IMPORT_FAIL_NEXT))
        return(1);

    if (ClientImport(EntryName2, &SInterface1, 0, StringBinding1, IMPORT_FAIL_BEGIN))
        return(1);

    if (ClientImport(EntryName1, &SInterface1, &Object2, StringBinding1, IMPORT_FAIL_NEXT))
        return(1);

    SInterface1.TransferSyntax.SyntaxVersion.MajorVersion++;

    if (ClientImport(EntryName1, &SInterface1, 0, StringBinding1, IMPORT_FAIL_NEXT))
        return(1);

    SInterface1.TransferSyntax.SyntaxVersion.MajorVersion--;

    // Add some more objects to the interface.

    ObjectVector->Count = 2;

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, ObjectVector)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    // See if the second object is there.

    if (ClientImport(EntryName1, &SInterface1, &Object2, StringBinding1, IMPORT_OK))
        return(1);

    // Now remove the first object.

    ObjectVector->Count = 1;

    if (Status = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        0, ObjectVector)) {

        printf("RpcNsBindingUnexport -> %x\n", Status);
        return (1);
    }

    // The first object should be gone.

    if (ClientImport(EntryName1, &SInterface1, &Object1, StringBinding1, IMPORT_FAIL_NEXT))
        return(1);

    if (ClientImport(EntryName1, &SInterface1, &Object2, StringBinding1, IMPORT_OK))
        return(1);


    // Remove the first interface.  Then make sure it is gone.

    if (Status = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, 0)) {

        printf("RpcNsBindingUnexport -> %x\n", Status);
        return (1);
        }

    if (ClientImport(EntryName1, &SInterface1, 0, StringBinding1, IMPORT_FAIL_BEGIN ))
        return(1);

    // 	Create more then one interface.  Call Lookup so
    //	    that a lookup handle must be allocated.


    if (CreateMulipleBindings())
        return(1);

    if (MatchMultiple(&SInterface1, BindingVectorIn))
        return(1);

    if (Status = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, 0)) {

        printf("RpcNsBindingUnexport -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface2, 0)) {

        printf("RpcNsBindingUnexport -> %x\n", Status);
        return (1);
        }

    return(0);
}


int test1 (			// Test the managment APIs
int cArgs,
SZ *paSZargs

  //
) //-----------------------------------------------------------------------//
{
    USED(paSZargs); USED(cArgs);

    unsigned long ExpirationAge, ExpirationAgeSecond;
    RPC_IF_ID_VECTOR *IfVector;
    RPC_NS_HANDLE ObjectContext;
    UUID ObjUuid;


    BindingVectorIn->Count = 1;
    ObjectVector->Count = 1;

    // Get and set the global expiration age.

    if (Status = RpcNsMgmtInqExpAge(&ExpirationAge)) {

        printf("RpcNsMgmtInqExpAge -> %x\n", Status);
        return (1);
        }

    ExpirationAge += 10;

    if (Status = RpcNsMgmtSetExpAge(ExpirationAge)) {

        printf("RpcNsMgmtSetExpAge -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsMgmtInqExpAge(&ExpirationAgeSecond)) {

        printf("RpcNsMgmtInqExpAge -> %x\n", Status);
        return (1);
        }

    if (ExpirationAge != ExpirationAgeSecond) {

        printf("Set ExpAge: %ld == %ld\n", ExpirationAge, ExpirationAgeSecond);
        return(1);
    }

    //----

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, ObjectVector)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    // Get the interfaces assoicated with an entry.

    if (Status = RpcNsMgmtEntryInqIfIds(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        &IfVector)) {

        printf("RpcNsMgmtEntryInqIfIds -> %x\n", Status);
        return (1);
        }

    if (IfVector->Count != 1) {

        printf("Bad Vector count %d != 1", IfVector->Count);
        return (1);
        }

    if (memcmp(&SInterface1.InterfaceId, IfVector->IfId[0],
        sizeof(RPC_IF_ID)) != 0) {

        printf("Inteface mismatch from RpcNsMgmtEntryInqIfIds\n");
        return (1);
        }

    if (Status = RpcIfIdVectorFree(&IfVector)) {

        printf("RpcIfIdVectorFree -> %x\n", Status);
        return (1);
        }

    // Remove the interface with managment routine.

    SInterface1.InterfaceId.SyntaxVersion.MajorVersion++;

    if (Status = RpcNsMgmtBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_ID*) &SInterface1.InterfaceId, RPC_C_VERS_ALL, 0)) {

        printf("RpcNsMgmtBindingUnexport -> %x\n", Status);
        return (1);
        }

    SInterface2.InterfaceId.SyntaxVersion.MajorVersion--;

    if (ClientImport(EntryName1, &SInterface1, 0, StringBinding1, IMPORT_FAIL_BEGIN))
        return(1);

    // ----

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, ObjectVector)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    // Now, get the object when the EntryObject API.

    if (Status = RpcNsEntryObjectInqBegin(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        &ObjectContext)) {

        printf("RpcNsEntryObjectInqBegin -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsEntryObjectInqNext(ObjectContext, &ObjUuid)) {

        printf("RpcNsEntryObjectInqNext -> %x\n", Status);
        return (1);
        }

    if (memcmp(&Object1, &ObjUuid, sizeof(UUID)) != 0) {

        printf("Object mismatch from RpcNsEntryObjectInqNext\n");
        return (1);
        }

    if ((Status = RpcNsEntryObjectInqNext(ObjectContext, &ObjUuid)) !=
        RPC_S_NO_MORE_MEMBERS) {

        printf("RpcNsEntryObjectInqNext didn't return RPC_S_NO_MORE_MEMBERS -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsEntryObjectInqDone(&ObjectContext)) {

        printf("RpcNsEntryObjectInqDone -> %x\n", Status);
        return (1);
        }

    // Remove the entry with managment a routine.

    if (Status = RpcNsMgmtEntryDelete(RPC_C_NS_SYNTAX_DEFAULT, EntryName1)) {

        printf("RpcNsMgmtEntryDelete -> %x\n", Status);
        return (1);
        }

    if (ClientImport(EntryName1, &SInterface1, 0, StringBinding1, IMPORT_FAIL_BEGIN))
        return(1);

    return(0);
}


int test2 (			// Test for group APIs
int cArgs,
SZ *paSZargs

  //
) //-----------------------------------------------------------------------//
{
    USED(paSZargs); USED(cArgs);
    RPC_NS_HANDLE InquiryContext;
    unsigned char *Member1;

    BindingVectorIn->Count = 1;
    ObjectVector->Count = 1;

    // ----

    if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, ObjectVector)) {

        printf("RpcNsBindingExport -> %x\n", Status);
        return (1);
        }

    // Add a group reference to entry1 and see if you can find it.

    if (Status = RpcNsGroupMbrAdd(RPC_C_NS_SYNTAX_DEFAULT, GroupName1,
        RPC_C_NS_SYNTAX_DEFAULT, EntryName1)) {

        printf("RpcNsGroupMbrAdd -> %x\n", Status);
        return (1);
        }

    if (ClientImport(GroupName1, &SInterface1, &Object1, StringBinding1, IMPORT_OK))
        return(1);


    // Now enumerate the members in the group.

    if (Status = RpcNsGroupMbrInqBegin(RPC_C_NS_SYNTAX_DEFAULT, GroupName1,
        RPC_C_NS_SYNTAX_DEFAULT, &InquiryContext)) {

        printf("RpcNsGroupMbrInqBegin -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsGroupMbrInqNext(InquiryContext, &Member1)) {

        printf("RpcNsGroupMbrInqNext -> %x\n", Status);
        return (1);
        }

    if (strcmp((CONST_CHAR *)Member1, (CONST_CHAR *)EntryName1) != 0) {

        printf("GroupInqNext: %s != %s\n", Member1, EntryName1);
        return(1);
    }

    if (Status = RpcStringFree(&Member1)) {

        printf("RpcFreeString -> %x\n", Status);
        return (1);
        }

    if ((Status = RpcNsGroupMbrInqNext(InquiryContext, &Member1))
        != RPC_S_NO_MORE_MEMBERS) {

        printf("RpcNsGroupMbrInqNext didn't return NSI_S_NO_MORE_MEMBERS -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsGroupMbrInqDone(&InquiryContext)) {

        printf("RpcNsGroupMbrInqDone -> %x\n", Status);
        return (1);
        }

    // Add a second element and then remove the first element.

    if (Status = RpcNsGroupMbrAdd(RPC_C_NS_SYNTAX_DEFAULT, GroupName1,
        RPC_C_NS_SYNTAX_DEFAULT, EntryName2)) {

        printf("RpcNsGroupMbrAdd -> %x\n", Status);
        return (1);
        }

    if ((Status = RpcNsGroupMbrRemove(RPC_C_NS_SYNTAX_DEFAULT, GroupName1,
        RPC_C_NS_SYNTAX_DEFAULT, EntryName1))) {

        printf("RpcNsGroupMbrRemove -> %x\n", Status);
        return (1);
        }


    // First group member gone, this should fail.

    if (ClientImport(GroupName1, &SInterface1, &Object1, StringBinding1, IMPORT_FAIL_NEXT))
        return(1);


    // Finally remove the whole group.

    if ((Status = RpcNsGroupDelete(RPC_C_NS_SYNTAX_DEFAULT, GroupName1))) {

        printf("RpcNsGroupDelete -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsGroupMbrInqBegin(RPC_C_NS_SYNTAX_DEFAULT, GroupName1,
        RPC_C_NS_SYNTAX_DEFAULT, &InquiryContext) != RPC_S_ENTRY_NOT_FOUND) {

        printf("RpcNsGroupMbrInqBegin didn't return RPC_S_ENTRY_NOT_FOUND -> %x\n", Status);
        return (1);
        }


    if (Status = RpcNsMgmtEntryDelete(RPC_C_NS_SYNTAX_DEFAULT, EntryName1)) {

        printf("RpcNsMgmtEntryDelete -> %x\n", Status);
        return (1);
        }

    return(0);
}


int test3 (			// Test for unimplemented APIs
int cArgs,
SZ *paSZargs

  //
) //-----------------------------------------------------------------------//
{
    USED(paSZargs); USED(cArgs);
    unsigned char *ExpandedName;
    RPC_NS_HANDLE InquiryContext;

    if ((Status = RpcNsEntryExpandName(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        &ExpandedName)) != RPC_S_CANNOT_SUPPORT) {

        printf("RpcNsEntryExpandName didn't return RPC_S_CANNOT_SUPPORT-> %x\n", Status);
        return (1);
        }

    if ((Status = RpcNsMgmtEntryCreate(RPC_C_NS_SYNTAX_DEFAULT, EntryName1))
        != RPC_S_CANNOT_SUPPORT) {

        printf("RpcNsMgmEntryCreate didn't return RPC_S_CANNOT_SUPPORT-> %x\n", Status);
        return (1);
        }

    if ((Status = RpcNsProfileDelete(RPC_C_NS_SYNTAX_DEFAULT, EntryName1))
        != RPC_S_CANNOT_SUPPORT) {

        printf("RpcNsProfileDelete didn't return RPC_S_CANNOT_SUPPORT-> %x\n", Status);
        return (1);
        }


    if ((Status = RpcNsProfileEltAdd(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        0, RPC_C_NS_SYNTAX_DEFAULT, EntryName2, 1, EntryName2))
        != RPC_S_CANNOT_SUPPORT) {

        printf("RpcNsProfileEltAdd didn't return RPC_S_CANNOT_SUPPORT-> %x\n", Status);
        return (1);
        }

    if ((Status = RpcNsProfileEltRemove(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        0, RPC_C_NS_SYNTAX_DEFAULT, EntryName2)) != RPC_S_CANNOT_SUPPORT) {

        printf("RpcNsProfileEltRemoveA didn't return RPC_S_CANNOT_SUPPORT-> %x\n", Status);
        return (1);
        }

    if ((Status = RpcNsProfileEltInqBegin(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        RPC_C_PROFILE_DEFAULT_ELT, 0, RPC_C_VERS_ALL, RPC_C_NS_SYNTAX_DEFAULT,
        EntryName2, &InquiryContext))
        != RPC_S_CANNOT_SUPPORT) {

        printf("RpcNsProfileEltInqBeginA didn't return RPC_S_CANNOT_SUPPORT-> %x\n", Status);
        return (1);
        }

    // No tests for ProfileEltInq Next & Done because lack of context handle

    return(0);
}


int test4 (			// enter a single stack and wait
int cArgs,
SZ *paSZargs

  // This is used in a multi machine test.  This part exports a multiple
  // stacks and waits for a message or key stroke to finish.
) //-----------------------------------------------------------------------//
{
    USED(paSZargs); USED(cArgs);

    if (CreateMulipleBindings())
        return(1);

    printf("Press enter to finish...");
    RpcGetch();

    if (Status = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface1, 0)) {

        printf("RpcNsBindingUnexport -> %x\n", Status);
        return (1);
        }

    if (Status = RpcNsBindingUnexport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
        (RPC_IF_HANDLE) &SInterface2, 0)) {

        printf("RpcNsBindingUnexport -> %x\n", Status);
        return (1);
        }

    return(0);
}



int test5 (			// enter a single stack and wait
int cArgs,
SZ *paSZargs

  // This is used in a multi machine test.  This part exports a single
  // stack and waits for a message or key stroke to finish.
) //-----------------------------------------------------------------------//
{

    RPC_NS_HANDLE LookupContext;

    if (!cArgs) {
	printf("usage: 5 client | server");
	return(-1);
    }

    if (strcmp(*paSZargs, "server") == 0) {

        BindingVectorIn->Count = 1;
        ObjectVector->Count = 1;

        if (Status = RpcNsBindingExport(RPC_C_NS_SYNTAX_DEFAULT, EntryName1,
            (RPC_IF_HANDLE) &SInterface1, BindingVectorIn, ObjectVector)) {

            printf("RpcNsBindingExport -> %x\n", Status);
            return (1);
            }

        // Add a group reference to entry1 and see if you can find it.

        if (Status = RpcNsGroupMbrAdd(RPC_C_NS_SYNTAX_DEFAULT, GroupName1,
            RPC_C_NS_SYNTAX_DEFAULT, EntryName1)) {

            printf("RpcNsGroupMbrAdd -> %x\n", Status);
            return (1);
            }

        printf("Press enter to finish...");
	RpcGetch();

        // Now remove the group and entry.

        if (Status = RpcNsMgmtEntryDelete(RPC_C_NS_SYNTAX_DEFAULT, EntryName1)) {

            printf("RpcNsMgmtEntryDelete -> %x\n", Status);
            return (1);
        }
        if (Status = RpcNsMgmtEntryDelete(RPC_C_NS_SYNTAX_DEFAULT, GroupName1)) {

            printf("RpcNsMgmtEntryDelete -> %x\n", Status);
            return (1);
        }

        return(0);
    }

    if (strcmp(*paSZargs, "client") != 0) {
        printf("usage: 5 client | server");
        return(-1);
    }

    // Case 1: verify that the stack is found

    if (ClientImport(GroupName1, &SInterface1, &Object1, StringBinding1, IMPORT_OK))
        return(1);

    // Case 2: send a message to other machine to terminate, thus withdrawing
    //	       the stack.  Then lookup again to verify its still in cache.

    printf("Press enter on the server...");
    RpcGetch();

    if (ClientImport(EntryName1, &SInterface1, &Object1, StringBinding1, IMPORT_OK))
        return(1);

    // Case 3: lookup again requesting that the cache be refreshed.  Since
    //	       the exported stack is gone, should return failure.

    Status = RpcNsBindingLookupBegin(0, 0,
        (RPC_IF_HANDLE) &SInterface1, 0, BindingVectorMax, &LookupContext);

    if (Status = RpcNsMgmtHandleSetExpAge (LookupContext, 0)) {

        printf("RpcNsMgmtHandleSetExpAge -> %x\n", Status);
        return (1);
        }

    Status = RpcNsBindingLookupNext(LookupContext, &BindingVectorOut);

    if (Status != RPC_S_NO_MORE_BINDINGS) {
        printf("RpcNsBindingLookupBegin didn't return RPC_S_NO_MORE_BINDINGS -> %x\n",
             Status);
        return (2);
        }

    return(0);
}


int main (			// entry point for the test program
int cArgs,
SZ *paSZargs

) //-----------------------------------------------------------------------//
{
    int testNum = 0;
    int result = 0;
    unsigned short status;

#if 0
    hMail = new READ_MAIL_SLOT(MAILNAME(t), sizeof(mail), &status);
#endif

    CreateBindingHandles();

#ifndef NTENV

    static BYTE wiBuff[sizeof(wksta_info_0) + 200];
    struct wksta_info_0 *pWI = (struct wksta_info_0 *) wiBuff;
    unsigned short cbT, cbWI = sizeof(wiBuff);

    if (!NetWkstaGetInfo(0, 0, (PB) pWI, cbWI, &cbT))
	pSelfName = pWI->wki0_computername;

#endif // NTENV

    printf("Microsoft RPC Locator test program.\n");

    cArgs--; paSZargs++;

    if (cArgs && strcmp("-debug", *paSZargs) == 0) {

	debug = 10;
	cArgs--; paSZargs++;
    }

    if (cArgs && strcmp("-?", *paSZargs) == 0) {

	printf("Usage: test [-debug] digit [arguments]\n");
	printf("       test 0 -- stand alone binding object tests\n");
	printf("       test 1 Test the management APIs\n");
	printf("       test 2 Test for group APIs\n");
	printf("       test 3 Test for unimplemented APIs\n");
	printf("       test 4 Used to with client only test\n");
	printf("       test 5 client | server\n");
	exit(-1);
    }


#ifndef MIPS
    RpcTryExcept
#endif
    {
        if (cArgs) {
            testNum = atoi(*paSZargs);
            cArgs--; paSZargs++;
	    result = (pFn[testNum])(cArgs, paSZargs);
        }
        else {
            result |= test0(cArgs, paSZargs);
            result |= test1(cArgs, paSZargs);
            result |= test2(cArgs, paSZargs);
            result |= test3(cArgs, paSZargs);
        }

    }
#ifndef MIPS
    RpcExcept(1)
    {
	printf("FAILED: exception: %x\n", RpcExceptionCode());
	exit(1);
    }
    RpcEndExcept
#endif

    if (result) {
	printf("Fail status: %x\n", result);
	printf("Locator BVT: FAILED\n");
    }
    else
	printf("Locator BVT: PASSED\n");

    return(result);
}