[SCM] Samba Shared Repository - branch master updated - tevent-0-9-8-108-gdca7afb

Andrew Tridgell tridge at samba.org
Tue Sep 8 20:37:50 MDT 2009


The branch, master has been updated
       via  dca7afb799477a34f704c04397a6afa1ee6b9973 (commit)
       via  3cb1caf0ef9fa7b3e96f2ff1d878357bef3a60d3 (commit)
      from  32c28e4f64815b8c3322a6d52135b248c8b81efa (commit)

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


- Log -----------------------------------------------------------------
commit dca7afb799477a34f704c04397a6afa1ee6b9973
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Sep 9 12:29:01 2009 +1000

    s4: fixed format of repsTo in samdb
    
    Metze pointed out what the windows tool ldp.exe will examine repsTo
    attributes on remote DCs, so we do in fact need to use the same format
    that windows uses. This patch changes the server side implementation
    of UpdateRefs to use the windows format

commit 3cb1caf0ef9fa7b3e96f2ff1d878357bef3a60d3
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Sep 9 11:26:50 2009 +1000

    s4: allow repl:RODC=true/false to set ourselves as a RODC
    
    I think this is what windows DCs use to see that we are read-only, but
    I am not sure. Needs more testing.

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

Summary of changes:
 librpc/gen_ndr/drsblobs.h               |   31 ----
 librpc/gen_ndr/ndr_drsblobs.c           |  232 -------------------------------
 librpc/gen_ndr/ndr_drsblobs.h           |    7 -
 librpc/idl/drsblobs.idl                 |   31 ----
 source4/libnet/libnet_become_dc.c       |    8 +-
 source4/rpc_server/drsuapi/updaterefs.c |  122 +++++++++-------
 6 files changed, 76 insertions(+), 355 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/drsblobs.h b/librpc/gen_ndr/drsblobs.h
index e2781d4..190e012 100644
--- a/librpc/gen_ndr/drsblobs.h
+++ b/librpc/gen_ndr/drsblobs.h
@@ -128,37 +128,6 @@ struct prefixMapBlob {
 	union prefixMapCtr ctr;/* [switch_is(version)] */
 }/* [public] */;
 
-enum repsToVersion
-#ifndef USE_UINT_ENUMS
- {
-	REPSTO_VERSION1=1
-}
-#else
- { __donnot_use_enum_repsToVersion=0x7FFFFFFF}
-#define REPSTO_VERSION1 ( 1 )
-#endif
-;
-
-struct repsToDest {
-	const char * dest_dsa_dns_name;/* [flag(LIBNDR_FLAG_STR_UTF8|LIBNDR_FLAG_STR_NULLTERM)] */
-	struct GUID dest_guid;
-	uint32_t options;
-};
-
-struct repsTov1 {
-	uint32_t count;
-	struct repsToDest *reps;/* [size_is(count)] */
-};
-
-union repsToCtr {
-	struct repsTov1 r;/* [case(REPSTO_VERSION1)] */
-}/* [nodiscriminant] */;
-
-struct repsTo {
-	enum repsToVersion version;
-	union repsToCtr ctr;/* [switch_is(version)] */
-}/* [public] */;
-
 union ldapControlDirSyncExtra {
 	struct replUpToDateVectorBlob uptodateness_vector;/* [default] */
 }/* [gensize,nodiscriminant] */;
