The branch, v4-0-test has been updated via 2f06fbe06be2e1b77ea013ddba853ce819e58e88 (commit) via c92eb8b776c17f12622837daeb1786862f380269 (commit) via 34ea9d4a0b1270a27412bf939d7e897a5d68d0a6 (commit) from 131a1cfdc9a1228d9263c77bcd31b05d2946fd50 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v4-0-test - Log ----------------------------------------------------------------- commit 2f06fbe06be2e1b77ea013ddba853ce819e58e88 Author: Stefan Metzmacher <[EMAIL PROTECTED]> Date: Thu Jul 24 10:00:20 2008 +0200 dsdb: add a comment about the parameter to DSDB_EXTENDED_SCHEMA_UPDATE_NOW_OID metze commit c92eb8b776c17f12622837daeb1786862f380269 Author: Stefan Metzmacher <[EMAIL PROTECTED]> Date: Thu Jul 24 09:55:53 2008 +0200 dsdb/schema: make more clear where we create the value for the new prefix mapping metze commit 34ea9d4a0b1270a27412bf939d7e897a5d68d0a6 Author: Stefan Metzmacher <[EMAIL PROTECTED]> Date: Thu Jul 24 09:53:29 2008 +0200 dsdb/schema: dsdb_write_prefixes_to_ldb() should do the reverse of dsdb_read_prefixes_to_ldb() metze ----------------------------------------------------------------------- Summary of changes: source/dsdb/samdb/samdb.h | 4 ++ source/dsdb/schema/schema_init.c | 102 ++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 52 deletions(-) Changeset truncated at 500 lines: diff --git a/source/dsdb/samdb/samdb.h b/source/dsdb/samdb/samdb.h index b8a3e16..3e92671 100644 --- a/source/dsdb/samdb/samdb.h +++ b/source/dsdb/samdb/samdb.h @@ -90,6 +90,10 @@ struct dsdb_pdc_fsmo { struct ldb_dn *master_dn; }; +/* + * the schema_dn is passed as struct ldb_dn in + * req->op.extended.data + */ #define DSDB_EXTENDED_SCHEMA_UPDATE_NOW_OID "1.3.6.1.4.1.7165.4.4.2" #endif /* __SAMDB_H__ */ diff --git a/source/dsdb/schema/schema_init.c b/source/dsdb/schema/schema_init.c index 706c8e2..9b89594 100644 --- a/source/dsdb/schema/schema_init.c +++ b/source/dsdb/schema/schema_init.c @@ -302,7 +302,6 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s WERROR status; uint32_t num_prefixes; struct dsdb_schema_oid_prefix *prefixes; - struct ldb_val ndr_blob; TALLOC_CTX *mem_ctx; uint32_t out; @@ -312,7 +311,8 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s /* Read prefixes from disk*/ status = dsdb_read_prefixes_from_ldb( mem_ctx, ldb, &num_prefixes, &prefixes ); if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_read_prefixes_from_ldb failed\n")); + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_read_prefixes_from_ldb: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } @@ -323,27 +323,28 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s /* prefix found*/ talloc_free(mem_ctx); return status; - } - /* Update prefix map in ldb*/ - /* Update the prefixes */ - status = dsdb_prefix_map_update(mem_ctx, &num_prefixes, &prefixes, full_oid); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_prefix_map_update failed\n")); + } else if (!W_ERROR_EQUAL(WERR_DS_NO_MSDS_INTID, status)) { + /* error */ + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_find_prefix_for_oid: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } - /* Convert prefixes in ndr blob*/ - status = dsdb_write_prefixes_to_ndr( mem_ctx, ldb, num_prefixes, prefixes, &ndr_blob ); + + /* Create the new mapping for the prefix of full_oid */ + status = dsdb_prefix_map_update(mem_ctx, &num_prefixes, &prefixes, full_oid); if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ndr failed\n")); + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_prefix_map_update: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } /* Update prefixMap in ldb*/ - status = dsdb_write_prefixes_to_ldb( mem_ctx, ldb, &ndr_blob ); + status = dsdb_write_prefixes_to_ldb(mem_ctx, ldb, num_prefixes, prefixes); if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ldb failed\n")); + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ldb: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } @@ -360,6 +361,12 @@ WERROR dsdb_prefix_map_update(TALLOC_CTX *mem_ctx, uint32_t *num_prefixes, struc new_num_prefixes = *num_prefixes + 1; index_new_prefix = *num_prefixes; + + /* + * this is the algorithm we use to create new mappings for now + * + * TODO: find what algorithm windows use + */ new_entry_id = (*num_prefixes)<<16; /* Extract the prefix from the oid*/ @@ -439,11 +446,17 @@ WERROR dsdb_find_prefix_for_oid(uint32_t num_prefixes, const struct dsdb_schema_ return WERR_DS_NO_MSDS_INTID; } -WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, struct ldb_val *ndr_blob) +WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, + uint32_t num_prefixes, + const struct dsdb_schema_oid_prefix *prefixes) { struct ldb_message msg; struct ldb_dn *schema_dn; struct ldb_message_element el; + struct prefixMapBlob pm; + struct ldb_val ndr_blob; + enum ndr_err_code ndr_err; + uint32_t i; int ret; schema_dn = samdb_schema_dn(ldb); @@ -451,9 +464,31 @@ WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, DEBUG(0,("dsdb_write_prefixes_to_ldb: no schema dn present\n")); return WERR_FOOBAR; } + + pm.version = PREFIX_MAP_VERSION_DSDB; + pm.ctr.dsdb.num_mappings = num_prefixes; + pm.ctr.dsdb.mappings = talloc_array(mem_ctx, + struct drsuapi_DsReplicaOIDMapping, + pm.ctr.dsdb.num_mappings); + if (!pm.ctr.dsdb.mappings) { + return WERR_NOMEM; + } + + for (i=0; i < num_prefixes; i++) { + pm.ctr.dsdb.mappings[i].id_prefix = prefixes[i].id>>16; + pm.ctr.dsdb.mappings[i].oid.oid = talloc_strdup(pm.ctr.dsdb.mappings, prefixes[i].oid); + } + + ndr_err = ndr_push_struct_blob(&ndr_blob, ldb, + lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), + &pm, + (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + return WERR_FOOBAR; + } el.num_values = 1; - el.values = ndr_blob; + el.values = &ndr_blob; el.flags = LDB_FLAG_MOD_REPLACE; el.name = talloc_strdup(mem_ctx, "prefixMap"); @@ -541,43 +576,6 @@ WERROR dsdb_read_prefixes_from_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, return WERR_OK; } - -WERROR dsdb_write_prefixes_to_ndr(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, uint32_t num_prefixes, const struct dsdb_schema_oid_prefix *prefixes, struct ldb_val *out) -{ - struct prefixMapBlob *blob; - enum ndr_err_code ndr_err; - uint32_t i; - - blob = talloc_zero(mem_ctx, struct prefixMapBlob); - W_ERROR_HAVE_NO_MEMORY(blob); - - blob->version = PREFIX_MAP_VERSION_DSDB; - blob->ctr.dsdb.num_mappings = num_prefixes; - blob->ctr.dsdb.mappings = talloc_realloc(blob, - blob->ctr.dsdb.mappings, - struct drsuapi_DsReplicaOIDMapping, - blob->ctr.dsdb.num_mappings); - if (!blob->ctr.dsdb.mappings) { - return WERR_NOMEM; - } - - for (i=0; i < num_prefixes; i++) { - blob->ctr.dsdb.mappings[i].id_prefix = prefixes[i].id>>16; - blob->ctr.dsdb.mappings[i].oid.oid = talloc_strdup(blob->ctr.dsdb.mappings, prefixes[i].oid); - } - - ndr_err = ndr_push_struct_blob(out, ldb, - lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), - blob, - (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - return WERR_FOOBAR; - } - - return WERR_OK; -} - - #define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ (p)->elem = samdb_result_string(msg, attr, NULL);\ if (strict && (p)->elem == NULL) { \ -- Samba Shared Repository