svn commit: samba r20514 - in branches/SAMBA_4_0/source: librpc/idl rpc_server/drsuapi torture/rpc

metze at samba.org metze at samba.org
Wed Jan 3 19:09:34 GMT 2007


Author: metze
Date: 2007-01-03 19:09:34 +0000 (Wed, 03 Jan 2007)
New Revision: 20514

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20514

Log:
implement idl for DsGetNT4ChangeLog() which transferres the meta data
for NT4 DC's in mixed mode domains.

This call is triggered by tranferring the PDC FSMO Role to another DC

the real meta data is encoded in the user buffer which is just a DATA_BLOB in idl

metze
Modified:
   branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl
   branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c
   branches/SAMBA_4_0/source/torture/rpc/dssync.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl	2007-01-03 19:01:35 UTC (rev 20513)
+++ branches/SAMBA_4_0/source/librpc/idl/drsuapi.idl	2007-01-03 19:09:34 UTC (rev 20514)
@@ -742,8 +742,42 @@
 
 	/*****************/
         /* Function 0x0b */
-	WERROR DRSUAPI_GET_NT4_CHANGELOG();
+	typedef struct {
+		uint32 unknown1;
+		uint32 unknown2;
+		[range(0,0x00A00000)] uint32 length;
+		[size_is(length)] uint8 *data;
+	} drsuapi_DsGetNT4ChangeLogRequest1;
 
+	typedef [switch_type(uint32)] union {
+		[case(1)] drsuapi_DsGetNT4ChangeLogRequest1 req1;
+	} drsuapi_DsGetNT4ChangeLogRequest;
+
+	typedef struct {
+		[range(0,0x00A00000)] uint32 length1;
+		[range(0,0x00A00000)] uint32 length2;
+		hyper unknown1;
+		NTTIME time2;
+		hyper unknown3;
+		NTTIME time4;
+		hyper unknown5;
+		NTTIME time6;
+		NTSTATUS status;
+		[size_is(length1)] uint8 *data1;
+		[size_is(length2)] uint8 *data2;
+	} drsuapi_DsGetNT4ChangeLogInfo1;
+
+	typedef [switch_type(uint32)] union {
+		[case(1)] drsuapi_DsGetNT4ChangeLogInfo1 info1;
+	} drsuapi_DsGetNT4ChangeLogInfo;
+
+	WERROR drsuapi_DsGetNT4ChangeLog(
+		[in] policy_handle *bind_handle,
+		[in,out] uint32 level,
+		[in] [switch_is(level)] drsuapi_DsGetNT4ChangeLogRequest req,
+		[out] [switch_is(level)] drsuapi_DsGetNT4ChangeLogInfo info
+		);
+
 	/*****************/
 	/* Function 0x0c */
 	typedef [v1_enum] enum {

Modified: branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c	2007-01-03 19:01:35 UTC (rev 20513)
+++ branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c	2007-01-03 19:09:34 UTC (rev 20514)
@@ -192,10 +192,10 @@
 
 
 /* 
-  DRSUAPI_GET_NT4_CHANGELOG 
+  drsuapi_DsGetNT4ChangeLog 
 */
-static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-		       struct DRSUAPI_GET_NT4_CHANGELOG *r)
+static WERROR drsuapi_DsGetNT4ChangeLog(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+		       struct drsuapi_DsGetNT4ChangeLog *r)
 {
 	DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }

Modified: branches/SAMBA_4_0/source/torture/rpc/dssync.c
===================================================================
--- branches/SAMBA_4_0/source/torture/rpc/dssync.c	2007-01-03 19:01:35 UTC (rev 20513)
+++ branches/SAMBA_4_0/source/torture/rpc/dssync.c	2007-01-03 19:09:34 UTC (rev 20514)
@@ -563,6 +563,64 @@
 	return ret;
 }
 
+static BOOL test_FetchNT4Data(struct DsSyncTest *ctx)
+{
+	NTSTATUS status;
+	BOOL ret = True;
+	int i, y = 0;
+	uint64_t highest_usn = 0;
+	const char *partition = NULL;
+	struct drsuapi_DsGetNT4ChangeLog r;
+	int32_t out_level = 0;
+	struct GUID null_guid;
+	struct dom_sid null_sid;
+	DATA_BLOB cookie;
+
+	ZERO_STRUCT(null_guid);
+	ZERO_STRUCT(null_sid);
+	ZERO_STRUCT(cookie);
+
+	ZERO_STRUCT(r);
+	r.in.bind_handle	= &ctx->new_dc.drsuapi.bind_handle;
+	r.in.level		= 1;
+
+	r.in.req.req1.unknown1	= lp_parm_int(-1, "dssync", "nt4-1", 3);
+	r.in.req.req1.unknown2	= lp_parm_int(-1, "dssync", "nt4-2", 0x00004000);
+
+	while (1) {
+		r.in.req.req1.length	= cookie.length;
+		r.in.req.req1.data	= cookie.data;
+
+		status = dcerpc_drsuapi_DsGetNT4ChangeLog(ctx->new_dc.drsuapi.pipe, ctx, &r);
+		if (!NT_STATUS_IS_OK(status)) {
+			const char *errstr = nt_errstr(status);
+			if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
+				errstr = dcerpc_errstr(ctx, ctx->new_dc.drsuapi.pipe->last_fault_code);
+			}
+			printf("dcerpc_drsuapi_DsGetNT4ChangeLog failed - %s\n", errstr);
+			ret = False;
+		} else if (!W_ERROR_IS_OK(r.out.result)) {
+			printf("DsGetNT4ChangeLog failed - %s\n", win_errstr(r.out.result));
+			ret = False;
+		} else if (r.out.level != 1) {
+			printf("DsGetNT4ChangeLog unknown level - %u\n", r.out.level);
+			ret = False;
+		} else if (NT_STATUS_IS_OK(r.out.info.info1.status)) {
+		} else if (NT_STATUS_EQUAL(r.out.info.info1.status, STATUS_MORE_ENTRIES)) {
+			cookie.length	= r.out.info.info1.length1;
+			cookie.data	= r.out.info.info1.data1;
+			continue;
+		} else {
+			printf("DsGetNT4ChangeLog failed - %s\n", nt_errstr(r.out.info.info1.status));
+			ret = False;
+		}
+
+		break;
+	}
+
+	return ret;
+}
+
 BOOL torture_rpc_dssync(struct torture_context *torture)
 {
 	BOOL ret = True;
@@ -577,6 +635,7 @@
 	ret &= test_GetInfo(ctx);
 	ret &= _test_DsBind(ctx, ctx->admin.credentials, &ctx->new_dc.drsuapi);
 	ret &= test_FetchData(ctx);
+	ret &= test_FetchNT4Data(ctx);
 
 	return ret;
 }



More information about the samba-cvs mailing list