X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodule.c;h=8f8b9c60de14dba46a9ae8667edc356c704bb52d;hb=76c6c8e5b7f7731440872010b895cd30c8076b59;hp=a292422d16f96e2b2a128dc33e6939426c695522;hpb=3c598e89fb34a892d369a138daa8c3314294493c;p=openldap diff --git a/servers/slapd/module.c b/servers/slapd/module.c index a292422d16..8f8b9c60de 100644 --- a/servers/slapd/module.c +++ b/servers/slapd/module.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2011 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,11 +44,12 @@ struct module_regtable_t { typedef struct module_loaded_t { struct module_loaded_t *next; 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]; @@ -63,23 +64,19 @@ int module_init (void) __etoa( ebuf ); error = ebuf; #endif -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, CRIT, - "module_init: lt_dlinit failed: %s\n", error, 0, 0 ); -#else Debug(LDAP_DEBUG_ANY, "lt_dlinit failed: %s\n", error, 0, 0); -#endif 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()) { @@ -89,21 +86,40 @@ int module_kill (void) __etoa( ebuf ); error = ebuf; #endif -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, CRIT, "module_kill: lt_dlexit failed: %s\n", - error, 0, 0 ); -#else Debug(LDAP_DEBUG_ANY, "lt_dlexit failed: %s\n", error, 0, 0); -#endif 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; @@ -113,18 +129,47 @@ int module_load(const char* file_name, int argc, char *argv[]) #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; + } + + /* If loading a backend, see if we already have it */ + if ( !strncasecmp( file_name, "back_", 5 )) { + char *name = (char *)file_name + 5; + char *dot = strchr( name, '.'); + if (dot) *dot = '\0'; + rc = backend_info( name ) != NULL; + if (dot) *dot = '.'; + if ( rc ) { + Debug( LDAP_DEBUG_CONFIG, "module_load: (%s) already present (static)\n", + file_name, 0, 0 ); + return 0; + } + } else { + /* check for overlays too */ + char *dot = strchr( file_name, '.' ); + if ( dot ) *dot = '\0'; + rc = overlay_find( file_name ) != NULL; + if ( dot ) *dot = '.'; + if ( rc ) { + Debug( LDAP_DEBUG_CONFIG, "module_load: (%s) already present (static)\n", + file_name, 0, 0 ); + return 0; + } + } + + module = (module_loaded_t *)ch_calloc(1, sizeof(module_loaded_t) + + strlen(file_name)); if (module == NULL) { -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, CRIT, - "module_load: (%s) out of memory.\n", file_name, 0, 0 ); -#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 ); @@ -142,24 +187,14 @@ int module_load(const char* file_name, int argc, char *argv[]) __etoa( ebuf ); error = ebuf; #endif -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, CRIT, - "module_load: lt_dlopenext failed: (%s) %s.\n", - file_name, error, 0 ); -#else Debug(LDAP_DEBUG_ANY, "lt_dlopenext failed: (%s) %s\n", file_name, error, 0); -#endif ch_free(module); return -1; } -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, INFO, "module_load: loaded module %s\n", file_name, 0, 0 ); -#else Debug(LDAP_DEBUG_CONFIG, "loaded module %s\n", file_name, 0, 0); -#endif #ifdef HAVE_EBCDIC @@ -169,14 +204,8 @@ int module_load(const char* file_name, int argc, char *argv[]) #ifdef HAVE_EBCDIC #pragma convlit(resume) #endif -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, ERR, - "module_load: module %s : no init_module() function found\n", - file_name, 0, 0 ); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: no init_module() function found\n", file_name, 0, 0); -#endif lt_dlclose(module->lib); ch_free(module); @@ -200,13 +229,8 @@ int module_load(const char* file_name, int argc, char *argv[]) */ rc = initialize(argc, argv); if (rc == -1) { -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, ERR, - "module_load: module %s init_module() failed\n", file_name, 0, 0); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: init_module() failed\n", file_name, 0, 0); -#endif lt_dlclose(module->lib); ch_free(module); @@ -216,45 +240,27 @@ int module_load(const char* file_name, int argc, char *argv[]) if (rc >= (int)(sizeof(module_regtable) / sizeof(struct module_regtable_t)) || module_regtable[rc].proc == NULL) { -#ifdef NEW_LOGGING - LDAP_LOG( SLAPD, ERR, - "module_load: module %s: unknown registration type (%d).\n", - file_name, rc, 0); -#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( SLAPD, ERR, - "module_load: module %s:%s could not be registered.\n", - file_name, module_regtable[rc].type, 0 ); -#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( SLAPD, INFO, - "module_load: module %s:%s registered\n", file_name, - module_regtable[rc].type, 0 ); -#else Debug(LDAP_DEBUG_CONFIG, "module %s: %s module registered\n", file_name, module_regtable[rc].type, 0); -#endif return 0; } @@ -281,7 +287,7 @@ void *module_resolve (const void *module, const char *name) 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; @@ -352,6 +358,8 @@ load_extop_module ( return(-1); } + /* FIXME: this is broken, and no longer needed, + * as a module can call load_extop() itself... */ rc = load_extop( &oid, ext_main ); return rc; }