X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodule.c;h=a09da6a8b6dd530ad28515b9326384a5f1dfe991;hb=bddc9b337c106b42e018e2b72f66c7f34d21bed8;hp=6fa4ad38ab0b49737d111033e860ad53a1224a81;hpb=ffcdc6d11d7e86260be64e47229ca75bc7b7ac20;p=openldap diff --git a/servers/slapd/module.c b/servers/slapd/module.c index 6fa4ad38ab..a09da6a8b6 100644 --- a/servers/slapd/module.c +++ b/servers/slapd/module.c @@ -1,4 +1,18 @@ /* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2009 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + #include "portable.h" #include #include "slap.h" @@ -29,107 +43,144 @@ struct module_regtable_t { typedef struct module_loaded_t { struct module_loaded_t *next; - lt_dlhandle *lib; + lt_dlhandle lib; + char name[1]; } module_loaded_t; module_loaded_t *module_list = NULL; -static int module_unload (module_loaded_t *module); +static int module_int_unload (module_loaded_t *module); + +#ifdef HAVE_EBCDIC +static char ebuf[BUFSIZ]; +#endif int module_init (void) { if (lt_dlinit()) { const char *error = lt_dlerror(); -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_CRIT, - "module_init: lt_ldinit failed: %s\n", error )); -#else - Debug(LDAP_DEBUG_ANY, "lt_dlinit failed: %s\n", error, 0, 0); +#ifdef HAVE_EBCDIC + strcpy( ebuf, error ); + __etoa( ebuf ); + error = ebuf; #endif + Debug(LDAP_DEBUG_ANY, "lt_dlinit failed: %s\n", error, 0, 0); return -1; } - return 0; + + return module_path( LDAP_MODULEDIR ); } int module_kill (void) { /* unload all modules before shutdown */ while (module_list != NULL) { - module_unload(module_list); + module_int_unload(module_list); } if (lt_dlexit()) { const char *error = lt_dlerror(); -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_CRIT, - "module_kill: lt_dlexit failed: %s\n", error )); -#else - Debug(LDAP_DEBUG_ANY, "lt_dlexit failed: %s\n", error, 0, 0); +#ifdef HAVE_EBCDIC + strcpy( ebuf, error ); + __etoa( ebuf ); + error = ebuf; #endif + Debug(LDAP_DEBUG_ANY, "lt_dlexit failed: %s\n", error, 0, 0); return -1; } return 0; } +void * module_handle( const char *file_name ) +{ + module_loaded_t *module; + + for ( module = module_list; module; module= module->next ) { + if ( !strcmp( module->name, file_name )) { + return module; + } + } + return NULL; +} + +int module_unload( const char *file_name ) +{ + module_loaded_t *module; + + module = module_handle( file_name ); + if ( module ) { + module_int_unload( module ); + return 0; + } + return -1; /* not found */ +} + int module_load(const char* file_name, int argc, char *argv[]) { - module_loaded_t *module = NULL; + module_loaded_t *module; const char *error; int rc; MODULE_INIT_FN initialize; +#ifdef HAVE_EBCDIC +#define file ebuf +#else +#define file file_name +#endif - module = (module_loaded_t *)ch_calloc(1, sizeof(module_loaded_t)); + module = module_handle( file_name ); + if ( module ) { + Debug( LDAP_DEBUG_ANY, "module_load: (%s) already loaded\n", + file_name, 0, 0 ); + return -1; + } + + module = (module_loaded_t *)ch_calloc(1, sizeof(module_loaded_t) + + strlen(file_name)); if (module == NULL) { -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_CRIT, - "module_load: (%s) out of memory.\n", file_name )); -#else Debug(LDAP_DEBUG_ANY, "module_load failed: (%s) out of memory\n", file_name, 0, 0); -#endif return -1; } + strcpy( module->name, file_name ); +#ifdef HAVE_EBCDIC + strcpy( file, file_name ); + __atoe( file ); +#endif /* * The result of lt_dlerror(), when called, must be cached prior * to calling Debug. This is because Debug is a macro that expands * into multiple function calls. */ - if ((module->lib = lt_dlopen(file_name)) == NULL) { + if ((module->lib = lt_dlopenext(file)) == NULL) { error = lt_dlerror(); -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_CRIT, - "module_load: lt_dlopen failed: (%s) %s.\n", - file_name, error )); -#else - Debug(LDAP_DEBUG_ANY, "lt_dlopen failed: (%s) %s\n", file_name, - error, 0); +#ifdef HAVE_EBCDIC + strcpy( ebuf, error ); + __etoa( ebuf ); + error = ebuf; #endif + Debug(LDAP_DEBUG_ANY, "lt_dlopenext failed: (%s) %s\n", file_name, + error, 0); ch_free(module); return -1; } -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_INFO, - "module_load: loaded module %s\n", file_name )); -#else Debug(LDAP_DEBUG_CONFIG, "loaded module %s\n", file_name, 0, 0); -#endif +#ifdef HAVE_EBCDIC +#pragma convlit(suspend) +#endif if ((initialize = lt_dlsym(module->lib, "init_module")) == NULL) { -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_ERR, - "module_load: module %s : no init_module() function found\n", - file_name )); -#else +#ifdef HAVE_EBCDIC +#pragma convlit(resume) +#endif Debug(LDAP_DEBUG_CONFIG, "module %s: no init_module() function found\n", file_name, 0, 0); -#endif lt_dlclose(module->lib); ch_free(module); @@ -153,77 +204,65 @@ int module_load(const char* file_name, int argc, char *argv[]) */ rc = initialize(argc, argv); if (rc == -1) { -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_ERR, - "module_load: module %s init_module() failed\n", file_name)); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: init_module() failed\n", file_name, 0, 0); -#endif lt_dlclose(module->lib); ch_free(module); return rc; } - if (rc >= (sizeof(module_regtable) / sizeof(struct module_regtable_t)) + if (rc >= (int)(sizeof(module_regtable) / sizeof(struct module_regtable_t)) || module_regtable[rc].proc == NULL) { -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_ERR, - "module_load: module %s: unknown registration type (%d).\n", file_name)); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: unknown registration type (%d)\n", file_name, rc, 0); -#endif - module_unload(module); + module_int_unload(module); return -1; } rc = (module_regtable[rc].proc)(module, file_name); if (rc != 0) { -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_ERR, - "module_load: module %s:%s could not be registered.\n", - file_name, module_regtable[rc].type )); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: %s module could not be registered\n", file_name, module_regtable[rc].type, 0); -#endif - module_unload(module); + module_int_unload(module); return rc; } module->next = module_list; module_list = module; -#ifdef NEW_LOGGING - LDAP_LOG(( "module", LDAP_LEVEL_INFO, - "module_load: module %s:%s registered\n", file_name, - module_regtable[rc].type )); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: %s module registered\n", file_name, module_regtable[rc].type, 0); -#endif return 0; } int module_path(const char *path) { +#ifdef HAVE_EBCDIC + strcpy(ebuf, path); + __atoe(ebuf); + path = ebuf; +#endif return lt_dlsetsearchpath( path ); } void *module_resolve (const void *module, const char *name) { +#ifdef HAVE_EBCDIC + strcpy(ebuf, name); + __atoe(ebuf); + name = ebuf; +#endif if (module == NULL || name == NULL) return(NULL); return(lt_dlsym(((module_loaded_t *)module)->lib, name)); } -static int module_unload (module_loaded_t *module) +static int module_int_unload (module_loaded_t *module) { module_loaded_t *mod; MODULE_TERM_FN terminate; @@ -242,7 +281,13 @@ static int module_unload (module_loaded_t *module) } /* call module's terminate routine, if present */ - if (terminate = lt_dlsym(module->lib, "term_module")) { +#ifdef HAVE_EBCDIC +#pragma convlit(suspend) +#endif + if ((terminate = lt_dlsym(module->lib, "term_module"))) { +#ifdef HAVE_EBCDIC +#pragma convlit(resume) +#endif terminate(); } @@ -265,12 +310,12 @@ load_extop_module ( const char *file_name ) { - SLAP_EXTOP_MAIN_FN ext_main; - int (*ext_getoid)(int index, char *oid, int blen); - char *oid; + SLAP_EXTOP_MAIN_FN *ext_main; + SLAP_EXTOP_GETOID_FN *ext_getoid; + struct berval oid; int rc; - ext_main = (SLAP_EXTOP_MAIN_FN)module_resolve(module, "ext_main"); + ext_main = (SLAP_EXTOP_MAIN_FN *)module_resolve(module, "ext_main"); if (ext_main == NULL) { return(-1); } @@ -280,19 +325,17 @@ load_extop_module ( return(-1); } - oid = ch_malloc(256); - rc = (ext_getoid)(0, oid, 256); + rc = (ext_getoid)(0, &oid, 256); if (rc != 0) { - ch_free(oid); return(rc); } - if (*oid == 0) { - free(oid); + if (oid.bv_val == NULL || oid.bv_len == 0) { return(-1); } - rc = load_extop( oid, ext_main ); - free(oid); + /* FIXME: this is broken, and no longer needed, + * as a module can call load_extop() itself... */ + rc = load_extop( &oid, ext_main ); return rc; } #endif /* SLAPD_EXTERNAL_EXTENSIONS */