diff --git a/librpc/gen_ndr/ndr_drsblobs.c b/librpc/gen_ndr/ndr_drsblobs.c
index 497140f..020d5b3 100644
--- a/librpc/gen_ndr/ndr_drsblobs.c
+++ b/librpc/gen_ndr/ndr_drsblobs.c
@@ -1012,238 +1012,6 @@ _PUBLIC_ void ndr_print_prefixMapBlob(struct ndr_print *ndr, const char *name, c
 	ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_repsToVersion(struct ndr_push *ndr, int ndr_flags, enum repsToVersion r)
-{
-	NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
-	return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_repsToVersion(struct ndr_pull *ndr, int ndr_flags, enum repsToVersion *r)
-{
-	uint32_t v;
-	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
-	*r = v;
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_repsToVersion(struct ndr_print *ndr, const char *name, enum repsToVersion r)
-{
-	const char *val = NULL;
-
-	switch (r) {
-		case REPSTO_VERSION1: val = "REPSTO_VERSION1"; break;
-	}
-	ndr_print_enum(ndr, name, "ENUM", val, r);
-}
-
-static enum ndr_err_code ndr_push_repsToDest(struct ndr_push *ndr, int ndr_flags, const struct repsToDest *r)
-{
-	if (ndr_flags & NDR_SCALARS) {
-		NDR_CHECK(ndr_push_align(ndr, 4));
-		{
-			uint32_t _flags_save_string = ndr->flags;
-			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_UTF8|LIBNDR_FLAG_STR_NULLTERM);
-			NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->dest_dsa_dns_name));
-			ndr->flags = _flags_save_string;
-		}
-		NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->dest_guid));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->options));
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_repsToDest(struct ndr_pull *ndr, int ndr_flags, struct repsToDest *r)
-{
-	if (ndr_flags & NDR_SCALARS) {
-		NDR_CHECK(ndr_pull_align(ndr, 4));
-		{
-			uint32_t _flags_save_string = ndr->flags;
-			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_UTF8|LIBNDR_FLAG_STR_NULLTERM);
-			NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->dest_dsa_dns_name));
-			ndr->flags = _flags_save_string;
-		}
-		NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->dest_guid));
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->options));
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_repsToDest(struct ndr_print *ndr, const char *name, const struct repsToDest *r)
-{
-	ndr_print_struct(ndr, name, "repsToDest");
-	ndr->depth++;
-	ndr_print_string(ndr, "dest_dsa_dns_name", r->dest_dsa_dns_name);
-	ndr_print_GUID(ndr, "dest_guid", &r->dest_guid);
-	ndr_print_uint32(ndr, "options", r->options);
-	ndr->depth--;
-}
-
-static enum ndr_err_code ndr_push_repsTov1(struct ndr_push *ndr, int ndr_flags, const struct repsTov1 *r)
-{
-	uint32_t cntr_reps_0;
-	if (ndr_flags & NDR_SCALARS) {
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		NDR_CHECK(ndr_push_align(ndr, 4));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		for (cntr_reps_0 = 0; cntr_reps_0 < r->count; cntr_reps_0++) {
-			NDR_CHECK(ndr_push_repsToDest(ndr, NDR_SCALARS, &r->reps[cntr_reps_0]));
-		}
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_repsTov1(struct ndr_pull *ndr, int ndr_flags, struct repsTov1 *r)
-{
-	uint32_t cntr_reps_0;
-	TALLOC_CTX *_mem_save_reps_0;
-	if (ndr_flags & NDR_SCALARS) {
-		NDR_CHECK(ndr_pull_array_size(ndr, &r->reps));
-		NDR_CHECK(ndr_pull_align(ndr, 4));
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-		NDR_PULL_ALLOC_N(ndr, r->reps, ndr_get_array_size(ndr, &r->reps));
-		_mem_save_reps_0 = NDR_PULL_GET_MEM_CTX(ndr);
-		NDR_PULL_SET_MEM_CTX(ndr, r->reps, 0);
-		for (cntr_reps_0 = 0; cntr_reps_0 < r->count; cntr_reps_0++) {
-			NDR_CHECK(ndr_pull_repsToDest(ndr, NDR_SCALARS, &r->reps[cntr_reps_0]));
-		}
-		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_reps_0, 0);
-		if (r->reps) {
-			NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->reps, r->count));
-		}
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_repsTov1(struct ndr_print *ndr, const char *name, const struct repsTov1 *r)
-{
-	uint32_t cntr_reps_0;
-	ndr_print_struct(ndr, name, "repsTov1");
-	ndr->depth++;
-	ndr_print_uint32(ndr, "count", r->count);
-	ndr->print(ndr, "%s: ARRAY(%d)", "reps", (int)r->count);
-	ndr->depth++;
-	for (cntr_reps_0=0;cntr_reps_0<r->count;cntr_reps_0++) {
-		char *idx_0=NULL;
-		if (asprintf(&idx_0, "[%d]", cntr_reps_0) != -1) {
-			ndr_print_repsToDest(ndr, "reps", &r->reps[cntr_reps_0]);
-			free(idx_0);
-		}
-	}
-	ndr->depth--;
-	ndr->depth--;
-}
-
-static enum ndr_err_code ndr_push_repsToCtr(struct ndr_push *ndr, int ndr_flags, const union repsToCtr *r)
-{
-	if (ndr_flags & NDR_SCALARS) {
-		int level = ndr_push_get_switch_value(ndr, r);
-		switch (level) {
-			case REPSTO_VERSION1: {
-				NDR_CHECK(ndr_push_repsTov1(ndr, NDR_SCALARS, &r->r));
-			break; }
-
-			default:
-				return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
-		}
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-		int level = ndr_push_get_switch_value(ndr, r);
-		switch (level) {
-			case REPSTO_VERSION1:
-			break;
-
-			default:
-				return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
-		}
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_repsToCtr(struct ndr_pull *ndr, int ndr_flags, union repsToCtr *r)
-{
-	int level;
-	level = ndr_pull_get_switch_value(ndr, r);
-	if (ndr_flags & NDR_SCALARS) {
-		switch (level) {
-			case REPSTO_VERSION1: {
-				NDR_CHECK(ndr_pull_repsTov1(ndr, NDR_SCALARS, &r->r));
-			break; }
-
-			default:
-				return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
-		}
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-		switch (level) {
-			case REPSTO_VERSION1:
-			break;
-
-			default:
-				return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u at %s", level, __location__);
-		}
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_repsToCtr(struct ndr_print *ndr, const char *name, const union repsToCtr *r)
-{
-	int level;
-	level = ndr_print_get_switch_value(ndr, r);
-	ndr_print_union(ndr, name, level, "repsToCtr");
-	switch (level) {
-		case REPSTO_VERSION1:
-			ndr_print_repsTov1(ndr, "r", &r->r);
-		break;
-
-		default:
-			ndr_print_bad_level(ndr, name, level);
-	}
-}
-
-_PUBLIC_ enum ndr_err_code ndr_push_repsTo(struct ndr_push *ndr, int ndr_flags, const struct repsTo *r)
-{
-	if (ndr_flags & NDR_SCALARS) {
-		NDR_CHECK(ndr_push_align(ndr, 4));
-		NDR_CHECK(ndr_push_repsToVersion(ndr, NDR_SCALARS, r->version));
-		NDR_CHECK(ndr_push_set_switch_value(ndr, &r->ctr, r->version));
-		NDR_CHECK(ndr_push_repsToCtr(ndr, NDR_SCALARS, &r->ctr));
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ enum ndr_err_code ndr_pull_repsTo(struct ndr_pull *ndr, int ndr_flags, struct repsTo *r)
-{
-	if (ndr_flags & NDR_SCALARS) {
-		NDR_CHECK(ndr_pull_align(ndr, 4));
-		NDR_CHECK(ndr_pull_repsToVersion(ndr, NDR_SCALARS, &r->version));
-		NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->ctr, r->version));
-		NDR_CHECK(ndr_pull_repsToCtr(ndr, NDR_SCALARS, &r->ctr));
-	}
-	if (ndr_flags & NDR_BUFFERS) {
-	}
-	return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_repsTo(struct ndr_print *ndr, const char *name, const struct repsTo *r)
-{
-	ndr_print_struct(ndr, name, "repsTo");
-	ndr->depth++;
-	ndr_print_repsToVersion(ndr, "version", r->version);
-	ndr_print_set_switch_value(ndr, &r->ctr, r->version);
-	ndr_print_repsToCtr(ndr, "ctr", &r->ctr);
-	ndr->depth--;
-}
-
 static enum ndr_err_code ndr_push_ldapControlDirSyncExtra(struct ndr_push *ndr, int ndr_flags, const union ldapControlDirSyncExtra *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
diff --git a/librpc/gen_ndr/ndr_drsblobs.h b/librpc/gen_ndr/ndr_drsblobs.h
index e890e2c..27c13c8 100644
--- a/librpc/gen_ndr/ndr_drsblobs.h
+++ b/librpc/gen_ndr/ndr_drsblobs.h
@@ -75,13 +75,6 @@ void ndr_print_prefixMapCtr(struct ndr_print *ndr, const char *name, const union
 enum ndr_err_code ndr_push_prefixMapBlob(struct ndr_push *ndr, int ndr_flags, const struct prefixMapBlob *r);
 enum ndr_err_code ndr_pull_prefixMapBlob(struct ndr_pull *ndr, int ndr_flags, struct prefixMapBlob *r);
 void ndr_print_prefixMapBlob(struct ndr_print *ndr, const char *name, const struct prefixMapBlob *r);
-void ndr_print_repsToVersion(struct ndr_print *ndr, const char *name, enum repsToVersion r);
-void ndr_print_repsToDest(struct ndr_print *ndr, const char *name, const struct repsToDest *r);
-void ndr_print_repsTov1(struct ndr_print *ndr, const char *name, const struct repsTov1 *r);
-void ndr_print_repsToCtr(struct ndr_print *ndr, const char *name, const union repsToCtr *r);
-enum ndr_err_code ndr_push_repsTo(struct ndr_push *ndr, int ndr_flags, const struct repsTo *r);
-enum ndr_err_code ndr_pull_repsTo(struct ndr_pull *ndr, int ndr_flags, struct repsTo *r);
-void ndr_print_repsTo(struct ndr_print *ndr, const char *name, const struct repsTo *r);
 void ndr_print_ldapControlDirSyncExtra(struct ndr_print *ndr, const char *name, const union ldapControlDirSyncExtra *r);
 void ndr_print_ldapControlDirSyncBlob(struct ndr_print *ndr, const char *name, const struct ldapControlDirSyncBlob *r);
 enum ndr_err_code ndr_push_ldapControlDirSyncCookie(struct ndr_push *ndr, int ndr_flags, const struct ldapControlDirSyncCookie *r);
diff --git a/librpc/idl/drsblobs.idl b/librpc/idl/drsblobs.idl
index 8ec8458..f20d648 100644
--- a/librpc/idl/drsblobs.idl
+++ b/librpc/idl/drsblobs.idl
@@ -176,37 +176,6 @@ interface drsblobs {
 
 
 	/*
-	 * repsTo structure. This is not sent over the wire so we are
-	 * free to choose our own format. It is updated by the
-	 * DRSUpdateRefs DRSUAPI call. This is stored in NDR format
-	 * in the root of each partition in the repsTo attribute
-	 */
-	typedef [v1_enum] enum {
-		REPSTO_VERSION1 = 1
-	} repsToVersion;
-
-	typedef struct {
-		utf8string dest_dsa_dns_name;
-		GUID dest_guid;
-		uint32 options;
-	} repsToDest;
-
-	typedef struct {
-		uint32 count;
-		[size_is(count)] repsToDest reps[];
-	} repsTov1;
-
-	typedef [nodiscriminant] union {
-		[case(REPSTO_VERSION1)] repsTov1 r;
-	} repsToCtr;
-
-	typedef [public] struct {
-		repsToVersion version;
-		[switch_is(version)] repsToCtr ctr;
-	} repsTo;
-	
-
-	/*
 	 * the cookie for the LDAP dirsync control
 	 */
 	typedef [nodiscriminant,gensize] union {
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index 2d35b40..9ba801b 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -2767,8 +2767,12 @@ static void becomeDC_drsuapi_update_refs_send(struct libnet_BecomeDC_state *s,
 	r->in.req.req1.dest_dsa_dns_name= ntds_dns_name;
 	r->in.req.req1.dest_dsa_guid	= s->dest_dsa.ntds_guid;
 	r->in.req.req1.options		= DRSUAPI_DS_REPLICA_UPDATE_ADD_REFERENCE
-					| DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE
-					| DRSUAPI_DS_REPLICA_UPDATE_WRITEABLE;
+					| DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE;
+
+	/* I think this is how we mark ourselves as a RODC */
+	if (!lp_parm_bool(s->libnet->lp_ctx, NULL, "repl", "RODC", false)) {
+		r->in.req.req1.options |= DRSUAPI_DS_REPLICA_UPDATE_WRITEABLE;
+	}
 
 	req = dcerpc_drsuapi_DsReplicaUpdateRefs_send(drsuapi->pipe, r, r);
 	composite_continue_rpc(c, req, recv_fn, s);
diff --git a/source4/rpc_server/drsuapi/updaterefs.c b/source4/rpc_server/drsuapi/updaterefs.c
index 5bf2f22..4a88809 100644
--- a/source4/rpc_server/drsuapi/updaterefs.c
+++ b/source4/rpc_server/drsuapi/updaterefs.c
@@ -30,6 +30,11 @@
 #include "librpc/gen_ndr/ndr_drsblobs.h"
 #include "auth/auth.h"
 
+struct repsTo {
+	uint32_t count;
+	struct repsFromToBlob *r;
+};
+
 /*
   load the repsTo structure for a given partition GUID
  */
@@ -39,8 +44,9 @@ static WERROR uref_loadreps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, st
 	struct ldb_dn *dn;
 	const char *attrs[] = { "repsTo", NULL };
 	struct ldb_result *res;
-	const struct ldb_val *v;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+	int i;
+	struct ldb_message_element *el;
 
 	if (dsdb_find_dn_by_guid(sam_ctx, tmp_ctx, GUID_string(tmp_ctx, guid), &dn) != LDB_SUCCESS) {
 		DEBUG(0,("drsuapi_addref: failed to find partition with GUID %s\n",
@@ -58,16 +64,27 @@ static WERROR uref_loadreps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, st
 		return WERR_DS_DRA_INTERNAL_ERROR;
 	}
 
-	v = ldb_msg_find_ldb_val(res->msgs[0], "repsTo");
-	if (v == NULL) {
-		/* treat as empty empty */
-		ZERO_STRUCTP(reps);
-		reps->version = REPSTO_VERSION1;
-	} else {
+	ZERO_STRUCTP(reps);
+
+	el = ldb_msg_find_element(res->msgs[0], "repsTo");
+	if (el == NULL) {
+		talloc_free(tmp_ctx);
+		return WERR_OK;
+	}
+
+	reps->count = el->num_values;
+	reps->r = talloc_array(mem_ctx, struct repsFromToBlob, reps->count);
+	if (reps->r == NULL) {
+		talloc_free(tmp_ctx);
+		return WERR_DS_DRA_INTERNAL_ERROR;
+	}
+
+	for (i=0; i<reps->count; i++) {
 		enum ndr_err_code ndr_err;
-		ndr_err = ndr_pull_struct_blob(v, mem_ctx, lp_iconv_convenience(ldb_get_opaque(sam_ctx, "loadparm")),
-					       reps, 
-					       (ndr_pull_flags_fn_t)ndr_pull_repsTo);
+		ndr_err = ndr_pull_struct_blob(&el->values[i], 
+					       mem_ctx, lp_iconv_convenience(ldb_get_opaque(sam_ctx, "loadparm")),
+					       &reps->r[i], 
+					       (ndr_pull_flags_fn_t)ndr_pull_repsFromToBlob);
 		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
 			talloc_free(tmp_ctx);
 			return WERR_DS_DRA_INTERNAL_ERROR;
@@ -86,11 +103,10 @@ static WERROR uref_savereps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, st
 			    struct repsTo *reps)
 {
 	struct ldb_dn *dn;
-	struct ldb_val v;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-	enum ndr_err_code ndr_err;
 	struct ldb_message *msg;
 	struct ldb_message_element *el;
+	int i;
 
 	if (dsdb_find_dn_by_guid(sam_ctx, tmp_ctx, GUID_string(tmp_ctx, guid), &dn) != LDB_SUCCESS) {
 		DEBUG(0,("drsuapi_addref: failed to find partition with GUID %s\n",
@@ -99,20 +115,31 @@ static WERROR uref_savereps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, st
 		return WERR_DS_DRA_BAD_NC;
 	}
 
-	ndr_err = ndr_push_struct_blob(&v, tmp_ctx, lp_iconv_convenience(ldb_get_opaque(sam_ctx, "loadparm")),
-				       reps, 
-				       (ndr_push_flags_fn_t)ndr_push_repsTo);
-	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-		goto failed;
-	}
-
 	msg = ldb_msg_new(tmp_ctx);
 	msg->dn = dn;
 	if (ldb_msg_add_empty(msg, "repsTo", LDB_FLAG_MOD_REPLACE, &el) != LDB_SUCCESS) {
 		goto failed;
 	}
-	el->num_values = 1;
-	el->values = &v;
+
+	el->values = talloc_array(msg, struct ldb_val, reps->count);
+	if (!el->values) {
+		goto failed;
+	}
+
+	for (i=0; i<reps->count; i++) {
+		struct ldb_val v;
+		enum ndr_err_code ndr_err;
+
+		ndr_err = ndr_push_struct_blob(&v, tmp_ctx, lp_iconv_convenience(ldb_get_opaque(sam_ctx, "loadparm")),
+					       &reps->r[i], 
+					       (ndr_push_flags_fn_t)ndr_push_repsFromToBlob);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			goto failed;
+		}
+
+		el->num_values++;
+		el->values[i] = v;
+	}
 
 	if (ldb_modify(sam_ctx, msg) != LDB_SUCCESS) {
 		DEBUG(0,("Failed to store repsTo - %s\n", ldb_errstring(sam_ctx)));
@@ -132,30 +159,24 @@ failed:
   add a replication destination for a given partition GUID
  */
 static WERROR uref_add_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, 
-			    struct GUID *guid, struct repsToDest *dest)
+			    struct GUID *guid, struct repsFromTo1 *dest)
 {
 	struct repsTo reps;
 	WERROR werr;
-	struct repsTov1 *rv1;
 
 	werr = uref_loadreps(sam_ctx, mem_ctx, guid, &reps);
 	if (!W_ERROR_IS_OK(werr)) {
 		return werr;
 	}
 
-	if (reps.version != REPSTO_VERSION1) {
-		DEBUG(0,("Wrong version number %u on disk\n",


-- 
Samba Shared Repository


More information about the samba-cvs mailing list