]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/module.c
Merge branch 'mdb.master' of ssh://git-master.openldap.org/~git/git/openldap
[openldap] / servers / slapd / module.c
index ae796d6c6979ca5fc160180bd5f3c9ba0a027d4b..8f8b9c60de14dba46a9ae8667edc356c704bb52d 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2009 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -129,10 +129,37 @@ int module_load(const char* file_name, int argc, char *argv[])
 #define        file    file_name
 #endif
 
-       /* silently ignore attempts to load a module that's already present */
        module = module_handle( file_name );
-       if ( module )
-               return 0;
+       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));