diff options
Diffstat (limited to 'source4/dsdb/schema/schema_init.c')
-rw-r--r-- | source4/dsdb/schema/schema_init.c | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 278f18cf0d..f15b03c9b4 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -3,7 +3,8 @@ DSDB schema header Copyright (C) Stefan Metzmacher <metze@samba.org> 2006 - + Copyright (C) Andrew Bartlett <abartlet@samba.org> 2007 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or @@ -26,6 +27,7 @@ #include "librpc/gen_ndr/ndr_misc.h" #include "librpc/gen_ndr/ndr_drsuapi.h" #include "librpc/gen_ndr/ndr_drsblobs.h" +#include "param/param.h" WERROR dsdb_load_oid_mappings_drsuapi(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { @@ -619,7 +621,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ if (_a && _a->value_ctr.num_values >= 1) { \ ssize_t _ret; \ - _ret = convert_string_talloc(mem_ctx, global_smb_iconv_convenience, CH_UTF16, CH_UNIX, \ + _ret = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, \ _a->value_ctr.values[0].blob->data, \ _a->value_ctr.values[0].blob->length, \ (void **)discard_const(&(p)->elem)); \ @@ -1038,6 +1040,11 @@ WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *sche return WERR_OK; } +/** + * Attach the schema to an opaque pointer on the ldb, so ldb modules + * can find it + */ + int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) { int ret; @@ -1052,8 +1059,14 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) return LDB_SUCCESS; } +/** + * Global variable to hold one copy of the schema, used to avoid memory bloat + */ static struct dsdb_schema *global_schema; +/** + * Make this ldb use the 'global' schema, setup to avoid having multiple copies in this process + */ int dsdb_set_global_schema(struct ldb_context *ldb) { int ret; @@ -1068,10 +1081,14 @@ int dsdb_set_global_schema(struct ldb_context *ldb) return LDB_SUCCESS; } -const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) +/** + * Find the schema object for this ldb + */ + +struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) { const void *p; - const struct dsdb_schema *schema; + struct dsdb_schema *schema; /* see if we have a cached copy */ p = ldb_get_opaque(ldb, "dsdb_schema"); @@ -1087,18 +1104,13 @@ const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) return schema; } +/** + * Make the schema found on this ldb the 'global' schema + */ + void dsdb_make_schema_global(struct ldb_context *ldb) { - const void *p; - const struct dsdb_schema *schema; - - /* see if we have a cached copy */ - p = ldb_get_opaque(ldb, "dsdb_schema"); - if (!p) { - return; - } - - schema = talloc_get_type(p, struct dsdb_schema); + struct dsdb_schema *schema = dsdb_get_schema(ldb); if (!schema) { return; } @@ -1109,6 +1121,13 @@ void dsdb_make_schema_global(struct ldb_context *ldb) dsdb_set_global_schema(ldb); } + +/** + * Rather than read a schema from the LDB itself, read it from an ldif + * file. This allows schema to be loaded and used while adding the + * schema itself to the directory. + */ + WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf, const char *df) { struct ldb_ldif *ldif; |