r20780: keep a dsdb_schema_fsmo struct as private data
authorStefan Metzmacher <metze@samba.org>
Sun, 14 Jan 2007 19:08:14 +0000 (19:08 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:40:53 +0000 (14:40 -0500)
and remember if we're the schema master

metze
(This used to be commit c42dab21fb275ca36a517f97922af21447671785)

source4/dsdb/samdb/ldb_modules/schema_fsmo.c

index 9faed9a5ace46d0e6825844a3729a27a03a4c3c4..33a7539b3939a9645b8cacf55df6210021ac6e0f 100644 (file)
 #include "librpc/gen_ndr/ndr_drsblobs.h"
 #include "lib/util/dlinklist.h"
 
+struct dsdb_schema_fsmo {
+       bool we_are_master;
+};
+
 static int schema_fsmo_init(struct ldb_module *module)
 {
        WERROR status;
        TALLOC_CTX *mem_ctx;
        struct ldb_dn *schema_dn;
        struct dsdb_schema *schema;
+       struct dsdb_schema_fsmo *schema_fsmo;
        struct ldb_result *schema_res;
+       struct ldb_dn *schema_master_dn;
        const struct ldb_val *prefix_val;
        const struct ldb_val *info_val;
        struct ldb_result *a_res;
@@ -48,6 +54,7 @@ static int schema_fsmo_init(struct ldb_module *module)
        static const char *schema_attrs[] = {
                "prefixMap",
                "schemaInfo",
+               "fSMORoleOwner",
                NULL
        };
 
@@ -64,6 +71,13 @@ static int schema_fsmo_init(struct ldb_module *module)
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
+       schema_fsmo = talloc_zero(mem_ctx, struct dsdb_schema_fsmo);
+       if (!schema_fsmo) {
+               ldb_oom(module->ldb);
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+       module->private_data = schema_fsmo;
+
        schema = talloc_zero(mem_ctx, struct dsdb_schema);
        if (!schema) {
                ldb_oom(module->ldb);
@@ -210,6 +224,13 @@ static int schema_fsmo_init(struct ldb_module *module)
                return ret;
        }
 
+       schema_master_dn = ldb_msg_find_attr_as_dn(module->ldb, mem_ctx, schema_res->msgs[0], "fSMORoleOwner");
+       if (ldb_dn_compare(samdb_ntds_settings_dn(module->ldb), schema_master_dn) == 0) {
+               schema_fsmo->we_are_master = true;
+       } else {
+               schema_fsmo->we_are_master = false;
+       }
+
        talloc_free(mem_ctx);
        return ldb_next_init(module);
 }