s4: fixed format of repsTo in samdb
authorAndrew Tridgell <tridge@samba.org>
Wed, 9 Sep 2009 02:29:01 +0000 (12:29 +1000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 9 Sep 2009 02:36:51 +0000 (12:36 +1000)
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

librpc/gen_ndr/drsblobs.h
librpc/gen_ndr/ndr_drsblobs.c
librpc/gen_ndr/ndr_drsblobs.h
librpc/idl/drsblobs.idl
source4/rpc_server/drsuapi/updaterefs.c

index e2781d4a8e5e40982de859c48f548518e5f92c18..190e012cb524687cdf646ac5ce478dbcf0f8f4a6 100644 (file)
@@ -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] */;
index 497140fe421dc92c8b11a3eea21b192c6e32f4b4..020d5b33762d581e7e85873a01e19d1febb418b1 100644 (file)
@@ -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) {
index e890e2cfb2f4123ddbec338164ff37ea281c6530..27c13c83974d175897ccbf9ebf307889b3dcf88f 100644 (file)
@@ -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);
index 8ec8458f6bc49f8b6e57e990dc438fa212b601fb..f20d6481334738ba87ec2fb8be23c660b29b104a 100644 (file)
@@ -175,37 +175,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
         */
index 5bf2f2251fb4b685efc08337b38f683d6e177451..4a888099c08f98a3dbcee6f47bb7e3e6586b0077 100644 (file)
 #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",
-                        reps.version));
-               return WERR_DS_DRA_INTERNAL_ERROR;
-       }
-
-       rv1 = &reps.ctr.r;
-       rv1->reps = talloc_realloc(mem_ctx, rv1->reps, struct repsToDest, rv1->count+1);
-       if (rv1->reps == NULL) {
+       reps.r = talloc_realloc(mem_ctx, reps.r, struct repsFromToBlob, reps.count+1);
+       if (reps.r == NULL) {
                return WERR_DS_DRA_INTERNAL_ERROR;
        }
-       rv1->reps[rv1->count] = *dest;
-       rv1->count++;
+       ZERO_STRUCT(reps.r[reps.count]);
+       reps.r[reps.count].version = 1;
+       reps.r[reps.count].ctr.ctr1 = *dest;
+       reps.count++;
 
        werr = uref_savereps(sam_ctx, mem_ctx, guid, &reps);
        if (!W_ERROR_IS_OK(werr)) {
@@ -173,7 +194,6 @@ static WERROR uref_del_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 {
        struct repsTo reps;
        WERROR werr;
-       struct repsTov1 *rv1;
        int i;
 
        werr = uref_loadreps(sam_ctx, mem_ctx, guid, &reps);
@@ -181,19 +201,12 @@ static WERROR uref_del_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
                return werr;
        }
 
-       if (reps.version != REPSTO_VERSION1) {
-               DEBUG(0,("Wrong version number %u on disk\n", reps.version));
-               return WERR_DS_DRA_INTERNAL_ERROR;
-       }
-
-       rv1 = &reps.ctr.r;
-
-       for (i=0; i<rv1->count; i++) {
-               if (GUID_compare(dest_guid, &rv1->reps[i].dest_guid) == 0) {
-                       if (i+1 < rv1->count) {
-                               memmove(&rv1->reps[i], &rv1->reps[i+1], sizeof(rv1->reps[i])*(rv1->count-(i+1)));
+       for (i=0; i<reps.count; i++) {
+               if (GUID_compare(dest_guid, &reps.r[i].ctr.ctr1.source_dsa_obj_guid) == 0) {
+                       if (i+1 < reps.count) {
+                               memmove(&reps.r[i], &reps.r[i+1], sizeof(reps.r[i])*(reps.count-(i+1)));
                        }
-                       rv1->count--;
+                       reps.count--;
                }
        }
 
@@ -248,16 +261,21 @@ WERROR dcesrv_drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TA
        }
 
        if (req->options & DRSUAPI_DS_REPLICA_UPDATE_ADD_REFERENCE) {
-               struct repsToDest dest;
+               struct repsFromTo1 dest;
+               struct repsFromTo1OtherInfo oi;
+               
+               ZERO_STRUCT(dest);
+               ZERO_STRUCT(oi);
 
-               dest.dest_dsa_dns_name = req->dest_dsa_dns_name;
-               dest.dest_guid         = req->dest_dsa_guid;
-               dest.options           = req->options;
+               oi.dns_name = req->dest_dsa_dns_name;
+               dest.other_info          = &oi;
+               dest.source_dsa_obj_guid = req->dest_dsa_guid;
+               dest.replica_flags       = req->options;
 
                werr = uref_add_dest(sam_ctx, mem_ctx, &req->naming_context->guid, &dest);
                if (!W_ERROR_IS_OK(werr)) {
                        DEBUG(0,("Failed to delete repsTo for %s\n",
-                                GUID_string(dce_call, &dest.dest_guid)));
+                                GUID_string(dce_call, &dest.source_dsa_obj_guid)));
                        goto failed;
                }
        }