r5775: Remove some unused functions (unions are no longer as special as they used...
[samba.git] / source4 / torture / rpc / oxidresolve.c
index a4ad897baa07c99b510666e5fd401a4442e305de..2caf3512d5525f46f6d42f8cb9b6eb6ff5027f74 100644 (file)
 */
 
 #include "includes.h"
+#include "librpc/gen_ndr/ndr_oxidresolver.h"
+#include "librpc/gen_ndr/ndr_remact.h"
+#include "librpc/gen_ndr/ndr_epmapper.h"
+#include "librpc/gen_ndr/com_dcom.h"
 
-static int test_SimplePing(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, HYPER_T setid)
+static int test_RemoteActivation(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint64_t *oxid, struct GUID *oid)
+{
+       struct RemoteActivation r;
+       NTSTATUS status;
+       struct GUID iids[2];
+       uint16_t protseq[3] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_NCALRPC, EPM_PROTOCOL_UUID };
+
+       ZERO_STRUCT(r.in);
+       r.in.this.version.MajorVersion = 5;
+       r.in.this.version.MinorVersion = 1;
+       r.in.this.cid = GUID_random();
+       GUID_from_string(CLSID_SIMPLE, &r.in.Clsid);
+       r.in.ClientImpLevel = RPC_C_IMP_LEVEL_IDENTIFY;
+       r.in.num_protseqs = 3;
+       r.in.protseq = protseq;
+       r.in.Interfaces = 1;
+       GUID_from_string(DCERPC_IUNKNOWN_UUID, &iids[0]);
+       r.in.pIIDs = iids;
+
+       status = dcerpc_RemoteActivation(p, mem_ctx, &r);
+       if(NT_STATUS_IS_ERR(status)) {
+               fprintf(stderr, "RemoteActivation: %s\n", nt_errstr(status));
+               return 0;
+       }
+
+       if(!W_ERROR_IS_OK(r.out.result)) {
+               fprintf(stderr, "RemoteActivation: %s\n", win_errstr(r.out.result));
+               return 0;
+       }
+
+       if(!W_ERROR_IS_OK(r.out.hr)) {
+               fprintf(stderr, "RemoteActivation: %s\n", win_errstr(r.out.hr));
+               return 0;
+       }
+
+       if(!W_ERROR_IS_OK(r.out.results[0])) {
+               fprintf(stderr, "RemoteActivation: %s\n", win_errstr(r.out.results[0]));
+               return 0;
+       }
+
+       *oid = r.out.ipidRemUnknown;
+       *oxid = r.out.pOxid;
+
+       return 1;
+}
+
+static int test_SimplePing(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint64_t setid)
 {
        struct SimplePing r;
        NTSTATUS status;
@@ -42,7 +92,7 @@ static int test_SimplePing(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, HYPER_T s
        return 1;
 }
 
-static int test_ComplexPing(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, HYPER_T *setid)
+static int test_ComplexPing(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint64_t *setid, struct GUID oid)
 {
        struct ComplexPing r;
        NTSTATUS status;
@@ -52,7 +102,8 @@ static int test_ComplexPing(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, HYPER_T
 
        r.in.SequenceNum = 0;
        r.in.SetId = setid;
-       r.out.SetId = setid;
+       r.in.cAddToSet = 1;
+       r.in.AddToSet = &oid;
 
        status = dcerpc_ComplexPing(p, mem_ctx, &r);
        if(NT_STATUS_IS_ERR(status)) {
@@ -89,6 +140,57 @@ static int test_ServerAlive(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
        return 1;
 }
 
+static int test_ResolveOxid(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint64_t oxid)
+{
+       struct ResolveOxid r;
+       NTSTATUS status;
+       uint16_t protseq[2] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_SMB };   
+
+       r.in.pOxid = oxid;
+       r.in.cRequestedProtseqs = 2;
+       r.in.arRequestedProtseqs = protseq;
+
+       status = dcerpc_ResolveOxid(p, mem_ctx, &r);
+       if(NT_STATUS_IS_ERR(status)) {
+               fprintf(stderr, "ResolveOxid: %s\n", nt_errstr(status));
+               return 0;
+       }
+
+       if(!W_ERROR_IS_OK(r.out.result)) {
+               fprintf(stderr, "ResolveOxid: %s\n", win_errstr(r.out.result));
+               return 0;
+       }
+
+       return 1;
+}
+
+static int test_ResolveOxid2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint64_t oxid)
+{
+       struct ResolveOxid2 r;
+       NTSTATUS status;
+       uint16_t protseq[2] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_SMB };   
+
+       r.in.pOxid = oxid;
+       r.in.cRequestedProtseqs = 2;
+       r.in.arRequestedProtseqs = protseq;
+
+       status = dcerpc_ResolveOxid2(p, mem_ctx, &r);
+       if(NT_STATUS_IS_ERR(status)) {
+               fprintf(stderr, "ResolveOxid2: %s\n", nt_errstr(status));
+               return 0;
+       }
+
+       if(!W_ERROR_IS_OK(r.out.result)) {
+               fprintf(stderr, "ResolveOxid2: %s\n", win_errstr(r.out.result));
+               return 0;
+       }
+       
+       printf("Remote server versions: %d, %d\n", r.out.ComVersion.MajorVersion, r.out.ComVersion.MinorVersion);
+
+       return 1;
+}
+
+
 
 static int test_ServerAlive2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 {
@@ -112,13 +214,24 @@ static int test_ServerAlive2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 BOOL torture_rpc_oxidresolve(void)
 {
         NTSTATUS status;
-       struct dcerpc_pipe *p;
+       struct dcerpc_pipe *p, *premact;
        TALLOC_CTX *mem_ctx;
        BOOL ret = True;
-       HYPER_T setid;
+       uint64_t setid;
+       uint64_t oxid;
+       struct GUID oid;
 
        mem_ctx = talloc_init("torture_rpc_oxidresolve");
 
+       status = torture_rpc_connection(&premact, 
+                                       DCERPC_IREMOTEACTIVATION_NAME, 
+                                       DCERPC_IREMOTEACTIVATION_UUID, 
+                                       DCERPC_IREMOTEACTIVATION_VERSION);                                                              
+                       
+       if (!NT_STATUS_IS_OK(status)) {
+               return False;
+       }
+
        status = torture_rpc_connection(&p, 
                                        DCERPC_IOXIDRESOLVER_NAME, 
                                        DCERPC_IOXIDRESOLVER_UUID, 
@@ -131,18 +244,27 @@ BOOL torture_rpc_oxidresolve(void)
        if(!test_ServerAlive(p, mem_ctx))
                ret = False;
 
-       if(!test_ComplexPing(p, mem_ctx, &setid))
+       if(!test_ServerAlive2(p, mem_ctx))
+               ret = False;
+
+       if(!test_RemoteActivation(premact, mem_ctx, &oxid, &oid))
+               return False;
+
+       if(!test_ComplexPing(p, mem_ctx, &setid, oid))
                ret = False;
 
        if(!test_SimplePing(p, mem_ctx, setid))
                ret = False;
 
-       if(!test_ServerAlive2(p, mem_ctx))
+       if(!test_ResolveOxid(p, mem_ctx, oxid))
+               ret = False;
+
+       if(!test_ResolveOxid2(p, mem_ctx, oxid))
                ret = False;
 
-       talloc_destroy(mem_ctx);
+       talloc_free(mem_ctx);
 
-        torture_rpc_close(p);
+    torture_rpc_close(p);
 
        return ret;
 }