mirror of https://github.com/lianthony/NT4.0
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
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);
|
|
}
|
|
|