Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

850 lines
22 KiB

/* --------------------------------------------------------------------
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);
}