s4/drs: refactor dsdb_load_oid_mappings_ldb() to use _dsdb_prefixmap_from_ldb_val()
authorKamen Mazdrashki <kamen.mazdrashki@postpath.com>
Mon, 26 Oct 2009 22:16:02 +0000 (00:16 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 6 Nov 2009 13:05:45 +0000 (14:05 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
source4/dsdb/schema/schema_init.c

index 615e1d4d3d13d52fecb033cb8a14b049055f1276..5b0ad5d383c34b06922efd71459f77c33e56a7ea 100644 (file)
@@ -105,50 +105,46 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
                                  const struct ldb_val *schemaInfo)
 {
        WERROR status;
-       enum ndr_err_code ndr_err;
-       struct prefixMapBlob pfm;
-       DATA_BLOB schema_info_blob;
+       const char *schema_info;
+       struct dsdb_schema_prefixmap *pfm;
+       TALLOC_CTX *mem_ctx;
 
-       TALLOC_CTX *mem_ctx = talloc_new(schema);
-       W_ERROR_HAVE_NO_MEMORY(mem_ctx);
-       
-       ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err);
-               talloc_free(mem_ctx);
-               return ntstatus_to_werror(nt_status);
+       /* verify input params */
+       if (schemaInfo->length != 21) {
+               return WERR_INVALID_PARAMETER;
        }
-
-       if (pfm.version != PREFIX_MAP_VERSION_DSDB) {
-               talloc_free(mem_ctx);
-               return WERR_FOOBAR;
+       if (schemaInfo->data[0] != 0xFF) {
+               return WERR_INVALID_PARAMETER;
        }
 
-       if (schemaInfo->length != 21 && schemaInfo->data[0] == 0xFF) {
+       mem_ctx = talloc_new(schema);
+       W_ERROR_HAVE_NO_MEMORY(mem_ctx);
+
+       /* fetch prefixMap */
+       status = _dsdb_prefixmap_from_ldb_val(prefixMap,
+                                             schema->iconv_convenience,
+                                             mem_ctx, &pfm);
+       W_ERROR_NOT_OK_RETURN(status);
+
+       /* decode schema_info */
+       schema_info = hex_encode_talloc(mem_ctx,
+                                       schemaInfo->data,
+                                       schemaInfo->length);
+       if (!schema_info) {
                talloc_free(mem_ctx);
-               return WERR_FOOBAR;
+               return WERR_NOMEM;
        }
 
-       /* append the schema info as last element */
-       pfm.ctr.dsdb.num_mappings++;
-       pfm.ctr.dsdb.mappings = talloc_realloc(mem_ctx, pfm.ctr.dsdb.mappings,
-                                              struct drsuapi_DsReplicaOIDMapping,
-                                              pfm.ctr.dsdb.num_mappings);
-       W_ERROR_HAVE_NO_MEMORY(pfm.ctr.dsdb.mappings);
-
-       schema_info_blob = data_blob_dup_talloc(pfm.ctr.dsdb.mappings, schemaInfo);
-       W_ERROR_HAVE_NO_MEMORY(schema_info_blob.data);
+       /* store prefixMap and schema_info into cached Schema */
+       talloc_free(schema->prefixmap);
+       schema->prefixmap = talloc_steal(schema, pfm);
 
-       pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].id_prefix          = 0;    
-       pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.length         = schemaInfo->length;
-       pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.binary_oid     = schema_info_blob.data;
+       talloc_free(discard_const(schema->schema_info));
+       schema->schema_info = talloc_steal(schema, schema_info);
 
-       /* call the drsuapi version */
-       status = dsdb_load_prefixmap_from_drsuapi(schema, &pfm.ctr.dsdb);
+       /* clean up locally allocated mem */
        talloc_free(mem_ctx);
 
-       W_ERROR_NOT_OK_RETURN(status);
-
        return WERR_OK;
 }