svn commit: samba r20081 - in branches/SAMBA_4_0/source/libnet: .

metze at samba.org metze at samba.org
Fri Dec 8 18:06:38 GMT 2006


Author: metze
Date: 2006-12-08 18:06:38 +0000 (Fri, 08 Dec 2006)
New Revision: 20081

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

Log:
pull the whole schema partition

metze
Modified:
   branches/SAMBA_4_0/source/libnet/libnet_become_dc.c


Changeset:
Modified: branches/SAMBA_4_0/source/libnet/libnet_become_dc.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet_become_dc.c	2006-12-08 18:01:30 UTC (rev 20080)
+++ branches/SAMBA_4_0/source/libnet/libnet_become_dc.c	2006-12-08 18:06:38 UTC (rev 20081)
@@ -122,6 +122,9 @@
 		struct drsuapi_DsReplicaHighWaterMark highwatermark;
 		struct drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
 		uint32_t replica_flags;
+
+		struct drsuapi_DsReplicaObjectListItemEx *first_object;
+		struct drsuapi_DsReplicaObjectListItemEx *last_object;
 	} schema;
 
 	struct becomeDC_fsmo {
@@ -1583,6 +1586,11 @@
 		r->in.req.req5.h1			= 0;
 	}
 
+DEBUG(0,("start NC[%s] tmp_highest_usn[%llu] highest_usn[%llu]\n",
+	partition->nc.dn,
+	partition->highwatermark.tmp_highest_usn,
+	partition->highwatermark.highest_usn));
+
 	/* 
 	 * we should try to use the drsuapi_p->pipe here, as w2k3 does
 	 * but it seems that some extra flags in the DCERPC Bind call
@@ -1614,6 +1622,77 @@
 					     becomeDC_drsuapi3_pull_schema_recv);
 }
 
+static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state *s,
+						   struct becomeDC_partition *partition,
+						   struct drsuapi_DsGetNCChanges *r)
+{
+	struct drsuapi_DsGetNCChangesCtr1 *ctr1 = NULL;
+	struct drsuapi_DsGetNCChangesCtr6 *ctr6 = NULL;
+	uint32_t out_level = 0;
+	struct GUID *source_dsa_guid;
+	struct GUID *source_dsa_invocation_id;
+	struct drsuapi_DsReplicaHighWaterMark *new_highwatermark;
+	struct drsuapi_DsReplicaObjectListItemEx *first_object;
+	struct drsuapi_DsReplicaObjectListItemEx *cur;
+
+	if (!W_ERROR_IS_OK(r->out.result)) {
+		return r->out.result;
+	}
+
+	if (r->out.level == 1) {
+		out_level = 1;
+		ctr1 = &r->out.ctr.ctr1;
+	} else if (r->out.level == 2) {
+		out_level = 1;
+		ctr1 = r->out.ctr.ctr2.ctr.mszip1.ctr1;
+	} else if (r->out.level == 6) {
+		out_level = 6;
+		ctr6 = &r->out.ctr.ctr6;
+	} else if (r->out.level == 7 &&
+		   r->out.ctr.ctr7.level == 6 &&
+		   r->out.ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_MSZIP) {
+		out_level = 6;
+		ctr6 = r->out.ctr.ctr7.ctr.mszip6.ctr6;
+	} else {
+		return WERR_BAD_NET_RESP;
+	}
+
+	switch (out_level) {
+	case 1:
+		source_dsa_guid			= &ctr1->source_dsa_guid;
+		source_dsa_invocation_id	= &ctr1->source_dsa_invocation_id;
+		new_highwatermark		= &ctr1->new_highwatermark;
+		first_object			= ctr1->first_object;
+		break;
+	case 6:
+		source_dsa_guid			= &ctr6->source_dsa_guid;
+		source_dsa_invocation_id	= &ctr6->source_dsa_invocation_id;
+		new_highwatermark		= &ctr6->new_highwatermark;
+		first_object			= ctr6->first_object;
+		break;
+	}
+
+	partition->highwatermark		= *new_highwatermark;
+	partition->source_dsa_guid		= *source_dsa_guid;
+	partition->source_dsa_invocation_id	= *source_dsa_invocation_id;
+
+	if (!partition->first_object) {
+		partition->first_object = talloc_steal(s, first_object);
+	} else {
+		partition->last_object->next_object = talloc_steal(partition->last_object,
+								   first_object);
+	}
+	for (cur = first_object; cur->next_object; cur = cur->next_object) {}
+	partition->last_object = cur;
+
+DEBUG(0,("end NC[%s] tmp_highest_usn[%llu] highest_usn[%llu]\n",
+	partition->nc.dn,
+	partition->highwatermark.tmp_highest_usn,
+	partition->highwatermark.highest_usn));
+
+	return WERR_OK;
+}
+
 static void becomeDC_drsuapi3_pull_schema_recv(struct rpc_request *req)
 {
 	struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private,
@@ -1621,17 +1700,25 @@
 	struct composite_context *c = s->creq;
 	struct drsuapi_DsGetNCChanges *r = talloc_get_type(req->ndr.struct_ptr,
 					   struct drsuapi_DsGetNCChanges);
+	WERROR status;
 
 	c->status = dcerpc_ndr_request_recv(req);
 	if (!composite_is_ok(c)) return;
 
-	if (!W_ERROR_IS_OK(r->out.result)) {
-		composite_error(c, werror_to_ntstatus(r->out.result));
+	status = becomeDC_drsuapi_pull_partition_recv(s, &s->schema, r);
+	if (!W_ERROR_IS_OK(status)) {
+		composite_error(c, werror_to_ntstatus(status));
 		return;
 	}
 
 	talloc_free(r);
 
+	if (s->schema.highwatermark.tmp_highest_usn > s->schema.highwatermark.highest_usn) {
+		becomeDC_drsuapi_pull_partition_send(s, &s->drsuapi2, &s->drsuapi3, &s->schema,
+						     becomeDC_drsuapi3_pull_schema_recv);
+		return;
+	}
+
 	becomeDC_connect_ldap2(s);
 }
 



More information about the samba-cvs mailing list