diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2006-03-02 16:32:53 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:52:11 -0500 |
commit | 26af14c39b88b0e7eb53657b89be65d865804688 (patch) | |
tree | ac73da63e8b053514ff8ecf465027d02227feea1 /source4 | |
parent | 0efc7293181dc06d79c0edc21677f900597fc760 (diff) | |
download | samba-26af14c39b88b0e7eb53657b89be65d865804688.tar.gz samba-26af14c39b88b0e7eb53657b89be65d865804688.tar.bz2 samba-26af14c39b88b0e7eb53657b89be65d865804688.zip |
r13786: [merge] Add registration functions for LDB modules
Applications that use LDB modules will now have to run ldb_global_init()
before they can use LDB.
The next step will be adding support for loading LDB modules from .so
files. This will also allow us to use one LDB without difference between the
standalone and the Samba-specific build
(This used to be commit 52a235650514039bf8ffee99a784bbc1b6ae6b92)
Diffstat (limited to 'source4')
44 files changed, 326 insertions, 396 deletions
diff --git a/source4/build/smb_build/config_mk.pm b/source4/build/smb_build/config_mk.pm index 1475ee09ee..c7ff8648eb 100644 --- a/source4/build/smb_build/config_mk.pm +++ b/source4/build/smb_build/config_mk.pm @@ -67,6 +67,8 @@ my $section_types = { "MAJOR_VERSION" => "string", "MINOR_VERSION" => "string", "RELEASE_VERSION" => "string", + + "INIT_FUNCTION_TYPE" => "string", "OBJ_FILES" => "list", diff --git a/source4/build/smb_build/header.pm b/source4/build/smb_build/header.pm index 456c29368a..1cc5361b65 100644 --- a/source4/build/smb_build/header.pm +++ b/source4/build/smb_build/header.pm @@ -30,13 +30,16 @@ sub _prepare_build_h($) my $DEFINE = (); next if ($key->{TYPE} ne "LIBRARY" and $key->{TYPE} ne "SUBSYSTEM"); next unless defined($key->{INIT_FUNCTIONS}); - + $DEFINE->{COMMENT} = "$key->{TYPE} $key->{NAME} INIT"; $DEFINE->{KEY} = "STATIC_$key->{NAME}_MODULES"; $DEFINE->{VAL} = "{ \\\n"; foreach (@{$key->{INIT_FUNCTIONS}}) { $DEFINE->{VAL} .= "\t$_, \\\n"; - $output .= "NTSTATUS $_(void);\n"; + my $fn = $key->{INIT_FUNCTION_TYPE}; + unless(defined($fn)) { $fn = "NTSTATUS (*) (void)"; } + $fn =~ s/\(\*\)/$_/; + $output .= "$fn;\n"; } $DEFINE->{VAL} .= "\tNULL \\\n }"; diff --git a/source4/build/smb_build/input.pm b/source4/build/smb_build/input.pm index c34930f39a..fbeeddcda1 100644 --- a/source4/build/smb_build/input.pm +++ b/source4/build/smb_build/input.pm @@ -97,6 +97,10 @@ sub check_library($$$) return; } + unless (defined($lib->{INIT_FUNCTION_TYPE})) { + $lib->{INIT_FUNCTION_TYPE} = "NTSTATUS (*) (void)"; + } + $lib->{INSTALLDIR} = "LIBDIR"; } diff --git a/source4/dsdb/samdb/ldb_modules/config.mk b/source4/dsdb/samdb/ldb_modules/config.mk index c53c7c1606..e14b9bfecf 100644 --- a/source4/dsdb/samdb/ldb_modules/config.mk +++ b/source4/dsdb/samdb/ldb_modules/config.mk @@ -2,6 +2,7 @@ # Start MODULE libldb_objectguid [MODULE::libldb_objectguid] SUBSYSTEM = LIBLDB +INIT_FUNCTION = objectguid_module_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ objectguid.o @@ -14,6 +15,7 @@ REQUIRED_SUBSYSTEMS = \ # Start MODULE libldb_samldb [MODULE::libldb_samldb] SUBSYSTEM = LIBLDB +INIT_FUNCTION = samldb_module_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ samldb.o @@ -26,6 +28,8 @@ REQUIRED_SUBSYSTEMS = SAMDB # Start MODULE libldb_samba3sam [MODULE::libldb_samba3sam] SUBSYSTEM = LIBLDB +INIT_FUNCTION = ldb_samba3sam_module_init +ENABLE = NO OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ samba3sam.o @@ -37,6 +41,7 @@ OBJ_FILES = \ # Start MODULE libldb_proxy [MODULE::libldb_proxy] SUBSYSTEM = LIBLDB +INIT_FUNCTION = proxy_module_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ proxy.o @@ -49,6 +54,7 @@ OBJ_FILES = \ # Start MODULE libldb_rootdse [MODULE::libldb_rootdse] SUBSYSTEM = LIBLDB +INIT_FUNCTION = rootdse_module_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ rootdse.o @@ -60,6 +66,7 @@ OBJ_FILES = \ # Start MODULE libldb_password_hash [MODULE::libldb_password_hash] SUBSYSTEM = LIBLDB +INIT_FUNCTION = password_hash_module_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ password_hash.o @@ -73,6 +80,7 @@ REQUIRED_SUBSYSTEMS = \ # Start MODULE libldb_cludge_acl [MODULE::libldb_kludge_acl] SUBSYSTEM = LIBLDB +INIT_FUNCTION = ldb_kludge_acl_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ kludge_acl.o @@ -86,6 +94,7 @@ REQUIRED_SUBSYSTEMS = \ # Start MODULE libldb_extended_dn [MODULE::libldb_extended_dn] SUBSYSTEM = LIBLDB +INIT_FUNCTION = ldb_extended_dn_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ extended_dn.o diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn.c b/source4/dsdb/samdb/ldb_modules/extended_dn.c index 9795758dc2..5b288aa311 100644 --- a/source4/dsdb/samdb/ldb_modules/extended_dn.c +++ b/source4/dsdb/samdb/ldb_modules/extended_dn.c @@ -269,7 +269,7 @@ static int extended_request(struct ldb_module *module, struct ldb_request *req) } } -static int extended_init_2(struct ldb_module *module) +static int extended_init(struct ldb_module *module) { struct ldb_request request; int ret; @@ -284,27 +284,16 @@ static int extended_init_2(struct ldb_module *module) return LDB_ERR_OTHER; } - return ldb_next_second_stage_init(module); + return ldb_next_init(module); } static const struct ldb_module_ops extended_dn_ops = { .name = "extended_dn", .request = extended_request, - .second_stage_init = extended_init_2 + .init_context = extended_init }; -struct ldb_module *extended_dn_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_extended_dn_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &extended_dn_ops; - ctx->private_data = NULL; - - return ctx; + return ldb_register_module(&extended_dn_ops); } diff --git a/source4/dsdb/samdb/ldb_modules/kludge_acl.c b/source4/dsdb/samdb/ldb_modules/kludge_acl.c index 9ce3217104..4c680df3e6 100644 --- a/source4/dsdb/samdb/ldb_modules/kludge_acl.c +++ b/source4/dsdb/samdb/ldb_modules/kludge_acl.c @@ -175,7 +175,7 @@ static int kludge_acl_request(struct ldb_module *module, struct ldb_request *req } } -static int kludge_acl_init_2(struct ldb_module *module) +static int kludge_acl_init(struct ldb_module *module) { int ret, i; TALLOC_CTX *mem_ctx = talloc_new(module); @@ -184,8 +184,15 @@ static int kludge_acl_init_2(struct ldb_module *module) struct ldb_message *msg; struct ldb_message_element *password_attributes; - struct kludge_private_data *data = talloc_get_type(module->private_data, struct kludge_private_data); + struct kludge_private_data *data; + + data = talloc(module, struct kludge_private_data); + if (data == NULL) { + return LDB_ERR_OPERATIONS_ERROR; + } + data->password_attrs = NULL; + module->private_data = data; if (!mem_ctx) { return LDB_ERR_OPERATIONS_ERROR; @@ -227,7 +234,7 @@ static int kludge_acl_init_2(struct ldb_module *module) done: talloc_free(mem_ctx); - return ldb_next_second_stage_init(module); + return ldb_next_init(module); } static const struct ldb_module_ops kludge_acl_ops = { @@ -236,30 +243,10 @@ static const struct ldb_module_ops kludge_acl_ops = { .start_transaction = kludge_acl_start_trans, .end_transaction = kludge_acl_end_trans, .del_transaction = kludge_acl_del_trans, - .second_stage_init = kludge_acl_init_2 + .init_context = kludge_acl_init }; -struct ldb_module *kludge_acl_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_kludge_acl_init(void) { - struct ldb_module *ctx; - struct kludge_private_data *data; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - data = talloc(ctx, struct kludge_private_data); - if (data == NULL) { - talloc_free(ctx); - return NULL; - } - - data->password_attrs = NULL; - ctx->private_data = data; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &kludge_acl_ops; - - return ctx; + return ldb_register_module(&kludge_acl_ops); } diff --git a/source4/dsdb/samdb/ldb_modules/objectguid.c b/source4/dsdb/samdb/ldb_modules/objectguid.c index c9063af6ef..7169aa6842 100644 --- a/source4/dsdb/samdb/ldb_modules/objectguid.c +++ b/source4/dsdb/samdb/ldb_modules/objectguid.c @@ -127,19 +127,7 @@ static const struct ldb_module_ops objectguid_ops = { }; -/* the init function */ -struct ldb_module *objectguid_module_init(struct ldb_context *ldb, const char *options[]) +int objectguid_module_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &objectguid_ops; - - return ctx; + return ldb_register_module(&objectguid_ops); } diff --git a/source4/dsdb/samdb/ldb_modules/password_hash.c b/source4/dsdb/samdb/ldb_modules/password_hash.c index e28c85ae37..414f79ea10 100644 --- a/source4/dsdb/samdb/ldb_modules/password_hash.c +++ b/source4/dsdb/samdb/ldb_modules/password_hash.c @@ -731,19 +731,7 @@ static const struct ldb_module_ops password_hash_ops = { }; -/* the init function */ -struct ldb_module *password_hash_module_init(struct ldb_context *ldb, const char *options[]) +int password_hash_module_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &password_hash_ops; - - return ctx; + return ldb_register_module(&password_hash_ops); } diff --git a/source4/dsdb/samdb/ldb_modules/proxy.c b/source4/dsdb/samdb/ldb_modules/proxy.c index 511f9aeec5..85b40b62d1 100644 --- a/source4/dsdb/samdb/ldb_modules/proxy.c +++ b/source4/dsdb/samdb/ldb_modules/proxy.c @@ -333,22 +333,7 @@ static const struct ldb_module_ops proxy_ops = { .request = proxy_request }; -struct ldb_module *proxy_module_init(struct ldb_context *ldb, const char *options[]) +int proxy_module_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &proxy_ops; - - ctx->private_data = talloc_zero(ctx, struct proxy_data); - if (ctx->private_data == NULL) { - return NULL; - } - - return ctx; + return ldb_register_module(&proxy_ops); } diff --git a/source4/dsdb/samdb/ldb_modules/rootdse.c b/source4/dsdb/samdb/ldb_modules/rootdse.c index 987fd7a7f1..69b1648040 100644 --- a/source4/dsdb/samdb/ldb_modules/rootdse.c +++ b/source4/dsdb/samdb/ldb_modules/rootdse.c @@ -199,34 +199,30 @@ static int rootdse_request(struct ldb_module *module, struct ldb_request *req) return ldb_next_request(module, req); } -static const struct ldb_module_ops rootdse_ops = { - .name = "rootdse", - .request = rootdse_request -}; - -struct ldb_module *rootdse_module_init(struct ldb_context *ldb, const char *options[]) +static int rootdse_init(struct ldb_module *module) { - struct ldb_module *ctx; struct private_data *data; - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - data = talloc(ctx, struct private_data); + data = talloc(module, struct private_data); if (data == NULL) { - talloc_free(ctx); - return NULL; + return -1; } data->num_controls = 0; data->controls = NULL; - ctx->private_data = data; + module->private_data = data; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &rootdse_ops; + return ldb_next_init(module); +} - return ctx; +static const struct ldb_module_ops rootdse_ops = { + .name = "rootdse", + .init_context = rootdse_init, + .request = rootdse_request +}; + +int rootdse_module_init(void) +{ + return ldb_register_module(&rootdse_ops); } diff --git a/source4/dsdb/samdb/ldb_modules/samba3sam.c b/source4/dsdb/samdb/ldb_modules/samba3sam.c index 3f593235fa..06774780a1 100644 --- a/source4/dsdb/samdb/ldb_modules/samba3sam.c +++ b/source4/dsdb/samdb/ldb_modules/samba3sam.c @@ -855,8 +855,8 @@ const struct ldb_map_attribute samba3_attributes[] = } }; - /* the init function */ -struct ldb_module *ldb_samba3sam_module_init(struct ldb_context *ldb, const char *options[]) +/* the init function */ +int ldb_samba3sam_module_init(void) { return ldb_map_init(ldb, samba3_attributes, samba3_objectclasses, "samba3sam"); } diff --git a/source4/dsdb/samdb/ldb_modules/samldb.c b/source4/dsdb/samdb/ldb_modules/samldb.c index a582127bbe..3355df4e23 100644 --- a/source4/dsdb/samdb/ldb_modules/samldb.c +++ b/source4/dsdb/samdb/ldb_modules/samldb.c @@ -819,27 +819,20 @@ static int samldb_request(struct ldb_module *module, struct ldb_request *req) } } +static int samldb_init(struct ldb_module *module) +{ + talloc_set_destructor(module, samldb_destructor); + return ldb_next_init(module); +} + static const struct ldb_module_ops samldb_ops = { .name = "samldb", + .init_context = samldb_init, .request = samldb_request }; -/* the init function */ -struct ldb_module *samldb_module_init(struct ldb_context *ldb, const char *options[]) +int samldb_module_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &samldb_ops; - - talloc_set_destructor(ctx, samldb_destructor); - - return ctx; + return ldb_register_module(&samldb_ops); } diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c index a9a4b06645..b919894d69 100644 --- a/source4/ldap_server/ldap_server.c +++ b/source4/ldap_server/ldap_server.c @@ -545,6 +545,8 @@ static void ldapsrv_task_init(struct task_server *task) struct ldapsrv_service *ldap_service; NTSTATUS status; + ldb_global_init(); + ldap_service = talloc_zero(task, struct ldapsrv_service); if (ldap_service == NULL) goto failed; diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c index 87705a855a..28bed0b0ea 100644 --- a/source4/lib/ldb/common/ldb.c +++ b/source4/lib/ldb/common/ldb.c @@ -129,19 +129,6 @@ void ldb_reset_err_string(struct ldb_context *ldb) } while (0) /* - second stage init all modules loaded -*/ -int ldb_second_stage_init(struct ldb_context *ldb) -{ - struct ldb_module *module; - - FIRST_OP(ldb, second_stage_init); - - return module->ops->second_stage_init(module); -} - - -/* start a transaction */ int ldb_transaction_start(struct ldb_context *ldb) diff --git a/source4/lib/ldb/common/ldb_modules.c b/source4/lib/ldb/common/ldb_modules.c index 922506ea4d..f1b4783fca 100644 --- a/source4/lib/ldb/common/ldb_modules.c +++ b/source4/lib/ldb/common/ldb_modules.c @@ -67,7 +67,7 @@ static char *talloc_strdup_no_spaces(struct ldb_context *ldb, const char *string /* modules are called in inverse order on the stack. Lets place them as an admin would think the right order is. - Modules order is imprtant */ + Modules order is important */ static char **ldb_modules_list_from_string(struct ldb_context *ldb, const char *string) { char **modules = NULL; @@ -109,35 +109,79 @@ static char **ldb_modules_list_from_string(struct ldb_context *ldb, const char * return modules; } +static struct ops_list_entry { + const struct ldb_module_ops *ops; + struct ops_list_entry *next; +} *registered_modules = NULL; + +static const struct ldb_module_ops *ldb_find_module_ops(const char *name) +{ + struct ops_list_entry *e; + + for (e = registered_modules; e; e = e->next) { + if (strcmp(e->ops->name, name) == 0) + return e->ops; + } + + return NULL; +} + + +#ifndef STATIC_LIBLDB_MODULES +#define STATIC_LIBLDB_MODULES \ + { \ + ldb_schema_init, \ + ldb_operational_init, \ + ldb_rdn_name_init, \ + ldb_objectclass_init, \ + ldb_paged_results_init, \ + ldb_sort_init, \ + NULL \ + } +#endif + +int ldb_global_init(void) +{ + static int (*static_init_fns[])(void) = STATIC_LIBLDB_MODULES; + + static int initialized = 0; + int ret = 0, i; + + if (initialized) + return 0; + + initialized = 1; + + for (i = 0; static_init_fns[i]; i++) { + if (static_init_fns[i]() == -1) + ret = -1; + } + + return ret; +} + +int ldb_register_module(const struct ldb_module_ops *ops) +{ + struct ops_list_entry *entry = talloc(talloc_autofree_context(), struct ops_list_entry); + + if (ldb_find_module_ops(ops->name) != NULL) + return -1; + + if (entry == NULL) + return -1; + + entry->ops = ops; + entry->next = registered_modules; + registered_modules = entry; + + return 0; +} + int ldb_load_modules(struct ldb_context *ldb, const char *options[]) { char **modules = NULL; + struct ldb_module *module; int i; - const struct { - const char *name; - ldb_module_init_t init; - } well_known_modules[] = { - { "schema", schema_module_init }, - { "operational", operational_module_init }, - { "rdn_name", rdn_name_module_init }, - { "objectclass", objectclass_module_init }, - { "paged_results", paged_results_module_init }, - { "server_sort", server_sort_module_init }, - { "asq", asq_module_init }, -#ifdef _SAMBA_BUILD_ - { "objectguid", objectguid_module_init }, - { "samldb", samldb_module_init }, - { "samba3sam", ldb_samba3sam_module_init }, - { "proxy", proxy_module_init }, - { "rootdse", rootdse_module_init }, - { "extended_dn", extended_dn_module_init }, - { "password_hash", password_hash_module_init }, - { "kludge_acl", kludge_acl_module_init }, - { "wins_ldb", wins_ldb_module_init }, -#endif - { NULL, NULL } - }; - /* find out which modules we are requested to activate */ /* check if we have a custom module list passd as ldb option */ @@ -149,7 +193,7 @@ int ldb_load_modules(struct ldb_context *ldb, const char *options[]) } } - /* if not overloaded by options and the backend is not ldap try to load the modules list form ldb */ + /* if not overloaded by options and the backend is not ldap try to load the modules list from ldb */ if ((modules == NULL) && (strcmp("ldap", ldb->modules->ops->name) != 0)) { int ret; const char * const attrs[] = { "@LIST" , NULL}; @@ -191,27 +235,34 @@ int ldb_load_modules(struct ldb_context *ldb, const char *options[]) for (i = 0; modules[i] != NULL; i++) { struct ldb_module *current; - int m; - for (m=0;well_known_modules[m].name;m++) { - if (strcmp(modules[i], well_known_modules[m].name) == 0) { - current = well_known_modules[m].init(ldb, options); - if (current == NULL) { - ldb_debug(ldb, LDB_DEBUG_FATAL, "function 'init_module' in %s fails\n", modules[i]); - return -1; - } - DLIST_ADD(ldb->modules, current); - break; - } - } - if (well_known_modules[m].name == NULL) { + const struct ldb_module_ops *ops; + + ops = ldb_find_module_ops(modules[i]); + if (ops == NULL) { ldb_debug(ldb, LDB_DEBUG_WARNING, "WARNING: Module [%s] not found\n", modules[i]); + continue; } + + current = talloc_zero(ldb, struct ldb_module); + if (current == NULL) { + return -1; + } + + current->ldb = ldb; + current->ops = ops; + + DLIST_ADD(ldb->modules, current); } - /* second stage init */ - if (ldb_second_stage_init(ldb) != LDB_SUCCESS) { - ldb_debug(ldb, LDB_DEBUG_ERROR, "ERROR: Second stage init failed!\n"); + module = ldb->modules; + + while (module && module->ops->init_context == NULL) + module = module->next; + + if (module && module->ops->init_context && + module->ops->init_context(module) != LDB_SUCCESS) { + ldb_debug(ldb, LDB_DEBUG_FATAL, "module initialization failed\n"); return -1; } @@ -240,10 +291,20 @@ int ldb_next_request(struct ldb_module *module, struct ldb_request *request) return module->ops->request(module, request); } -int ldb_next_second_stage_init(struct ldb_module *module) +int ldb_next_init(struct ldb_module *module) { - FIND_OP(module, second_stage_init); - return module->ops->second_stage_init(module); + /* init is different in that it is not an error if modules + * do not require initialization */ + + module = module->next; + + while (module && module->ops->init_context == NULL) + module = module->next; + + if (module == NULL) + return LDB_SUCCESS; + + return module->ops->init_context(module); } int ldb_next_start_trans(struct ldb_module *module) diff --git a/source4/lib/ldb/config.mk b/source4/lib/ldb/config.mk index 16f4001acd..82b98fa123 100644 --- a/source4/lib/ldb/config.mk +++ b/source4/lib/ldb/config.mk @@ -1,6 +1,7 @@ ################################################ # Start MODULE libldb_asq [MODULE::libldb_asq] +INIT_FUNCTION = ldb_asq_init SUBSYSTEM = LIBLDB OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ @@ -11,6 +12,7 @@ OBJ_FILES = \ ################################################ # Start MODULE libldb_sort [MODULE::libldb_sort] +INIT_FUNCTION = ldb_sort_init SUBSYSTEM = LIBLDB OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ @@ -21,6 +23,7 @@ OBJ_FILES = \ ################################################ # Start MODULE libldb_paged_results [MODULE::libldb_paged_results] +INIT_FUNCTION = ldb_paged_results_init SUBSYSTEM = LIBLDB OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ @@ -32,6 +35,7 @@ OBJ_FILES = \ # Start MODULE libldb_operational [MODULE::libldb_operational] SUBSYSTEM = LIBLDB +INIT_FUNCTION = ldb_operational_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ modules/operational.o @@ -41,6 +45,7 @@ OBJ_FILES = \ ################################################ # Start MODULE libldb_objectclass [MODULE::libldb_objectclass] +INIT_FUNCTION = ldb_objectclass_init SUBSYSTEM = LIBLDB OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ @@ -52,6 +57,7 @@ OBJ_FILES = \ # Start MODULE libldb_rdn_name [MODULE::libldb_rdn_name] SUBSYSTEM = LIBLDB +INIT_FUNCTION = ldb_rdn_name_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ modules/rdn_name.o @@ -61,6 +67,7 @@ OBJ_FILES = \ ################################################ # Start MODULE libldb_schema [MODULE::libldb_schema] +INIT_FUNCTION = ldb_schema_init SUBSYSTEM = LIBLDB OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ @@ -94,6 +101,7 @@ OBJ_FILES = modules/ldb_map.o # Start MODULE libldb_skel [MODULE::libldb_skel] SUBSYSTEM = LIBLDB +INIT_FUNCTION = ldb_skel_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = modules/skel.o # End MODULE libldb_skel @@ -136,6 +144,7 @@ NOPROTO = YES MAJOR_VERSION = 0 MINOR_VERSION = 0 DESCRIPTION = LDAP-like embedded database library +INIT_FUNCTION_TYPE = int (*) (void) RELEASE_VERSION = 1 OBJ_FILES = \ common/ldb.o \ diff --git a/source4/lib/ldb/include/includes.h b/source4/lib/ldb/include/includes.h index 15eb18a5e8..b10f329a2d 100644 --- a/source4/lib/ldb/include/includes.h +++ b/source4/lib/ldb/include/includes.h @@ -10,6 +10,8 @@ #include "system/iconv.h" #include "system/time.h" +#include "build.h" + #else /*_SAMBA_BUILD_*/ #ifndef _GNU_SOURCE diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h index f5bca965ad..13e69282ca 100644 --- a/source4/lib/ldb/include/ldb.h +++ b/source4/lib/ldb/include/ldb.h @@ -666,6 +666,15 @@ int ldb_request(struct ldb_context *ldb, struct ldb_request *request); int ldb_async_wait(struct ldb_context *ldb, struct ldb_async_handle *handle, enum ldb_async_wait_type type); /** + Initialise ldbs' global information + + This is required before any other LDB call + + \return 0 if initialisation succeeded, -1 otherwise +*/ +int ldb_global_init(void); + +/** Initialise an ldb context This is required before any other LDB call. diff --git a/source4/lib/ldb/include/ldb_private.h b/source4/lib/ldb/include/ldb_private.h index 3f9be357a7..d4cba9797c 100644 --- a/source4/lib/ldb/include/ldb_private.h +++ b/source4/lib/ldb/include/ldb_private.h @@ -56,11 +56,11 @@ struct ldb_module { */ struct ldb_module_ops { const char *name; + int (*init_context) (struct ldb_module *); int (*request)(struct ldb_module *, struct ldb_request *); int (*start_transaction)(struct ldb_module *); int (*end_transaction)(struct ldb_module *); int (*del_transaction)(struct ldb_module *); - int (*second_stage_init)(struct ldb_module *); }; @@ -112,9 +112,6 @@ struct ldb_context { uint64_t (*sequence_number)(struct ldb_context *); }; -/* the modules init function */ -typedef struct ldb_module *(*ldb_module_init_t)(struct ldb_context *, const char **); - #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) #endif @@ -124,9 +121,6 @@ typedef struct ldb_module *(*ldb_module_init_t)(struct ldb_context *, const char */ #define ldb_oom(ldb) ldb_debug_set(ldb, LDB_DEBUG_FATAL, "ldb out of memory at %s:%d\n", __FILE__, __LINE__) -/* The following definitions come from lib/ldb/common/ldb.c */ -int ldb_second_stage_init(struct ldb_context *ldb); - /* The following definitions come from lib/ldb/common/ldb_modules.c */ int ldb_load_modules(struct ldb_context *ldb, const char *options[]); @@ -134,11 +128,13 @@ int ldb_next_request(struct ldb_module *module, struct ldb_request *request); int ldb_next_start_trans(struct ldb_module *module); int ldb_next_end_trans(struct ldb_module *module); int ldb_next_del_trans(struct ldb_module *module); -int ldb_next_second_stage_init(struct ldb_module *module); +int ldb_next_init(struct ldb_module *module); void ldb_set_errstring(struct ldb_context *ldb, char *err_string); void ldb_reset_err_string(struct ldb_context *ldb); +int ldb_register_module(const struct ldb_module_ops *); + /* The following definitions come from lib/ldb/common/ldb_debug.c */ void ldb_debug(struct ldb_context *ldb, enum ldb_debug_level level, const char *fmt, ...) PRINTF_ATTRIBUTE(3, 4); void ldb_debug_set(struct ldb_context *ldb, enum ldb_debug_level level, @@ -161,14 +157,13 @@ int lsqlite3_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]); -struct ldb_module *objectclass_module_init(struct ldb_context *ldb, const char *options[]); -struct ldb_module *operational_module_init(struct ldb_context *ldb, const char *options[]); -struct ldb_module *paged_results_module_init(struct ldb_context *ldb, const char *options[]); -struct ldb_module *rdn_name_module_init(struct ldb_context *ldb, const char *options[]); -struct ldb_module *schema_module_init(struct ldb_context *ldb, const char *options[]); -struct ldb_module *server_sort_module_init(struct ldb_context *ldb, const char *options[]); -struct ldb_module *asq_module_init(struct ldb_context *ldb, const char *options[]); +int ldb_objectclass_init(void); +int ldb_operational_init(void); +int ldb_paged_results_init(void); +int ldb_rdn_name_init(void); +int ldb_schema_init(void); +int ldb_sort_init(void); int ldb_match_msg(struct ldb_context *ldb, struct ldb_message *msg, diff --git a/source4/lib/ldb/ldb_ildap/ldb_ildap.c b/source4/lib/ldb/ldb_ildap/ldb_ildap.c index a5f4ab67fd..69053cc110 100644 --- a/source4/lib/ldb/ldb_ildap/ldb_ildap.c +++ b/source4/lib/ldb/ldb_ildap/ldb_ildap.c @@ -898,7 +898,6 @@ static int ildb_request(struct ldb_module *module, struct ldb_request *req) } } - static int ildb_async_wait(struct ldb_async_handle *handle, enum ldb_async_wait_type type) { struct ildb_async_context *ac = talloc_get_type(handle->private_data, struct ildb_async_context); @@ -939,7 +938,7 @@ static int ildb_async_wait(struct ldb_async_handle *handle, enum ldb_async_wait_ /* fetch the rootDSE for later use */ -static int ildb_init_2(struct ldb_module *module) +static int ildb_init(struct ldb_module *module) { struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldb_result *res = NULL; @@ -963,7 +962,7 @@ static const struct ldb_module_ops ildb_ops = { .start_transaction = ildb_start_trans, .end_transaction = ildb_end_trans, .del_transaction = ildb_del_trans, - .second_stage_init = ildb_init_2 + .init_context = ildb_init }; /* diff --git a/source4/lib/ldb/ldb_ldap/ldb_ldap.c b/source4/lib/ldb/ldb_ldap/ldb_ldap.c index 167bbfbd63..4f840868a1 100644 --- a/source4/lib/ldb/ldb_ldap/ldb_ldap.c +++ b/source4/lib/ldb/ldb_ldap/ldb_ldap.c @@ -1006,18 +1006,12 @@ static int lldb_request(struct ldb_module *module, struct ldb_request *req) } } -static int lldb_init_2(struct ldb_module *module) -{ - return LDB_SUCCESS; -} - static const struct ldb_module_ops lldb_ops = { .name = "ldap", .request = lldb_request, .start_transaction = lldb_start_trans, .end_transaction = lldb_end_trans, .del_transaction = lldb_del_trans, - .second_stage_init = lldb_init_2 }; diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c index b58b03f221..7cf6138b12 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.c @@ -797,18 +797,12 @@ static uint64_t ltdb_sequence_number(struct ldb_context *ldb) return seq_num; } -static int ltdb_init_2(struct ldb_module *module) -{ - return LDB_SUCCESS; -} - static const struct ldb_module_ops ltdb_ops = { .name = "tdb", .request = ltdb_request, .start_transaction = ltdb_start_trans, .end_transaction = ltdb_end_trans, - .del_transaction = ltdb_del_trans, - .second_stage_init = ltdb_init_2 + .del_transaction = ltdb_del_trans }; diff --git a/source4/lib/ldb/modules/asq.c b/source4/lib/ldb/modules/asq.c index 2975f4d832..33ba9bed04 100644 --- a/source4/lib/ldb/modules/asq.c +++ b/source4/lib/ldb/modules/asq.c @@ -210,7 +210,7 @@ static int asq(struct ldb_module *module, struct ldb_request *req) } } -static int asq_init_2(struct ldb_module *module) +static int asq_init(struct ldb_module *module) { struct ldb_request request; int ret; @@ -225,28 +225,17 @@ static int asq_init_2(struct ldb_module *module) return LDB_ERR_OTHER; } - return ldb_next_second_stage_init(module); + return ldb_next_init(module); } static const struct ldb_module_ops asq_ops = { .name = "asq", .request = asq, - .second_stage_init = asq_init_2 + .init_context = asq_init }; -struct ldb_module *asq_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_asq_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &asq_ops; - ctx->private_data = NULL; - - return ctx; + return ldb_register_module(&asq_ops); } diff --git a/source4/lib/ldb/modules/objectclass.c b/source4/lib/ldb/modules/objectclass.c index 8b4ad598cc..a9c51341a8 100644 --- a/source4/lib/ldb/modules/objectclass.c +++ b/source4/lib/ldb/modules/objectclass.c @@ -302,19 +302,7 @@ static const struct ldb_module_ops objectclass_ops = { .request = objectclass_request, }; -struct ldb_module *objectclass_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_objectclass_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->private_data = NULL; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &objectclass_ops; - - return ctx; + return ldb_register_module(&objectclass_ops); } diff --git a/source4/lib/ldb/modules/operational.c b/source4/lib/ldb/modules/operational.c index 51f0ce25e4..441c899a58 100644 --- a/source4/lib/ldb/modules/operational.c +++ b/source4/lib/ldb/modules/operational.c @@ -400,31 +400,24 @@ static int operational_request(struct ldb_module *module, struct ldb_request *re } } +static int operational_init(struct ldb_module *ctx) +{ + /* setup some standard attribute handlers */ + ldb_set_attrib_handler_syntax(ctx->ldb, "whenCreated", LDB_SYNTAX_UTC_TIME); + ldb_set_attrib_handler_syntax(ctx->ldb, "whenChanged", LDB_SYNTAX_UTC_TIME); + ldb_set_attrib_handler_syntax(ctx->ldb, "subschemaSubentry", LDB_SYNTAX_DN); + ldb_set_attrib_handler_syntax(ctx->ldb, "structuralObjectClass", LDB_SYNTAX_OBJECTCLASS); + + return ldb_next_init(ctx); +} + static const struct ldb_module_ops operational_ops = { .name = "operational", - .request = operational_request + .request = operational_request, + .init_context = operational_init }; - -/* the init function */ -struct ldb_module *operational_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_operational_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &operational_ops; - - /* setup some standard attribute handlers */ - ldb_set_attrib_handler_syntax(ldb, "whenCreated", LDB_SYNTAX_UTC_TIME); - ldb_set_attrib_handler_syntax(ldb, "whenChanged", LDB_SYNTAX_UTC_TIME); - ldb_set_attrib_handler_syntax(ldb, "subschemaSubentry", LDB_SYNTAX_DN); - ldb_set_attrib_handler_syntax(ldb, "structuralObjectClass", LDB_SYNTAX_OBJECTCLASS); - - return ctx; + return ldb_register_module(&operational_ops); } diff --git a/source4/lib/ldb/modules/paged_results.c b/source4/lib/ldb/modules/paged_results.c index c4aad4500e..9d6a50e27f 100644 --- a/source4/lib/ldb/modules/paged_results.c +++ b/source4/lib/ldb/modules/paged_results.c @@ -247,10 +247,20 @@ static int paged_request(struct ldb_module *module, struct ldb_request *req) } } -static int paged_request_init_2(struct ldb_module *module) +static int paged_request_init(struct ldb_module *module) { struct ldb_request request; int ret; + struct private_data *data; + + data = talloc(module, struct private_data); + if (data == NULL) { + return LDB_ERR_OTHER; + } + + data->next_free_id = 1; + data->store = NULL; + module->private_data = data; request.operation = LDB_REQ_REGISTER; request.op.reg.oid = LDB_CONTROL_PAGED_RESULTS_OID; @@ -262,37 +272,17 @@ static int paged_request_init_2(struct ldb_module *module) return LDB_ERR_OTHER; } - return ldb_next_second_stage_init(module); + return ldb_next_init(module); } static const struct ldb_module_ops paged_ops = { - .name = "paged_results", - .request = paged_request, - .second_stage_init = paged_request_init_2 + .name = "paged_results", + .request = paged_request, + .init_context = paged_request_init }; -struct ldb_module *paged_results_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_paged_results_init(void) { - struct ldb_module *ctx; - struct private_data *data; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - data = talloc(ctx, struct private_data); - if (data == NULL) { - talloc_free(ctx); - return NULL; - } - - data->next_free_id = 1; - data->store = NULL; - ctx->private_data = data; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &paged_ops; - - return ctx; + return ldb_register_module(&paged_ops); } + diff --git a/source4/lib/ldb/modules/rdn_name.c b/source4/lib/ldb/modules/rdn_name.c index 2e4e250755..59930046ce 100644 --- a/source4/lib/ldb/modules/rdn_name.c +++ b/source4/lib/ldb/modules/rdn_name.c @@ -211,19 +211,7 @@ static const struct ldb_module_ops rdn_name_ops = { }; -/* the init function */ -struct ldb_module *rdn_name_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_rdn_name_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &rdn_name_ops; - - return ctx; + return ldb_register_module(&rdn_name_ops); } diff --git a/source4/lib/ldb/modules/schema.c b/source4/lib/ldb/modules/schema.c index 9bf9a4d2c5..73b07023da 100644 --- a/source4/lib/ldb/modules/schema.c +++ b/source4/lib/ldb/modules/schema.c @@ -482,19 +482,7 @@ static const struct ldb_module_ops schema_ops = { .request = schema_request }; -struct ldb_module *schema_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_schema_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) { - return NULL; - } - - ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &schema_ops; - - return ctx; + return ldb_register_module(&schema_ops); } diff --git a/source4/lib/ldb/modules/skel.c b/source4/lib/ldb/modules/skel.c index e9b76be2ba..0089433b37 100644 --- a/source4/lib/ldb/modules/skel.c +++ b/source4/lib/ldb/modules/skel.c @@ -122,45 +122,33 @@ static int skel_request(struct ldb_module *module, struct ldb_request *req) } } -static int skel_init_2(struct ldb_module *module) +static int skel_init(struct ldb_module *ctx) { - /* second stage init stuff */ - /* see control modules as example */ - return ldb_next_second_stage_init(module); -} - -static const struct ldb_module_ops skel_ops = { - .name = "skel", - .request = skel_request, - .start_transaction = skel_start_trans, - .end_transaction = skel_end_trans, - .del_transaction = skel_del_trans, - .second_stage_init = skel_init_2 -}; - -struct ldb_module *skel_module_init(struct ldb_context *ldb, const char *options[]) -{ - struct ldb_module *ctx; struct private_data *data; - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - data = talloc(ctx, struct private_data); if (data == NULL) { - talloc_free(ctx); - return NULL; + return 1; } data->some_private_data = NULL; ctx->private_data = data; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &skel_ops; - talloc_set_destructor (ctx, skel_destructor); - return ctx; + return ldb_next_init(ctx); +} + +static const struct ldb_module_ops skel_ops = { + .name = "skel", + .init_context = skel_init, + .request = skel_request, + .start_transaction = skel_start_trans, + .end_transaction = skel_end_trans, + .del_transaction = skel_del_trans, +}; + +int ldb_skel_init(void) +{ + return ldb_register_module(&skel_ops); } diff --git a/source4/lib/ldb/modules/sort.c b/source4/lib/ldb/modules/sort.c index ac9f1081de..d01e468956 100644 --- a/source4/lib/ldb/modules/sort.c +++ b/source4/lib/ldb/modules/sort.c @@ -228,7 +228,7 @@ static int server_sort(struct ldb_module *module, struct ldb_request *req) } } -static int server_sort_init_2(struct ldb_module *module) +static int server_sort_init(struct ldb_module *module) { struct ldb_request request; int ret; @@ -243,27 +243,16 @@ static int server_sort_init_2(struct ldb_module *module) return LDB_ERR_OTHER; } - return ldb_next_second_stage_init(module); + return ldb_next_init(module); } static const struct ldb_module_ops server_sort_ops = { .name = "server_sort", .request = server_sort, - .second_stage_init = server_sort_init_2 + .init_context = server_sort_init }; -struct ldb_module *server_sort_module_init(struct ldb_context *ldb, const char *options[]) +int ldb_sort_init(void) { - struct ldb_module *ctx; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) - return NULL; - - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &server_sort_ops; - ctx->private_data = NULL; - - return ctx; + return ldb_register_module(&server_sort_ops); } diff --git a/source4/lib/ldb/tools/cmdline.c b/source4/lib/ldb/tools/cmdline.c index a67c41e67f..8f803c5118 100644 --- a/source4/lib/ldb/tools/cmdline.c +++ b/source4/lib/ldb/tools/cmdline.c @@ -71,6 +71,8 @@ struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb, int argc, const POPT_TABLEEND }; + ldb_global_init(); + #ifdef _SAMBA_BUILD_ r = ldb_register_samba_handlers(ldb); if (r != 0) { diff --git a/source4/lib/ldb/tools/ldbadd.c b/source4/lib/ldb/tools/ldbadd.c index 0d5acd3787..6a0f510244 100644 --- a/source4/lib/ldb/tools/ldbadd.c +++ b/source4/lib/ldb/tools/ldbadd.c @@ -84,12 +84,14 @@ static int process_file(struct ldb_context *ldb, FILE *f) - int main(int argc, const char **argv) +int main(int argc, const char **argv) { struct ldb_context *ldb; int i, count=0; struct ldb_cmdline *options; + ldb_global_init(); + ldb = ldb_init(NULL); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/ldbdel.c b/source4/lib/ldb/tools/ldbdel.c index 26544d8a9e..749ce3f91c 100644 --- a/source4/lib/ldb/tools/ldbdel.c +++ b/source4/lib/ldb/tools/ldbdel.c @@ -79,6 +79,8 @@ static void usage(void) int ret, i; struct ldb_cmdline *options; + ldb_global_init(); + ldb = ldb_init(NULL); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/ldbedit.c b/source4/lib/ldb/tools/ldbedit.c index 9cef81f1db..b4e2b0a848 100644 --- a/source4/lib/ldb/tools/ldbedit.c +++ b/source4/lib/ldb/tools/ldbedit.c @@ -281,6 +281,8 @@ static void usage(void) const char *expression = "(|(objectClass=*)(distinguishedName=*))"; const char * const * attrs = NULL; + ldb_global_init(); + ldb = ldb_init(NULL); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/ldbmodify.c b/source4/lib/ldb/tools/ldbmodify.c index e785a42a23..4ce49c2ce8 100644 --- a/source4/lib/ldb/tools/ldbmodify.c +++ b/source4/lib/ldb/tools/ldbmodify.c @@ -91,6 +91,8 @@ static int process_file(struct ldb_context *ldb, FILE *f) int i; struct ldb_cmdline *options; + ldb_global_init(); + ldb = ldb_init(NULL); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/ldbrename.c b/source4/lib/ldb/tools/ldbrename.c index 9c37744277..3229426875 100644 --- a/source4/lib/ldb/tools/ldbrename.c +++ b/source4/lib/ldb/tools/ldbrename.c @@ -58,6 +58,8 @@ static void usage(void) struct ldb_cmdline *options; const struct ldb_dn *dn1, *dn2; + ldb_global_init(); + ldb = ldb_init(NULL); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/ldbsearch.c b/source4/lib/ldb/tools/ldbsearch.c index c380862c5d..fbf32c0777 100644 --- a/source4/lib/ldb/tools/ldbsearch.c +++ b/source4/lib/ldb/tools/ldbsearch.c @@ -148,7 +148,7 @@ static int do_search(struct ldb_context *ldb, return 0; } - int main(int argc, const char **argv) +int main(int argc, const char **argv) { struct ldb_context *ldb; struct ldb_dn *basedn = NULL; @@ -157,6 +157,8 @@ static int do_search(struct ldb_context *ldb, int ret = -1; const char *expression = "(|(objectClass=*)(distinguishedName=*))"; + ldb_global_init(); + ldb = ldb_init(NULL); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/ldbtest.c b/source4/lib/ldb/tools/ldbtest.c index 69362d0f20..5fd75a0cab 100644 --- a/source4/lib/ldb/tools/ldbtest.c +++ b/source4/lib/ldb/tools/ldbtest.c @@ -376,6 +376,8 @@ static void usage(void) TALLOC_CTX *mem_ctx = talloc_new(NULL); struct ldb_context *ldb; + ldb_global_init(); + ldb = ldb_init(mem_ctx); options = ldb_cmdline_process(ldb, argc, argv, usage); diff --git a/source4/lib/ldb/tools/oLschema2ldif.c b/source4/lib/ldb/tools/oLschema2ldif.c index b4fe421161..288cf4c3c3 100644 --- a/source4/lib/ldb/tools/oLschema2ldif.c +++ b/source4/lib/ldb/tools/oLschema2ldif.c @@ -583,6 +583,8 @@ static void usage(void) FILE *in = stdin; FILE *out = stdout; + ldb_global_init(); + ctx = talloc_new(NULL); ldb_ctx = ldb_init(ctx); diff --git a/source4/nbt_server/config.mk b/source4/nbt_server/config.mk index 4d5f90e9fb..94c3e9efce 100644 --- a/source4/nbt_server/config.mk +++ b/source4/nbt_server/config.mk @@ -16,6 +16,7 @@ REQUIRED_SUBSYSTEMS = \ # Start MODULE libldb_wins_ldb [MODULE::libldb_wins_ldb] SUBSYSTEM = LIBLDB +INIT_FUNCTION = wins_ldb_module_init OUTPUT_TYPE = MERGEDOBJ OBJ_FILES = \ wins/wins_ldb.o diff --git a/source4/nbt_server/wins/wins_ldb.c b/source4/nbt_server/wins/wins_ldb.c index d348c3231f..5efe6bd3ab 100644 --- a/source4/nbt_server/wins/wins_ldb.c +++ b/source4/nbt_server/wins/wins_ldb.c @@ -89,27 +89,12 @@ call_next: return ldb_next_request(module, req); } -static const struct ldb_module_ops wins_ldb_ops = { - .name = "wins_ldb", - .request = wins_ldb_request -}; - - -/* the init function */ -struct ldb_module *wins_ldb_module_init(struct ldb_context *ldb, const char *options[]) +static int wins_ldb_init(struct ldb_module *ctx) { - struct ldb_module *ctx; struct winsdb_handle *h; const char *owner; - int ret; - - ctx = talloc(ldb, struct ldb_module); - if (!ctx) return NULL; ctx->private_data = NULL; - ctx->ldb = ldb; - ctx->prev = ctx->next = NULL; - ctx->ops = &wins_ldb_ops; owner = lp_parm_string(-1, "winsdb", "local_owner"); if (!owner) { @@ -121,17 +106,27 @@ struct ldb_module *wins_ldb_module_init(struct ldb_context *ldb, const char *opt h = talloc(ctx, struct winsdb_handle); if (!h) goto failed; - h->ldb = ldb; + h->ldb = ctx->ldb; h->caller = WINSDB_HANDLE_CALLER_ADMIN; h->local_owner = talloc_strdup(h, owner); if (!h->local_owner) goto failed; - ret = ldb_set_opaque(ldb, "winsdb_handle", h); - if (ret != LDB_SUCCESS) goto failed; - - return ctx; + return ldb_set_opaque(ctx->ldb, "winsdb_handle", h); failed: - talloc_free(ctx); - return NULL; + talloc_free(h); + return LDB_ERR_OTHER; +} + +static const struct ldb_module_ops wins_ldb_ops = { + .name = "wins_ldb", + .request = wins_ldb_request, + .init_context = wins_ldb_init +}; + + +/* the init function */ +int wins_ldb_module_init(void) +{ + return ldb_register_module(&wins_ldb_ops); } diff --git a/source4/nbt_server/wins/winsserver.c b/source4/nbt_server/wins/winsserver.c index 7f67429996..62e152e05c 100644 --- a/source4/nbt_server/wins/winsserver.c +++ b/source4/nbt_server/wins/winsserver.c @@ -29,6 +29,7 @@ #include "libcli/composite/composite.h" #include "smbd/service_task.h" #include "lib/socket/socket.h" +#include "lib/ldb/include/ldb.h" /* work out the ttl we will use given a client requested ttl @@ -840,6 +841,8 @@ NTSTATUS nbtd_winsserver_init(struct nbtd_server *nbtsrv) return NT_STATUS_OK; } + ldb_global_init(); + nbtsrv->winssrv = talloc_zero(nbtsrv, struct wins_server); NT_STATUS_HAVE_NO_MEMORY(nbtsrv->winssrv); diff --git a/source4/scripting/ejs/smbscript.c b/source4/scripting/ejs/smbscript.c index 20675dadf9..d470d33a22 100644 --- a/source4/scripting/ejs/smbscript.c +++ b/source4/scripting/ejs/smbscript.c @@ -26,6 +26,7 @@ #include "lib/appweb/ejs/ejsInternal.h" #include "scripting/ejs/smbcalls.h" #include "auth/gensec/gensec.h" +#include "ldb/include/ldb.h" static EjsId eid; @@ -37,7 +38,7 @@ void ejs_exception(const char *reason) exit(127); } - int main(int argc, const char **argv) +int main(int argc, const char **argv) { EjsHandle handle = 0; MprVar result; @@ -50,6 +51,9 @@ void ejs_exception(const char *reason) int exit_status, i; fault_setup(argv[0]); + + ldb_global_init(); + gensec_init(); mprSetCtx(mem_ctx); diff --git a/source4/smbd/process_thread.c b/source4/smbd/process_thread.c index 328658b939..10b7051356 100644 --- a/source4/smbd/process_thread.c +++ b/source4/smbd/process_thread.c @@ -35,7 +35,7 @@ #include "smb_server/smb_server.h" #include "mutex.h" -/* For sepecifiying event context to GSSAPI below */ +/* For specifying event context to GSSAPI below */ #include "system/kerberos.h" #include "heimdal/lib/gssapi/gssapi_locl.h" |