[SCM] Samba Shared Repository - branch master updated - dd49f7483bbe93dd5262cb3ebee517a20d3c3067

Günther Deschner gd at samba.org
Sat Oct 18 21:25:02 GMT 2008


The branch, master has been updated
       via  dd49f7483bbe93dd5262cb3ebee517a20d3c3067 (commit)
       via  6ddaf5f160ff96cb6d17bcd78588cab594b8f151 (commit)
       via  ca84c406d3a2335beb27006c54b68820f7a5594a (commit)
       via  32a1d55797f96e043310004bb091ef5887aa501d (commit)
       via  b684efacf57da2b061179d6662ed5d7c637a6b7b (commit)
       via  bc1d39483cfd82123d92834be1e8cb911921c87a (commit)
      from  9c56c43a376c9a89e4cc26453eca816b8a70f00f (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit dd49f7483bbe93dd5262cb3ebee517a20d3c3067
Author: Günther Deschner <gd at samba.org>
Date:   Fri Oct 17 20:32:36 2008 +0200

    s4-drsuapi: merge drsuapi_DsGetNCChanges from s3 drsuapi idl.
    
    Guenther

commit 6ddaf5f160ff96cb6d17bcd78588cab594b8f151
Author: Günther Deschner <gd at samba.org>
Date:   Fri Oct 17 20:08:59 2008 +0200

    s4-drsuapi: merge drsuapi_DsCrackNames from s3 drsuapi idl.
    
    Guenther

commit ca84c406d3a2335beb27006c54b68820f7a5594a
Author: Günther Deschner <gd at samba.org>
Date:   Fri Oct 17 19:10:22 2008 +0200

    s4-drsuapi: merge drsuapi_DsGetDomainControllerInfo from s3 drsuapi idl.
    
    Guenther

commit 32a1d55797f96e043310004bb091ef5887aa501d
Author: Günther Deschner <gd at samba.org>
Date:   Fri Oct 17 18:59:31 2008 +0200

    s4-drsuapi: merge drsuapi_DsWriteAccountSpn from s3 drsuapi idl.
    
    Guenther

commit b684efacf57da2b061179d6662ed5d7c637a6b7b
Author: Günther Deschner <gd at samba.org>
Date:   Fri Oct 17 18:55:01 2008 +0200

    s4-drsuapi: merge drsuapi_DsRemoveDSServer from s3 drsuapi idl.
    
    Guenther

commit bc1d39483cfd82123d92834be1e8cb911921c87a
Author: Günther Deschner <gd at samba.org>
Date:   Fri Oct 17 18:54:03 2008 +0200

    s4-drsuapi: merge drsuapi_DsAddEntry from s3 drsuapi idl.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/repl/drepl_out_helpers.c       |   96 ++++++++-------
 source4/libnet/libnet_become_dc.c           |  138 +++++++++++----------
 source4/libnet/libnet_join.c                |   60 ++++++----
 source4/libnet/libnet_unbecome_dc.c         |   12 ++-
 source4/librpc/idl/drsuapi.idl              |   41 ++++---
 source4/rpc_server/drsuapi/dcesrv_drsuapi.c |   43 ++++---
 source4/torture/rpc/drsuapi.c               |  136 ++++++++++++---------
 source4/torture/rpc/drsuapi_cracknames.c    |  177 +++++++++++++++------------
 source4/torture/rpc/dssync.c                |  156 +++++++++++++-----------
 9 files changed, 474 insertions(+), 385 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/repl/drepl_out_helpers.c b/source4/dsdb/repl/drepl_out_helpers.c
index 8006450..c292c6d 100644
--- a/source4/dsdb/repl/drepl_out_helpers.c
+++ b/source4/dsdb/repl/drepl_out_helpers.c
@@ -246,40 +246,42 @@ static void dreplsrv_op_pull_source_get_changes_send(struct dreplsrv_op_pull_sou
 	r = talloc(st, struct drsuapi_DsGetNCChanges);
 	if (composite_nomem(r, c)) return;
 
-	r->in.level = talloc(r, int32_t);
-	if (composite_nomem(r->in.level, c)) return;
-	r->out.level = talloc(r, int32_t);
-	if (composite_nomem(r->out.level, c)) return;
+	r->out.level_out = talloc(r, int32_t);
+	if (composite_nomem(r->out.level_out, c)) return;
+	r->in.req = talloc(r, union drsuapi_DsGetNCChangesRequest);
+	if (composite_nomem(r->in.req, c)) return;
+	r->out.ctr = talloc(r, union drsuapi_DsGetNCChangesCtr);
+	if (composite_nomem(r->out.ctr, c)) return;
 
 	r->in.bind_handle	= &drsuapi->bind_handle;
 	if (drsuapi->remote_info28.supported_extensions & DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8) {
-		*r->in.level				= 8;
-		r->in.req.req8.destination_dsa_guid	= service->ntds_guid;
-		r->in.req.req8.source_dsa_invocation_id	= rf1->source_dsa_invocation_id;
-		r->in.req.req8.naming_context		= &partition->nc;
-		r->in.req.req8.highwatermark		= rf1->highwatermark;
-		r->in.req.req8.uptodateness_vector	= NULL;/*&partition->uptodatevector_ex;*/
-		r->in.req.req8.replica_flags		= rf1->replica_flags;
-		r->in.req.req8.max_object_count		= 133;
-		r->in.req.req8.max_ndr_size		= 1336811;
-		r->in.req.req8.extended_op		= DRSUAPI_EXOP_NONE;
-		r->in.req.req8.fsmo_info		= 0;
-		r->in.req.req8.partial_attribute_set	= NULL;
-		r->in.req.req8.partial_attribute_set_ex	= NULL;
-		r->in.req.req8.mapping_ctr.num_mappings	= 0;
-		r->in.req.req8.mapping_ctr.mappings	= NULL;
+		r->in.level				= 8;
+		r->in.req->req8.destination_dsa_guid	= service->ntds_guid;
+		r->in.req->req8.source_dsa_invocation_id= rf1->source_dsa_invocation_id;
+		r->in.req->req8.naming_context		= &partition->nc;
+		r->in.req->req8.highwatermark		= rf1->highwatermark;
+		r->in.req->req8.uptodateness_vector	= NULL;/*&partition->uptodatevector_ex;*/
+		r->in.req->req8.replica_flags		= rf1->replica_flags;
+		r->in.req->req8.max_object_count	= 133;
+		r->in.req->req8.max_ndr_size		= 1336811;
+		r->in.req->req8.extended_op		= DRSUAPI_EXOP_NONE;
+		r->in.req->req8.fsmo_info		= 0;
+		r->in.req->req8.partial_attribute_set	= NULL;
+		r->in.req->req8.partial_attribute_set_ex= NULL;
+		r->in.req->req8.mapping_ctr.num_mappings= 0;
+		r->in.req->req8.mapping_ctr.mappings	= NULL;
 	} else {
-		*r->in.level				= 5;
-		r->in.req.req5.destination_dsa_guid	= service->ntds_guid;
-		r->in.req.req5.source_dsa_invocation_id	= rf1->source_dsa_invocation_id;
-		r->in.req.req5.naming_context		= &partition->nc;
-		r->in.req.req5.highwatermark		= rf1->highwatermark;
-		r->in.req.req5.uptodateness_vector	= NULL;/*&partition->uptodatevector_ex;*/
-		r->in.req.req5.replica_flags		= rf1->replica_flags;
-		r->in.req.req5.max_object_count		= 133;
-		r->in.req.req5.max_ndr_size		= 1336770;
-		r->in.req.req5.extended_op		= DRSUAPI_EXOP_NONE;
-		r->in.req.req5.fsmo_info		= 0;
+		r->in.level				= 5;
+		r->in.req->req5.destination_dsa_guid	= service->ntds_guid;
+		r->in.req->req5.source_dsa_invocation_id= rf1->source_dsa_invocation_id;
+		r->in.req->req5.naming_context		= &partition->nc;
+		r->in.req->req5.highwatermark		= rf1->highwatermark;
+		r->in.req->req5.uptodateness_vector	= NULL;/*&partition->uptodatevector_ex;*/
+		r->in.req->req5.replica_flags		= rf1->replica_flags;
+		r->in.req->req5.max_object_count	= 133;
+		r->in.req->req5.max_ndr_size		= 1336770;
+		r->in.req->req5.extended_op		= DRSUAPI_EXOP_NONE;
+		r->in.req->req5.fsmo_info		= 0;
 	}
 
 	req = dcerpc_drsuapi_DsGetNCChanges_send(drsuapi->pipe, r, r);
@@ -311,28 +313,28 @@ static void dreplsrv_op_pull_source_get_changes_recv(struct rpc_request *req)
 		return;
 	}
 
-	if (*r->out.level == 1) {
+	if (*r->out.level_out == 1) {
 		ctr_level = 1;
-		ctr1 = &r->out.ctr.ctr1;
-	} else if (*r->out.level == 2 &&
-		   r->out.ctr.ctr2.mszip1.ts) {
+		ctr1 = &r->out.ctr->ctr1;
+	} else if (*r->out.level_out == 2 &&
+		   r->out.ctr->ctr2.mszip1.ts) {
 		ctr_level = 1;
-		ctr1 = &r->out.ctr.ctr2.mszip1.ts->ctr1;
-	} else if (*r->out.level == 6) {
+		ctr1 = &r->out.ctr->ctr2.mszip1.ts->ctr1;
+	} else if (*r->out.level_out == 6) {
 		ctr_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 &&
-		   r->out.ctr.ctr7.ctr.mszip6.ts) {
+		ctr6 = &r->out.ctr->ctr6;
+	} else if (*r->out.level_out == 7 &&
+		   r->out.ctr->ctr7.level == 6 &&
+		   r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_MSZIP &&
+		   r->out.ctr->ctr7.ctr.mszip6.ts) {
 		ctr_level = 6;
-		ctr6 = &r->out.ctr.ctr7.ctr.mszip6.ts->ctr6;
-	} else if (*r->out.level == 7 &&
-		   r->out.ctr.ctr7.level == 6 &&
-		   r->out.ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS &&
-		   r->out.ctr.ctr7.ctr.xpress6.ts) {
+		ctr6 = &r->out.ctr->ctr7.ctr.mszip6.ts->ctr6;
+	} else if (*r->out.level_out == 7 &&
+		   r->out.ctr->ctr7.level == 6 &&
+		   r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS &&
+		   r->out.ctr->ctr7.ctr.xpress6.ts) {
 		ctr_level = 6;
-		ctr6 = &r->out.ctr.ctr7.ctr.xpress6.ts->ctr6;
+		ctr6 = &r->out.ctr->ctr7.ctr.xpress6.ts->ctr6;
 	} else {
 		composite_error(c, werror_to_ntstatus(WERR_BAD_NET_RESP));
 		return;
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index 4cbebbf..6e79242 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -2173,11 +2173,15 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
 	/* setup request structure */
 	r->in.bind_handle						= &s->drsuapi1.bind_handle;
 	r->in.level							= 2;
-	r->in.req.req2.first_object.next_object				= NULL;
-	r->in.req.req2.first_object.object.identifier			= identifier;
-	r->in.req.req2.first_object.object.flags			= 0x00000000;
-	r->in.req.req2.first_object.object.attribute_ctr.num_attributes	= num_attrs;
-	r->in.req.req2.first_object.object.attribute_ctr.attributes	= attrs;
+	r->in.req							= talloc(s, union drsuapi_DsAddEntryRequest);
+	r->in.req->req2.first_object.next_object			= NULL;
+	r->in.req->req2.first_object.object.identifier			= identifier;
+	r->in.req->req2.first_object.object.flags			= 0x00000000;
+	r->in.req->req2.first_object.object.attribute_ctr.num_attributes= num_attrs;
+	r->in.req->req2.first_object.object.attribute_ctr.attributes	= attrs;
+
+	r->out.level_out	= talloc(s, int32_t);
+	r->out.ctr		= talloc(s, union drsuapi_DsAddEntryCtr);
 
 	req = dcerpc_drsuapi_DsAddEntry_send(s->drsuapi1.pipe, r, r);
 	composite_continue_rpc(c, req, becomeDC_drsuapi1_add_entry_recv, s);
@@ -2212,37 +2216,37 @@ static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req)
 		return;
 	}
 
-	if (r->out.level == 3) {
-		if (r->out.ctr.ctr3.count != 1) {
+	if (*r->out.level_out == 3) {
+		if (r->out.ctr->ctr3.count != 1) {
 			WERROR status;
 
-			if (r->out.ctr.ctr3.level != 1) {
+			if (r->out.ctr->ctr3.level != 1) {
 				composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
 				return;
 			}
 
-			if (!r->out.ctr.ctr3.error) {
+			if (!r->out.ctr->ctr3.error) {
 				composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
 				return;
 			}
 
-			status = r->out.ctr.ctr3.error->info1.status;
+			status = r->out.ctr->ctr3.error->info1.status;
 
-			if (!r->out.ctr.ctr3.error->info1.info) {
+			if (!r->out.ctr->ctr3.error->info1.info) {
 				composite_error(c, werror_to_ntstatus(status));
 				return;
 			}
 
 			/* see if we can get a more detailed error */
-			switch (r->out.ctr.ctr3.error->info1.level) {
+			switch (r->out.ctr->ctr3.error->info1.level) {
 			case 1:
-				status = r->out.ctr.ctr3.error->info1.info->error1.status;
+				status = r->out.ctr->ctr3.error->info1.info->error1.status;
 				break;
 			case 4:
 			case 5:
 			case 6:
 			case 7:
-				status = r->out.ctr.ctr3.error->info1.info->errorX.status;
+				status = r->out.ctr->ctr3.error->info1.info->errorX.status;
 				break;
 			}
 
@@ -2250,14 +2254,14 @@ static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req)
 			return;
 		}
 
-		s->dest_dsa.ntds_guid	= r->out.ctr.ctr3.objects[0].guid;
-	} else if (r->out.level == 2) {
-		if (r->out.ctr.ctr2.count != 1) {
-			composite_error(c, werror_to_ntstatus(r->out.ctr.ctr2.error.status));
+		s->dest_dsa.ntds_guid	= r->out.ctr->ctr3.objects[0].guid;
+	} else if (*r->out.level_out == 2) {
+		if (r->out.ctr->ctr2.count != 1) {
+			composite_error(c, werror_to_ntstatus(r->out.ctr->ctr2.error.status));
 			return;
 		}
 
-		s->dest_dsa.ntds_guid	= r->out.ctr.ctr2.objects[0].guid;
+		s->dest_dsa.ntds_guid	= r->out.ctr->ctr2.objects[0].guid;
 	} else {
 		composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
 		return;
@@ -2392,40 +2396,42 @@ static void becomeDC_drsuapi_pull_partition_send(struct libnet_BecomeDC_state *s
 	r = talloc(s, struct drsuapi_DsGetNCChanges);
 	if (composite_nomem(r, c)) return;
 
-	r->in.level = talloc(r, int32_t);
-	if (composite_nomem(r->in.level, c)) return;
-	r->out.level = talloc(r, int32_t);
-	if (composite_nomem(r->out.level, c)) return;
+	r->out.level_out = talloc(r, int32_t);
+	if (composite_nomem(r->out.level_out, c)) return;
+	r->in.req = talloc(r, union drsuapi_DsGetNCChangesRequest);
+	if (composite_nomem(r->in.req, c)) return;
+	r->out.ctr = talloc(r, union drsuapi_DsGetNCChangesCtr);
+	if (composite_nomem(r->out.ctr, c)) return;
 
 	r->in.bind_handle	= &drsuapi_h->bind_handle;
 	if (drsuapi_h->remote_info28.supported_extensions & DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8) {
-		*r->in.level				= 8;
-		r->in.req.req8.destination_dsa_guid	= partition->destination_dsa_guid;
-		r->in.req.req8.source_dsa_invocation_id	= partition->source_dsa_invocation_id;
-		r->in.req.req8.naming_context		= &partition->nc;
-		r->in.req.req8.highwatermark		= partition->highwatermark;
-		r->in.req.req8.uptodateness_vector	= NULL;
-		r->in.req.req8.replica_flags		= partition->replica_flags;
-		r->in.req.req8.max_object_count		= 133;
-		r->in.req.req8.max_ndr_size		= 1336811;
-		r->in.req.req8.extended_op		= DRSUAPI_EXOP_NONE;
-		r->in.req.req8.fsmo_info		= 0;
-		r->in.req.req8.partial_attribute_set	= NULL;
-		r->in.req.req8.partial_attribute_set_ex	= NULL;
-		r->in.req.req8.mapping_ctr.num_mappings	= 0;
-		r->in.req.req8.mapping_ctr.mappings	= NULL;
+		r->in.level				= 8;
+		r->in.req->req8.destination_dsa_guid	= partition->destination_dsa_guid;
+		r->in.req->req8.source_dsa_invocation_id= partition->source_dsa_invocation_id;
+		r->in.req->req8.naming_context		= &partition->nc;
+		r->in.req->req8.highwatermark		= partition->highwatermark;
+		r->in.req->req8.uptodateness_vector	= NULL;
+		r->in.req->req8.replica_flags		= partition->replica_flags;
+		r->in.req->req8.max_object_count	= 133;
+		r->in.req->req8.max_ndr_size		= 1336811;
+		r->in.req->req8.extended_op		= DRSUAPI_EXOP_NONE;
+		r->in.req->req8.fsmo_info		= 0;
+		r->in.req->req8.partial_attribute_set	= NULL;
+		r->in.req->req8.partial_attribute_set_ex= NULL;
+		r->in.req->req8.mapping_ctr.num_mappings= 0;
+		r->in.req->req8.mapping_ctr.mappings	= NULL;
 	} else {
-		*r->in.level				= 5;
-		r->in.req.req5.destination_dsa_guid	= partition->destination_dsa_guid;
-		r->in.req.req5.source_dsa_invocation_id	= partition->source_dsa_invocation_id;
-		r->in.req.req5.naming_context		= &partition->nc;
-		r->in.req.req5.highwatermark		= partition->highwatermark;
-		r->in.req.req5.uptodateness_vector	= NULL;
-		r->in.req.req5.replica_flags		= partition->replica_flags;
-		r->in.req.req5.max_object_count		= 133;
-		r->in.req.req5.max_ndr_size		= 1336770;
-		r->in.req.req5.extended_op		= DRSUAPI_EXOP_NONE;
-		r->in.req.req5.fsmo_info		= 0;
+		r->in.level				= 5;
+		r->in.req->req5.destination_dsa_guid	= partition->destination_dsa_guid;
+		r->in.req->req5.source_dsa_invocation_id= partition->source_dsa_invocation_id;
+		r->in.req->req5.naming_context		= &partition->nc;
+		r->in.req->req5.highwatermark		= partition->highwatermark;
+		r->in.req->req5.uptodateness_vector	= NULL;
+		r->in.req->req5.replica_flags		= partition->replica_flags;
+		r->in.req->req5.max_object_count	= 133;
+		r->in.req->req5.max_ndr_size		= 1336770;
+		r->in.req->req5.extended_op		= DRSUAPI_EXOP_NONE;
+		r->in.req->req5.fsmo_info		= 0;
 	}
 
 	/* 
@@ -2457,28 +2463,28 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
 		return r->out.result;
 	}
 
-	if (*r->out.level == 1) {
+	if (*r->out.level_out == 1) {
 		ctr_level = 1;
-		ctr1 = &r->out.ctr.ctr1;
-	} else if (*r->out.level == 2 &&
-		   r->out.ctr.ctr2.mszip1.ts) {
+		ctr1 = &r->out.ctr->ctr1;
+	} else if (*r->out.level_out == 2 &&
+		   r->out.ctr->ctr2.mszip1.ts) {
 		ctr_level = 1;
-		ctr1 = &r->out.ctr.ctr2.mszip1.ts->ctr1;
-	} else if (*r->out.level == 6) {
+		ctr1 = &r->out.ctr->ctr2.mszip1.ts->ctr1;
+	} else if (*r->out.level_out == 6) {
 		ctr_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 &&
-		   r->out.ctr.ctr7.ctr.mszip6.ts) {
+		ctr6 = &r->out.ctr->ctr6;
+	} else if (*r->out.level_out == 7 &&
+		   r->out.ctr->ctr7.level == 6 &&
+		   r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_MSZIP &&
+		   r->out.ctr->ctr7.ctr.mszip6.ts) {
 		ctr_level = 6;
-		ctr6 = &r->out.ctr.ctr7.ctr.mszip6.ts->ctr6;
-	} else if (*r->out.level == 7 &&
-		   r->out.ctr.ctr7.level == 6 &&
-		   r->out.ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS &&
-		   r->out.ctr.ctr7.ctr.xpress6.ts) {
+		ctr6 = &r->out.ctr->ctr7.ctr.mszip6.ts->ctr6;
+	} else if (*r->out.level_out == 7 &&
+		   r->out.ctr->ctr7.level == 6 &&
+		   r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS &&
+		   r->out.ctr->ctr7.ctr.xpress6.ts) {
 		ctr_level = 6;
-		ctr6 = &r->out.ctr.ctr7.ctr.xpress6.ts->ctr6;
+		ctr6 = &r->out.ctr->ctr7.ctr.xpress6.ts->ctr6;
 	} else {
 		return WERR_BAD_NET_RESP;
 	}
diff --git a/source4/libnet/libnet_join.c b/source4/libnet/libnet_join.c
index f4de903..0ed5e8a 100644
--- a/source4/libnet/libnet_join.c
+++ b/source4/libnet/libnet_join.c
@@ -162,13 +162,19 @@ static NTSTATUS libnet_JoinADSDomain(struct libnet_context *ctx, struct libnet_J
 	ZERO_STRUCT(r_crack_names);
 	r_crack_names.in.bind_handle		= &drsuapi_bind_handle;
 	r_crack_names.in.level			= 1;
-	r_crack_names.in.req.req1.codepage	= 1252; /* western european */
-	r_crack_names.in.req.req1.language	= 0x00000407; /* german */
-	r_crack_names.in.req.req1.count		= 1;
-	r_crack_names.in.req.req1.names		= names;
-	r_crack_names.in.req.req1.format_flags	= DRSUAPI_DS_NAME_FLAG_NO_FLAGS;
-	r_crack_names.in.req.req1.format_offered= DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY;
-	r_crack_names.in.req.req1.format_desired= DRSUAPI_DS_NAME_FORMAT_FQDN_1779;
+	r_crack_names.in.req			= talloc(r, union drsuapi_DsNameRequest);
+	if (!r_crack_names.in.req) {
+		r->out.error_string = NULL;
+		talloc_free(tmp_ctx);
+		return NT_STATUS_NO_MEMORY;
+	}
+	r_crack_names.in.req->req1.codepage	= 1252; /* western european */
+	r_crack_names.in.req->req1.language	= 0x00000407; /* german */
+	r_crack_names.in.req->req1.count	= 1;
+	r_crack_names.in.req->req1.names	= names;
+	r_crack_names.in.req->req1.format_flags	= DRSUAPI_DS_NAME_FLAG_NO_FLAGS;
+	r_crack_names.in.req->req1.format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY;
+	r_crack_names.in.req->req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779;
 	names[0].str = dom_sid_string(tmp_ctx, r->out.account_sid);
 	if (!names[0].str) {
 		r->out.error_string = NULL;
@@ -176,6 +182,14 @@ static NTSTATUS libnet_JoinADSDomain(struct libnet_context *ctx, struct libnet_J
 		return NT_STATUS_NO_MEMORY;
 	}
 
+	r_crack_names.out.ctr			= talloc(r, union drsuapi_DsNameCtr);
+	r_crack_names.out.level_out		= talloc(r, int32_t);
+	if (!r_crack_names.out.ctr || !r_crack_names.out.level_out) {
+		r->out.error_string = NULL;
+		talloc_free(tmp_ctx);
+		return NT_STATUS_NO_MEMORY;
+	}
+
 	status = dcerpc_drsuapi_DsCrackNames(drsuapi_pipe, tmp_ctx, &r_crack_names);
 	if (!NT_STATUS_IS_OK(status)) {
 		if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
@@ -201,24 +215,24 @@ static NTSTATUS libnet_JoinADSDomain(struct libnet_context *ctx, struct libnet_J
 						  "DsCrackNames failed - %s", win_errstr(r_crack_names.out.result));
 		talloc_free(tmp_ctx);
 		return NT_STATUS_UNSUCCESSFUL;
-	} else if (r_crack_names.out.level != 1 
-		   || !r_crack_names.out.ctr.ctr1 
-		   || r_crack_names.out.ctr.ctr1->count != 1) {
+	} else if (*r_crack_names.out.level_out != 1
+		   || !r_crack_names.out.ctr->ctr1
+		   || r_crack_names.out.ctr->ctr1->count != 1) {
 		r->out.error_string = talloc_asprintf(r, "DsCrackNames failed");
 		talloc_free(tmp_ctx);
 		return NT_STATUS_INVALID_PARAMETER;
-	} else if (r_crack_names.out.ctr.ctr1->array[0].status != DRSUAPI_DS_NAME_STATUS_OK) {
-		r->out.error_string = talloc_asprintf(r, "DsCrackNames failed: %d", r_crack_names.out.ctr.ctr1->array[0].status);
+	} else if (r_crack_names.out.ctr->ctr1->array[0].status != DRSUAPI_DS_NAME_STATUS_OK) {
+		r->out.error_string = talloc_asprintf(r, "DsCrackNames failed: %d", r_crack_names.out.ctr->ctr1->array[0].status);
 		talloc_free(tmp_ctx);
 		return NT_STATUS_UNSUCCESSFUL;
-	} else if (r_crack_names.out.ctr.ctr1->array[0].result_name == NULL) {
+	} else if (r_crack_names.out.ctr->ctr1->array[0].result_name == NULL) {
 		r->out.error_string = talloc_asprintf(r, "DsCrackNames failed: no result name");
 		talloc_free(tmp_ctx);
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
 	/* Store the DN of our machine account. */
-	account_dn_str = r_crack_names.out.ctr.ctr1->array[0].result_name;
+	account_dn_str = r_crack_names.out.ctr->ctr1->array[0].result_name;
 
 	/* Now we know the user's DN, open with LDAP, read and modify a few things */
 
@@ -328,8 +342,8 @@ static NTSTATUS libnet_JoinADSDomain(struct libnet_context *ctx, struct libnet_J
 	}
 				
 	/* DsCrackNames to find out the DN of the domain. */
-	r_crack_names.in.req.req1.format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT;
-	r_crack_names.in.req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779;
+	r_crack_names.in.req->req1.format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT;
+	r_crack_names.in.req->req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779;
 	names[0].str = talloc_asprintf(tmp_ctx, "%s\\", r->out.domain_name);
 	if (!names[0].str) {
 		r->out.error_string = NULL;
@@ -362,11 +376,11 @@ static NTSTATUS libnet_JoinADSDomain(struct libnet_context *ctx, struct libnet_J
 					  "DsCrackNames failed - %s", win_errstr(r_crack_names.out.result));
 		talloc_free(tmp_ctx);
 		return NT_STATUS_UNSUCCESSFUL;
-	} else if (r_crack_names.out.level != 1 
-		   || !r_crack_names.out.ctr.ctr1 
-		   || r_crack_names.out.ctr.ctr1->count != 1
-		   || !r_crack_names.out.ctr.ctr1->array[0].result_name		  
-		   || r_crack_names.out.ctr.ctr1->array[0].status != DRSUAPI_DS_NAME_STATUS_OK) {
+	} else if (*r_crack_names.out.level_out != 1
+		   || !r_crack_names.out.ctr->ctr1
+		   || r_crack_names.out.ctr->ctr1->count != 1
+		   || !r_crack_names.out.ctr->ctr1->array[0].result_name
+		   || r_crack_names.out.ctr->ctr1->array[0].status != DRSUAPI_DS_NAME_STATUS_OK) {
 		r->out.error_string = talloc_asprintf(r, "DsCrackNames failed");
 		talloc_free(tmp_ctx);
 		return NT_STATUS_UNSUCCESSFUL;
@@ -377,8 +391,8 @@ static NTSTATUS libnet_JoinADSDomain(struct libnet_context *ctx, struct libnet_J
 	talloc_steal(r, account_dn_str);
 
 	/* Store the domain DN. */
-	r->out.domain_dn_str = r_crack_names.out.ctr.ctr1->array[0].result_name;
-	talloc_steal(r, r_crack_names.out.ctr.ctr1->array[0].result_name);
+	r->out.domain_dn_str = r_crack_names.out.ctr->ctr1->array[0].result_name;
+	talloc_steal(r, r_crack_names.out.ctr->ctr1->array[0].result_name);
 
 	/* Store the KVNO of the account, critical for some kerberos
 	 * operations */
diff --git a/source4/libnet/libnet_unbecome_dc.c b/source4/libnet/libnet_unbecome_dc.c
index 2ee3c64..79c6dc0 100644
--- a/source4/libnet/libnet_unbecome_dc.c
+++ b/source4/libnet/libnet_unbecome_dc.c
@@ -639,9 +639,13 @@ static void unbecomeDC_drsuapi_remove_ds_server_send(struct libnet_UnbecomeDC_st
 
 	r->in.bind_handle	= &s->drsuapi.bind_handle;
 	r->in.level		= 1;
-	r->in.req.req1.server_dn= s->dest_dsa.server_dn_str;
-	r->in.req.req1.domain_dn= s->domain.dn_str;
-	r->in.req.req1.commit	= true;
+	r->in.req		= talloc(s, union drsuapi_DsRemoveDSServerRequest);
+	r->in.req->req1.server_dn = s->dest_dsa.server_dn_str;
+	r->in.req->req1.domain_dn = s->domain.dn_str;
+	r->in.req->req1.commit	= true;
+
+	r->out.level_out	= talloc(s, int32_t);
+	r->out.res		= talloc(s, union drsuapi_DsRemoveDSServerResult);
 
 	req = dcerpc_drsuapi_DsRemoveDSServer_send(s->drsuapi.pipe, s, r);
 	composite_continue_rpc(c, req, unbecomeDC_drsuapi_remove_ds_server_recv, s);
@@ -662,7 +666,7 @@ static void unbecomeDC_drsuapi_remove_ds_server_recv(struct rpc_request *req)
 		return;
 	}
 
-	if (r->out.level != 1) {
+	if (*r->out.level_out != 1) {
 		composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);
 		return;
 	}
diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl
index f89d9e1..9d7c9d9 100644
--- a/source4/librpc/idl/drsuapi.idl
+++ b/source4/librpc/idl/drsuapi.idl
@@ -700,9 +700,10 @@ interface drsuapi
 
 	WERROR drsuapi_DsGetNCChanges(
 		[in] policy_handle *bind_handle,
-		[in,out,ref] int32 *level,
-		[in,switch_is(*level)] drsuapi_DsGetNCChangesRequest req,
-		[out,switch_is(*level)] drsuapi_DsGetNCChangesCtr ctr
+		[in] int32 level,
+		[in,ref,switch_is(level)] drsuapi_DsGetNCChangesRequest *req,
+		[out,ref] int32 *level_out,
+		[out,ref,switch_is(*level_out)] drsuapi_DsGetNCChangesCtr *ctr
 		);
 
 	/*****************/
@@ -927,9 +928,10 @@ interface drsuapi


-- 
Samba Shared Repository


More information about the samba-cvs mailing list