]> git.sur5r.net Git - openldap/commitdiff
New Frontend->Backend Interface
authorKurt Zeilenga <kurt@openldap.org>
Fri, 5 Feb 1999 09:03:47 +0000 (09:03 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Fri, 5 Feb 1999 09:03:47 +0000 (09:03 +0000)
Separates per backend type from per backend database initialization
and startup.  Also supports per type / per backend shutdown.
New frontend startup/shutdown routines are also provided:
slap_init() slap_startup() slap_shutdown() slap_destroy()
New frontend->backend startup/shutdown is managed by:
backend_init() backend_startup() backend_shutdown backend_destroy
backend_init() now calls bi_init() to initial all function pointers
for the backend (excepting bi_init() which is now the only hardcoded
entry point).  New entry points are detailed in slap.h struct
backend_info.  backend_info is a per database type structure.
Besides the new startup/shutdown entry points, the new interface
also supports per backend type configuration options.  One could have:

backend bdb2 (new Berkeley DB 2 backend)
bdb2_home /directory

database bdb2
...

*** This code is fairly experimental ***
*** Much cleanup and testing is still needed ***

see slap.h for details on struct backend_db and backend_info.

38 files changed:
include/ldbm.h
libraries/libldbm/ldbm.c
servers/slapd/acl.c
servers/slapd/back-ldbm/close.c
servers/slapd/back-ldbm/config.c
servers/slapd/back-ldbm/external.h [new file with mode: 0644]
servers/slapd/back-ldbm/init.c
servers/slapd/back-ldbm/proto-back-ldbm.h
servers/slapd/back-passwd/Makefile.in
servers/slapd/back-passwd/config.c
servers/slapd/back-passwd/external.h [new file with mode: 0644]
servers/slapd/back-passwd/init.c [new file with mode: 0644]
servers/slapd/back-passwd/search.c
servers/slapd/back-perl/close.c
servers/slapd/back-perl/config.c
servers/slapd/back-perl/external.h [new file with mode: 0644]
servers/slapd/back-perl/init.c
servers/slapd/back-perl/perl_back.h
servers/slapd/back-perl/unbind.c
servers/slapd/back-shell/abandon.c
servers/slapd/back-shell/config.c
servers/slapd/back-shell/external.h [new file with mode: 0644]
servers/slapd/back-shell/init.c
servers/slapd/back-shell/shell.h
servers/slapd/back-shell/unbind.c
servers/slapd/backend.c
servers/slapd/config.c
servers/slapd/daemon.c
servers/slapd/init.c
servers/slapd/main.c
servers/slapd/proto-slap.h
servers/slapd/slap.h
servers/slapd/tools/ldbmtest.c
servers/slapd/tools/ldif2id2children.c
servers/slapd/tools/ldif2id2entry.c
servers/slapd/tools/ldif2index.c
servers/slapd/tools/ldif2ldbm.c
servers/slapd/unbind.c

index 3f55a6ffeaa2ff3127ff5dba79a6422656755138..ffe8804d6c40487594db0c45a898da8c5f6c12bd 100644 (file)
@@ -202,7 +202,9 @@ LDAP_END_DECL
 
 LDAP_BEGIN_DECL
 
-void ldbm_initialize( void );
+int ldbm_initialize( void );
+int ldbm_shutdown( void );
+
 int    ldbm_errno( LDBM ldbm );
 LDBM   ldbm_open( char *name, int rw, int mode, int dbcachesize );
 void   ldbm_close( LDBM ldbm );
index 743e9b4cd864950d91fa06ee61b5ff6a6c9fd340..4ca65953506d536adeb2a81451b1006f71316d5b 100644 (file)
@@ -48,6 +48,8 @@ ldbm_datum_dup( LDBM ldbm, Datum data )
        return( dup );
 }
 
+static int ldbm_initialized = 0;
+
 #ifndef HAVE_BERKELEY_DB2
 /* Everything but DB2 is non-reentrant */
 
@@ -55,13 +57,22 @@ static ldap_pvt_thread_mutex_t ldbm_big_mutex;
 #define LDBM_LOCK      (ldap_pvt_thread_mutex_lock(&ldbm_big_mutex))
 #define LDBM_UNLOCK    (ldap_pvt_thread_mutex_unlock(&ldbm_big_mutex))
 
-void ldbm_initialize( void )
+int ldbm_initialize( void )
 {
-       static int initialized = 0;
-
-       if(initialized++) return;
+       if(ldbm_initialized++) return 1;
 
        ldap_pvt_thread_mutex_init( &ldbm_big_mutex );
+
+       return 0;
+}
+
+int ldbm_shutdown( void )
+{
+       if( !ldbm_initialized ) return 1;
+
+       ldap_pvt_thread_mutex_destroy( &ldbm_big_mutex );
+
+       return 0;
 }
 
 #else
@@ -87,14 +98,12 @@ static DB_ENV           ldbm_Env;
 #define LDBM_LOCK      ((void)0)
 #define LDBM_UNLOCK    ((void)0)
 
-void ldbm_initialize( void )
+int ldbm_initialize( void )
 {
-       static int initialized = 0;
-
        int     err;
        int     envFlags;
 
-       if(initialized++) return;
+       if(ldbm_initialized++) return 1;
 
        memset( &ldbm_Env, 0, sizeof( ldbm_Env ));
 
@@ -115,8 +124,19 @@ void ldbm_initialize( void )
                syslog( LOG_INFO,
                        "ldbm_initialize(): FATAL error in db_appinit() : %s\n",
                        error );
-               exit( 1 );
+               return( 1 );
        }
+
+       return 0;
+}
+
+int ldbm_shutdown( void )
+{
+       if( !ldbm_initialized ) return 1;
+
+       db_appexit( &ldbm_Env );
+
+       return 0;
 }
 
 #endif
index 255cf8954586d524e3ce090cd5babfaf48773b73..d6e92eb53b42d643afb4004199f5cf986536ae0c 100644 (file)
@@ -356,7 +356,7 @@ acl_access_allowed(
                        string_expand(buf, sizeof(buf), b->a_group, edn, matches);
                        (void) dn_normalize_case(buf);
 
-                       if (be_group(be, e, buf, odn,
+                       if (backend_group(be, e, buf, odn,
                                b->a_objectclassvalue, b->a_groupattrname) == 0)
                        {
                                Debug( LDAP_DEBUG_ACL,
index 310f441b5d1343b565bd84cdd5ff59ca7c570931..5cb9a75b1cc99710160b8a6017812bba5c0b0543 100644 (file)
@@ -9,8 +9,8 @@
 #include "slap.h"
 #include "back-ldbm.h"
 
-void
-ldbm_back_close( Backend *be )
+int
+ldbm_back_db_close( Backend *be )
 {
        Debug( LDAP_DEBUG_TRACE, "ldbm backend saving nextid\n", 0, 0, 0 );
        if ( next_id_save( be ) < 0 ) {
@@ -20,4 +20,6 @@ ldbm_back_close( Backend *be )
        Debug( LDAP_DEBUG_TRACE, "ldbm backend syncing\n", 0, 0, 0 );
        ldbm_cache_flush_all( be );
        Debug( LDAP_DEBUG_TRACE, "ldbm backend done syncing\n", 0, 0, 0 );
+
+       return 0;
 }
index 541410ee4dc388b9b4bef92760fa27c9fc69a178..808aa4f4a75e7acea62b579e5c370971df7004da 100644 (file)
@@ -10,8 +10,8 @@
 #include "slap.h"
 #include "back-ldbm.h"
 
-void
-ldbm_back_config(
+int
+ldbm_back_db_config(
     Backend    *be,
     char       *fname,
     int                lineno,
@@ -24,7 +24,7 @@ ldbm_back_config(
        if ( li == NULL ) {
                fprintf( stderr, "%s: line %d: ldbm backend info is null!\n",
                    fname, lineno );
-               exit( 1 );
+               return( 1 );
        }
 
        /* directory where database files live */
@@ -33,7 +33,7 @@ ldbm_back_config(
                        fprintf( stderr,
                "%s: line %d: missing dir in \"directory <dir>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                li->li_directory = ch_strdup( argv[1] );
 
@@ -49,7 +49,7 @@ ldbm_back_config(
                        fprintf( stderr,
                        "%s: line %d: missing mode in \"mode <mode>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                li->li_mode = strtol( argv[1], NULL, 0 );
 
@@ -59,7 +59,7 @@ ldbm_back_config(
                        fprintf( stderr,
 "%s: line %d: missing attr in \"index <attr> [pres,eq,approx,sub]\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                } else if ( argc > 3 ) {
                        fprintf( stderr,
 "%s: line %d: extra junk after \"index <attr> [pres,eq,approx,sub]\" line (ignored)\n",
@@ -73,7 +73,7 @@ ldbm_back_config(
                        fprintf( stderr,
                "%s: line %d: missing size in \"cachesize <size>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                li->li_cache.c_maxsize = atoi( argv[1] );
 
@@ -83,7 +83,7 @@ ldbm_back_config(
                        fprintf( stderr,
                "%s: line %d: missing size in \"dbcachesize <size>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                li->li_dbcachesize = atoi( argv[1] );
 
@@ -97,4 +97,6 @@ ldbm_back_config(
 "%s: line %d: unknown directive \"%s\" in ldbm database definition (ignored)\n",
                    fname, lineno, argv[0] );
        }
+
+       return 0;
 }
diff --git a/servers/slapd/back-ldbm/external.h b/servers/slapd/back-ldbm/external.h
new file mode 100644 (file)
index 0000000..55dba86
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef _LDBM_EXTERNAL_H
+#define _LDBM_EXTERNAL_H
+
+LDAP_BEGIN_DECL
+
+extern int     ldbm_back_initialize LDAP_P(( BackendInfo *bi ));
+extern int     ldbm_back_open LDAP_P(( BackendInfo *bi ));
+extern int     ldbm_back_close LDAP_P(( BackendInfo *bi ));
+extern int     ldbm_back_destroy LDAP_P(( BackendInfo *bi ));
+
+extern int     ldbm_back_db_init LDAP_P(( BackendDB *bd ));
+extern int     ldbm_back_db_open LDAP_P(( BackendDB *bd ));
+extern int     ldbm_back_db_close LDAP_P(( BackendDB *bd ));
+extern int     ldbm_back_db_destroy LDAP_P(( BackendDB *bd ));
+
+extern int     ldbm_back_db_config LDAP_P(( BackendDB *bd,
+       char *fname, int lineno, int argc, char **argv ));
+
+extern int ldbm_back_bind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, int method, struct berval *cred, char** edn ));
+
+extern int     ldbm_back_unbind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op ));
+
+extern int     ldbm_back_search LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *base, int scope, int deref, int sizelimit, int timelimit,
+       Filter *filter, char *filterstr, char **attrs, int attrsonly ));
+
+extern int     ldbm_back_compare LDAP_P((BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, Ava   *ava ));
+
+extern int     ldbm_back_modify LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, LDAPModList *ml ));
+
+extern int     ldbm_back_modrdn LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, char*newrdn, int deleteoldrdn ));
+
+extern int     ldbm_back_add LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, Entry *e ));
+
+extern int     ldbm_back_delete LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, char *dn ));
+
+extern int     ldbm_back_abandon LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, int msgid ));
+
+extern int     ldbm_back_group LDAP_P(( BackendDB *bd,
+       Entry *target, char* gr_ndn, char* op_ndn,
+       char* objectclassValue, char* groupattrName));
+
+LDAP_END_DECL
+
+#endif /* _LDBM_EXTERNAL_H */
+
index f0ae9fb7779f7f3879b44defdefaf28041b32418..7f65cf8dd52b9ea23f9716afd0a2792f37406a3b 100644 (file)
 #include "slap.h"
 #include "back-ldbm.h"
 
-void
-ldbm_back_init(
+int
+ldbm_back_initialize(
+    BackendInfo        *bi
+)
+{
+       bi->bi_open = ldbm_back_open;
+       bi->bi_config = NULL;
+       bi->bi_close = ldbm_back_close;
+       bi->bi_destroy = ldbm_back_destroy;
+
+       bi->bi_db_init = ldbm_back_db_init;
+       bi->bi_db_config = ldbm_back_db_config;
+       bi->bi_db_open = ldbm_back_db_open;
+       bi->bi_db_close = ldbm_back_db_close;
+       bi->bi_db_destroy = ldbm_back_db_destroy;
+
+       bi->bi_op_bind = ldbm_back_bind;
+       bi->bi_op_unbind = ldbm_back_unbind;
+       bi->bi_op_search = ldbm_back_search;
+       bi->bi_op_compare = ldbm_back_compare;
+       bi->bi_op_modify = ldbm_back_modify;
+       bi->bi_op_modrdn = ldbm_back_modrdn;
+       bi->bi_op_add = ldbm_back_add;
+       bi->bi_op_delete = ldbm_back_delete;
+       bi->bi_op_abandon = ldbm_back_abandon;
+
+       bi->bi_acl_group = ldbm_back_group;
+
+       return 0;
+}
+
+int
+ldbm_back_destroy(
+    BackendInfo        *bi
+)
+{
+       return 0;
+}
+
+int
+ldbm_back_open(
+    BackendInfo        *bi
+)
+{
+       int rc;
+
+       /* initialize the underlying database system */
+       rc = ldbm_initialize();
+
+       return rc;
+}
+
+int
+ldbm_back_close(
+    BackendInfo        *bi
+)
+{
+       /* initialize the underlying database system */
+       ldbm_shutdown();
+
+       return 0;
+}
+
+int
+ldbm_back_db_init(
     Backend    *be
 )
 {
@@ -19,9 +82,6 @@ ldbm_back_init(
        char            *argv[ 4 ];
        int             i;
 
-       /* initialize the underlying database system */
-       ldbm_initialize();
-
        /* allocate backend-specific stuff */
        li = (struct ldbminfo *) ch_calloc( 1, sizeof(struct ldbminfo) );
 
@@ -78,4 +138,25 @@ ldbm_back_init(
        ldap_pvt_thread_cond_init( &li->li_dbcache_cv );
 
        be->be_private = li;
+
+       return 0;
+}
+
+int
+ldbm_back_db_open(
+    BackendDB  *be
+)
+{
+       return 0;
+}
+
+int
+ldbm_back_db_destroy(
+    BackendDB  *be
+)
+{
+       /* should free/destroy every in be_private */
+       free( be->be_private );
+       be->be_private = NULL;
+       return 0;
 }
index 5b0ecd852faaa62f0c9e993167c4e6d749f7a338..ae7ec7f95798f65064547f1b7f712b81ae57884f 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <ldap_cdefs.h>
 
+#include "external.h"
+
 LDAP_BEGIN_DECL
 
 /*
index 24d620b103183f10b2492690f390b801e12741d2..11e66e089def4026afcba50ea85b2e058a5ddce4 100644 (file)
@@ -1,6 +1,6 @@
 XSRCS  = version.c
-SRCS   = search.c config.c
-OBJS   = search.o config.o
+SRCS   = search.c config.c init.c
+OBJS   = search.o config.o init.o
 
 LDAP_INCDIR= ../../../include       
 LDAP_LIBDIR= ../../../libraries
index 3ed61fa9e73045f9abdcab854d8db1283ad468f9..7f6cb41169d45c82fc797843f6de7e8a721dec7c 100644 (file)
@@ -9,10 +9,11 @@
 #include <ac/time.h>
 
 #include "slap.h"
+#include "external.h"
 
-void
-passwd_back_config(
-    Backend    *be,
+int
+passwd_back_db_config(
+    BackendDB  *be,
     char       *fname,
     int                lineno,
     int                argc,
@@ -26,7 +27,7 @@ passwd_back_config(
                        fprintf( stderr,
                "%s: line %d: missing filename in \"file <filename>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                be->be_private = ch_strdup( argv[1] );
 #else /* HAVE_SETPWFILE */
@@ -41,4 +42,6 @@ passwd_back_config(
 "%s: line %d: unknown directive \"%s\" in passwd database definition (ignored)\n",
                    fname, lineno, argv[0] );
        }
+
+       return( 0 );
 }
diff --git a/servers/slapd/back-passwd/external.h b/servers/slapd/back-passwd/external.h
new file mode 100644 (file)
index 0000000..ff34de2
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _PASSWD_EXTERNAL_H
+#define _PASSWD_EXTERNAL_H
+
+LDAP_BEGIN_DECL
+
+extern int     passwd_back_initialize LDAP_P(( BackendInfo *bi ));
+
+extern int  passwd_back_search LDAP_P(( BackendDB *be,
+       Connection *c, Operation *o,
+       char *base, int scope, int deref, int slimit, int tlimit,
+       Filter *f, char *filterstr, char **attrs, int attrsonly));
+
+extern int passwd_back_db_config LDAP_P((BackendDB *bd,
+       char *fname, int lineno, int argc, char **argv ));
+
+LDAP_END_DECL
+
+#endif /* _PASSWD_EXTERNAL_H */
+
diff --git a/servers/slapd/back-passwd/init.c b/servers/slapd/back-passwd/init.c
new file mode 100644 (file)
index 0000000..eea608c
--- /dev/null
@@ -0,0 +1,41 @@
+/* init.c - initialize passwd backend */
+
+#include "portable.h"
+
+#include <stdio.h>
+
+#include <ac/socket.h>
+
+#include "slap.h"
+#include "external.h"
+
+int
+passwd_back_initialize(
+    BackendInfo        *bi
+)
+{
+       bi->bi_open = NULL;
+       bi->bi_config = NULL;
+       bi->bi_close = NULL;
+       bi->bi_destroy = NULL;
+
+       bi->bi_db_init = NULL;
+       bi->bi_db_config = NULL;
+       bi->bi_db_open = NULL;
+       bi->bi_db_close = NULL;
+       bi->bi_db_destroy = NULL;
+
+       bi->bi_op_bind = NULL;
+       bi->bi_op_unbind = NULL;
+       bi->bi_op_search = passwd_back_search;
+       bi->bi_op_compare = NULL;
+       bi->bi_op_modify = NULL;
+       bi->bi_op_modrdn = NULL;
+       bi->bi_op_add = NULL;
+       bi->bi_op_delete = NULL;
+       bi->bi_op_abandon = NULL;
+
+       bi->bi_acl_group = NULL;
+
+       return 0;
+}
index 8695ffa616fc138714c10ba488723f5f95d99d05..0852a88d1bd7fc5c5b5173478c78e168b9b60bc0 100644 (file)
@@ -11,6 +11,7 @@
 #include <pwd.h>
 
 #include "slap.h"
+#include "external.h"
 
 static Entry   *pw2entry(Backend *be, struct passwd *pw);
 
index 8e320e6b590728e264dfc608545abe58b06f8a20..61c8f03e5bf05027dbeb6aa5d14b9b2e190a2513 100644 (file)
  *
  **********************************************************/
 
-void
+int
 perl_back_close(
-       Backend *be
+       BackendInfo *bd
 )
 {
        ldap_pvt_thread_mutex_lock( &perl_interpreter_mutex );  
 
        perl_destruct(perl_interpreter);
-       perl_free(perl_interpreter);
 
        ldap_pvt_thread_mutex_unlock( &perl_interpreter_mutex );        
+
+       return 0;
+}
+
+int
+perl_back_destroy(
+       BackendInfo *bd
+)
+{
+       perl_free(perl_interpreter);
+       perl_interpreter = NULL;
+
+       ldap_pvt_thread_mutex_destroy( &perl_interpreter_mutex );       
+
+       return 0;
 }
 
+int
+perl_back_db_destroy(
+       BackendDB *be
+)
+{
+       free( be->be_private );
+       be->be_private = NULL;
+}
index 1ac51024f93dddf26ff5f25e7176280d1f3b742d..c2e4298e676f1c1f4857aaab36911da6a49ae671 100644 (file)
@@ -27,9 +27,9 @@
  * Config
  *
  **********************************************************/
-void
-perl_back_config(
-        Backend *be,
+int
+perl_back_db_config(
+        BackendDB *be,
         char *fname,
         int lineno,
         int argc,
@@ -48,7 +48,7 @@ perl_back_config(
                        Debug( LDAP_DEBUG_ANY,
                                 "%s.pm: line %d: missing module in \"perlModule <module>\" line\n",
                                fname, lineno, 0 );
-                       exit( 1 );
+                       return( 1 );
                }
 
                strncpy(eval_str, argv[1], EVAL_BUF_SIZE );
@@ -82,7 +82,7 @@ perl_back_config(
                        fprintf( stderr,
                                "%s: line %d: missing module in \"PerlModulePath <module>\" line\n",
                                fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
 
                sprintf( eval_str, "push @INC, '%s';", argv[1] );
@@ -94,7 +94,9 @@ perl_back_config(
                 */
 
                fprintf( stderr,
-                       "Unknown perl backeng config: %s\n", argv[0]);
-               exit( 1 );
+                       "Unknown perl backend config: %s\n", argv[0]);
+               return( 1 );
        }
+
+       return 0;
 }
diff --git a/servers/slapd/back-perl/external.h b/servers/slapd/back-perl/external.h
new file mode 100644 (file)
index 0000000..a6dd621
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef _PERL_EXTERNAL_H
+#define _PERL_EXTERNAL_H
+
+LDAP_BEGIN_DECL
+
+extern int     perl_back_initialize LDAP_P(( BackendInfo *bi ));
+extern int     perl_back_open LDAP_P(( BackendInfo *bi ));
+extern int     perl_back_close LDAP_P(( BackendInfo *bi ));
+extern int     perl_back_destroy LDAP_P(( BackendInfo *bi ));
+
+extern int     perl_back_db_init LDAP_P(( BackendDB *bd ));
+extern int     perl_back_db_destroy LDAP_P(( BackendDB *bd ));
+
+extern int     perl_back_db_config LDAP_P(( BackendDB *bd,
+       char *fname, int lineno, int argc, char **argv ));
+
+extern int perl_back_bind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, int method, struct berval *cred, char** edn ));
+
+extern int     perl_back_unbind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op ));
+
+extern int     perl_back_search LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *base, int scope, int deref, int sizelimit, int timelimit,
+       Filter *filter, char *filterstr, char **attrs, int attrsonly ));
+
+extern int     perl_back_compare LDAP_P((BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, Ava   *ava ));
+
+extern int     perl_back_modify LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, LDAPModList *ml ));
+
+extern int     perl_back_modrdn LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, char*newrdn, int deleteoldrdn ));
+
+extern int     perl_back_add LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, Entry *e ));
+
+extern int     perl_back_delete LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, char *dn ));
+
+LDAP_END_DECL
+
+#endif /* _PERL_EXTERNAL_H */
+
index c50785bc80d981fce6745ad2fdf97fae071e91ae..a009ec8056ef295ce3e41912837259a09b5986c8 100644 (file)
@@ -33,25 +33,71 @@ ldap_pvt_thread_mutex_t     perl_interpreter_mutex;
  *
  **********************************************************/
 
-void
-perl_back_init(
-       Backend *be
+int
+perl_back_initialize(
+       BackendInfo     *bi
 )
 {
        char *embedding[] = { "", "-e", "0" };
 
-       if( perl_interpreter == NULL ) {
-               perl_interpreter = perl_alloc();
-               perl_construct(perl_interpreter);
-               perl_parse(perl_interpreter, NULL, 3, embedding, (char **)NULL);
-               perl_run(perl_interpreter);
-               
-               ldap_pvt_thread_mutex_init( &perl_interpreter_mutex );
+       Debug( LDAP_DEBUG_TRACE, "perl backend open\n", 0, 0, 0 );
+
+       if( perl_interpreter != NULL ) {
+               Debug( LDAP_DEBUG_ANY, "perl backend open: already opened\n",
+                       0, 0, 0 );
+               return 1;
        }
+       
+       perl_interpreter = perl_alloc();
+       perl_construct(perl_interpreter);
+       perl_parse(perl_interpreter, NULL, 3, embedding, (char **)NULL);
+       perl_run(perl_interpreter);
+
+       bi->bi_open = perl_back_open;
+       bi->bi_config = NULL;
+       bi->bi_close = perl_back_close;
+       bi->bi_destroy = perl_back_destroy;
+
+       bi->bi_db_init = perl_back_db_init;
+       bi->bi_db_config = perl_back_db_config;
+       bi->bi_db_open = NULL;
+       bi->bi_db_close = NULL;
+       bi->bi_db_destroy = perl_back_db_destroy;
+
+       bi->bi_op_bind = perl_back_bind;
+       bi->bi_op_unbind = perl_back_unbind;
+       bi->bi_op_search = perl_back_search;
+       bi->bi_op_compare = perl_back_compare;
+       bi->bi_op_modify = perl_back_modify;
+       bi->bi_op_modrdn = perl_back_modrdn;
+       bi->bi_op_add = perl_back_add;
+       bi->bi_op_delete = perl_back_delete;
+       bi->bi_op_abandon = NULL;
+
+       bi->bi_acl_group = NULL;
+
+       return 0;
+}
+               
+int
+perl_back_open(
+       BackendInfo     *bi
+)
+{
+       ldap_pvt_thread_mutex_init( &perl_interpreter_mutex );
+       return 0;
+}
 
+int
+perl_back_db_init(
+       Backend *be
+)
+{
        be->be_private = (PerlBackend *) ch_malloc( sizeof(PerlBackend) );
        memset(&be->be_private, 0, sizeof(PerlBackend));
 
-       Debug( LDAP_DEBUG_ANY, "Here in perl backend\n", 0, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "perl backend db init\n", 0, 0, 0 );
+
+       return 0;
 }
 
index a8adcd57a1e05298f4b05c483f3a25eb00788178..2f650a3c0a07a2f61e39900acd27a0505f267e29 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef PERL_BACK_H
 #define PERL_BACK_H 1
 
-#include <ldap_cdefs.h>
-
 LDAP_BEGIN_DECL
 
 /*
@@ -19,4 +17,6 @@ typedef struct perl_backend_instance {
 
 LDAP_END_DECL
 
+#include "external.h"
+
 #endif
index 2c83d8573da30a42f52532225d73c57ffab04f07..5ba03f29a8476c96a9ad01b2c7afef5661df65d1 100644 (file)
@@ -27,7 +27,7 @@
  * UnBind
  *
  **********************************************************/
-void
+int
 perl_back_unbind(
        Backend *be,
        Connection *conn,
@@ -36,6 +36,7 @@ perl_back_unbind(
 {
        send_ldap_result( conn, op, LDAP_NOT_SUPPORTED,
                "", "not yet implemented" );
-       Debug( LDAP_DEBUG_ANY, "Perl UNBIND\n", 0, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "Perl UNBIND\n", 0, 0, 0 );
+       return 0;
 }
 
index dad3204984d0bc6d4a7192f4bfb4f743faf23df6..e69bab6e4b19c31dc8269ebff3bf9832f7180f5b 100644 (file)
@@ -11,7 +11,7 @@
 #include "slap.h"
 #include "shell.h"
 
-void
+int
 shell_back_abandon(
     Backend    *be,
     Connection *conn,
@@ -44,11 +44,11 @@ shell_back_abandon(
                        Debug( LDAP_DEBUG_ARGS, "shell could not find op %d\n",
                            msgid, 0, 0 );
                }
-               return;
+               return 0;
        }
 
        if ( forkandexec( si->si_abandon, &rfp, &wfp ) == -1 ) {
-               return;
+               return 0;
        }
 
        /* write out the request to the abandon process */
@@ -59,4 +59,6 @@ shell_back_abandon(
 
        /* no result from abandon */
        fclose( rfp );
+
+       return 0;
 }
index ac411d7563dbcf02de161cd729e20f561f307be9..a308ba1a977b1b8e07131e0933118da1afd98288 100644 (file)
@@ -10,9 +10,9 @@
 #include "slap.h"
 #include "shell.h"
 
-void
-shell_back_config(
-    Backend    *be,
+int
+shell_back_db_config(
+    BackendDB  *be,
     char       *fname,
     int                lineno,
     int                argc,
@@ -24,7 +24,7 @@ shell_back_config(
        if ( si == NULL ) {
                fprintf( stderr, "%s: line %d: shell backend info is null!\n",
                    fname, lineno );
-               exit( 1 );
+               return( 1 );
        }
 
        /* command + args to exec for binds */
@@ -33,7 +33,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"bind <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_bind = charray_dup( &argv[1] );
 
@@ -43,7 +43,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"unbind <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_unbind = charray_dup( &argv[1] );
 
@@ -53,7 +53,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"search <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_search = charray_dup( &argv[1] );
 
@@ -63,7 +63,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"compare <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_compare = charray_dup( &argv[1] );
 
@@ -73,7 +73,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"modify <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_modify = charray_dup( &argv[1] );
 
@@ -83,7 +83,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"modrdn <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_modrdn = charray_dup( &argv[1] );
 
@@ -93,7 +93,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"add <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_add = charray_dup( &argv[1] );
 
@@ -103,7 +103,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"delete <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_delete = charray_dup( &argv[1] );
 
@@ -113,7 +113,7 @@ shell_back_config(
                        fprintf( stderr,
        "%s: line %d: missing executable in \"abandon <executable>\" line\n",
                            fname, lineno );
-                       exit( 1 );
+                       return( 1 );
                }
                si->si_abandon = charray_dup( &argv[1] );
 
@@ -123,4 +123,6 @@ shell_back_config(
 "%s: line %d: unknown directive \"%s\" in shell database definition (ignored)\n",
                    fname, lineno, argv[0] );
        }
+
+       return 0;
 }
diff --git a/servers/slapd/back-shell/external.h b/servers/slapd/back-shell/external.h
new file mode 100644 (file)
index 0000000..b12adc1
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef _SHELL_EXTERNAL_H
+#define _SHELL_EXTERNAL_H
+
+LDAP_BEGIN_DECL
+
+extern int     shell_back_initialize LDAP_P(( BackendInfo *bi ));
+extern int     shell_back_open LDAP_P(( BackendInfo *bi ));
+extern int     shell_back_close LDAP_P(( BackendInfo *bi ));
+extern int     shell_back_destroy LDAP_P(( BackendInfo *bi ));
+
+extern int     shell_back_db_init LDAP_P(( BackendDB *bd ));
+extern int     shell_back_db_destroy LDAP_P(( BackendDB *bd ));
+
+extern int     shell_back_db_config LDAP_P(( BackendDB *bd,
+       char *fname, int lineno, int argc, char **argv ));
+
+extern int shell_back_bind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, int method, struct berval *cred, char** edn ));
+
+extern int     shell_back_unbind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op ));
+
+extern int     shell_back_search LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *base, int scope, int deref, int sizelimit, int timelimit,
+       Filter *filter, char *filterstr, char **attrs, int attrsonly ));
+
+extern int     shell_back_compare LDAP_P((BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, Ava   *ava ));
+
+extern int     shell_back_modify LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, LDAPModList *ml ));
+
+extern int     shell_back_modrdn LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       char *dn, char*newrdn, int deleteoldrdn ));
+
+extern int     shell_back_add LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, Entry *e ));
+
+extern int     shell_back_delete LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, char *dn ));
+
+extern int     shell_back_abandon LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, int msgid ));
+
+LDAP_END_DECL
+
+#endif /* _SHELL_EXTERNAL_H */
+
index 6a841c154ba5903cc0123182fed21ac79995829f..01b46cc51906c90ab6b285cb6a612f7ff1d46d83 100644 (file)
@@ -9,8 +9,39 @@
 #include "slap.h"
 #include "shell.h"
 
-void
-shell_back_init(
+int
+shell_back_initialize(
+    BackendInfo        *bi
+)
+{
+       bi->bi_open = NULL;
+       bi->bi_config = NULL;
+       bi->bi_close = NULL;
+       bi->bi_destroy = NULL;
+
+       bi->bi_db_init = shell_back_db_init;
+       bi->bi_db_config = shell_back_db_config;
+       bi->bi_db_open = NULL;
+       bi->bi_db_close = NULL;
+       bi->bi_db_destroy = shell_back_db_destroy;
+
+       bi->bi_op_bind = shell_back_bind;
+       bi->bi_op_unbind = shell_back_unbind;
+       bi->bi_op_search = shell_back_search;
+       bi->bi_op_compare = shell_back_compare;
+       bi->bi_op_modify = shell_back_modify;
+       bi->bi_op_modrdn = shell_back_modrdn;
+       bi->bi_op_add = shell_back_add;
+       bi->bi_op_delete = shell_back_delete;
+       bi->bi_op_abandon = shell_back_abandon;
+
+       bi->bi_acl_group = NULL;
+
+       return 0;
+}
+
+int
+shell_back_db_init(
     Backend    *be
 )
 {
@@ -19,4 +50,15 @@ shell_back_init(
        si = (struct shellinfo *) ch_calloc( 1, sizeof(struct shellinfo) );
 
        be->be_private = si;
+
+       return si == NULL;
+}
+
+int
+shell_back_db_destroy(
+    Backend    *be
+)
+{
+       free( be->be_private );
+       return 0;
 }
index 6860073c673154ddffe8904fbc2d164205bbd058..a17bc4da5beb32e9cb1483bcb38ec1186df21c14 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef SLAPD_SHELL_H
 #define SLAPD_SHELL_H
 
-#include <ldap_cdefs.h>
+#include "external.h"
 
 LDAP_BEGIN_DECL
 
@@ -19,14 +19,26 @@ struct shellinfo {
        char    **si_abandon;   /* cmd + args to exec for abandon */
 };
 
-struct backend;
+struct backend_db;
 struct slap_conn;
 struct slap_op;
-extern pid_t forkandexec LDAP_P((char **args, FILE **rfp, FILE **wfp));
-extern void print_suffixes LDAP_P((FILE *fp, struct backend *be));
-extern int read_and_send_results LDAP_P((struct backend *be,
-       struct slap_conn *conn, struct slap_op *op,
-       FILE *fp, char **attrs, int attrsonly));
+
+extern pid_t forkandexec LDAP_P((
+       char **args,
+       FILE **rfp,
+       FILE **wfp));
+
+extern void print_suffixes LDAP_P((
+       FILE *fp,
+       struct backend_db *bd));
+
+extern int read_and_send_results LDAP_P((
+       struct backend_db *bd,
+       struct slap_conn *conn,
+       struct slap_op *op,
+       FILE *fp,
+       char **attrs,
+       int attrsonly));
 
 LDAP_END_DECL
 
index 7ad4ba619b34ed213fed5210b89d520d3cc0defc..6e8d1009c1bc4c8c1520d91dbdeed7c23b9c2492 100644 (file)
@@ -10,7 +10,7 @@
 #include "slap.h"
 #include "shell.h"
 
-void
+int
 shell_back_unbind(
     Backend            *be,
     Connection         *conn,
@@ -23,14 +23,14 @@ shell_back_unbind(
        if ( si->si_unbind == NULL ) {
                send_ldap_result( conn, op, LDAP_UNWILLING_TO_PERFORM, NULL,
                    "unbind not implemented" );
-               return;
+               return 0;
        }
 
        if ( (op->o_private = (void *) forkandexec( si->si_unbind, &rfp, &wfp ))
            == (void *) -1 ) {
                send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL,
                    "could not fork/exec" );
-               return;
+               return 0;
        }
 
        /* write out the request to the unbind process */
@@ -42,4 +42,6 @@ shell_back_unbind(
 
        /* no response to unbind */
        fclose( rfp );
+
+       return 0;
 }
index be069201f910e0d576ef90cb602e3126c0c96ce4..e97914d0a8bdd4941135d64b17e0665dda8be1fe 100644 (file)
 
 #include "slap.h"
 
+#ifdef SLAPD_LDBM
+#include "back-ldbm/external.h"
+#endif
+#ifdef SLAPD_PASSWD
+#include "back-passwd/external.h"
+#endif
+#ifdef SLAPD_PERL
+#include "back-perl/external.h"
+#endif
+#ifdef SLAPD_SHELL
+#include "back-shell/external.h"
+#endif
 
-#define BACKEND_GRAB_SIZE      10
+static BackendInfo binfo[] = {
+#ifdef SLAPD_LDBM
+       {"ldbm",        ldbm_back_initialize},
+#endif
+#ifdef SLAPD_PASSWD
+       {"passwd",      passwd_back_initialize},
+#endif
+#ifdef SLAPD_PERL
+       {"perl",        perl_back_initialize},
+#endif
+#ifdef SLAPD_SHELL
+       {"shell",       shell_back_initialize},
+#endif
+       {NULL}
+};
 
-int            nbackends;
-Backend                *backends;
-static int     maxbackends;
+int                    nBackendInfo = 0;
+BackendInfo    *backendInfo = NULL;
 
-Backend *
-new_backend(
-    char       *type
-)
+int                    nBackendDB = 0; 
+BackendDB      *backendDB = NULL;
+
+int backend_init(void)
 {
-       Backend *be;
-       int     foundit;
-
-       if ( nbackends == maxbackends ) {
-               maxbackends += BACKEND_GRAB_SIZE;
-               backends = (Backend *) ch_realloc( (char *) backends,
-                   maxbackends * sizeof(Backend) );
-               memset( &backends[nbackends], '\0', BACKEND_GRAB_SIZE *
-                   sizeof(Backend) );
+       int rc = 0;
+
+       if((nBackendInfo != 0) || (backendInfo != NULL)) {
+               /* already initialized */
+               Debug( LDAP_DEBUG_ANY,
+                       "backend_init: already initialized.\n", 0, 0, 0 );
+               return -1;
        }
 
-       be = &backends[nbackends++];
-       be->be_sizelimit = defsize;
-       be->be_timelimit = deftime;
-       foundit = 0;
+       for( ;
+               binfo[nBackendInfo].bi_type !=  NULL;
+               nBackendInfo++ )
+       {
+               rc = binfo[nBackendInfo].bi_init(
+                       &binfo[nBackendInfo] );
+
+               if(rc != 0) {
+                       Debug( LDAP_DEBUG_ANY,
+                               "backend_init: initialized for type \"%s\"\n",
+                                       binfo[nBackendInfo].bi_type, 0, 0 );
+
+                       /* destroy those we've already inited */
+                       for( nBackendInfo--;
+                               nBackendInfo >= 0 ;
+                               nBackendInfo-- )
+                       { 
+                               if ( binfo[nBackendInfo].bi_destroy ) {
+                                       binfo[nBackendInfo].bi_destroy(
+                                               &binfo[nBackendInfo] );
+                               }
+                       }
+                       return rc;
+               }
+       }
 
-#ifdef SLAPD_LDBM
-       if ( strcasecmp( type, "ldbm" ) == 0 ) {
-               be->be_bind = ldbm_back_bind;
-               be->be_unbind = ldbm_back_unbind;
-               be->be_search = ldbm_back_search;
-               be->be_compare = ldbm_back_compare;
-               be->be_modify = ldbm_back_modify;
-               be->be_modrdn = ldbm_back_modrdn;
-               be->be_add = ldbm_back_add;
-               be->be_delete = ldbm_back_delete;
-               be->be_abandon = ldbm_back_abandon;
-               be->be_config = ldbm_back_config;
-               be->be_init = ldbm_back_init;
-               be->be_close = ldbm_back_close;
-#ifdef SLAPD_ACLGROUPS
-               be->be_group = ldbm_back_group;
-#endif
-               be->be_type = "ldbm";
-               foundit = 1;
+       if ( nBackendInfo > 0) {
+               backendInfo = binfo;
+               return 0;
        }
-#endif
 
-#ifdef SLAPD_PASSWD
-       if ( strcasecmp( type, "passwd" ) == 0 ) {
-               be->be_bind = NULL;
-               be->be_unbind = NULL;
-               be->be_search = passwd_back_search;
-               be->be_compare = NULL;
-               be->be_modify = NULL;
-               be->be_modrdn = NULL;
-               be->be_add = NULL;
-               be->be_delete = NULL;
-               be->be_abandon = NULL;
-               be->be_config = passwd_back_config;
-               be->be_init = NULL;
-               be->be_close = NULL;
-#ifdef SLAPD_ACLGROUPS
-               be->be_group = NULL;
-#endif
-               be->be_type = "passwd";
-               foundit = 1;
+       Debug( LDAP_DEBUG_ANY,
+               "backend_init: failed\n",
+               0, 0, 0 );
+
+
+       return rc;
+}
+
+int backend_startup(int n)
+{
+       int i;
+       int rc = 0;
+
+       if( ! ( nBackendDB > 0 ) ) {
+               /* no databases */
+               Debug( LDAP_DEBUG_ANY,
+                       "backend_startup: %d databases to startup.\n",
+                       nBackendDB, 0, 0 );
+               return 1;
        }
-#endif
 
-#ifdef SLAPD_SHELL
-       if ( strcasecmp( type, "shell" ) == 0 ) {
-               be->be_bind = shell_back_bind;
-               be->be_unbind = shell_back_unbind;
-               be->be_search = shell_back_search;
-               be->be_compare = shell_back_compare;
-               be->be_modify = shell_back_modify;
-               be->be_modrdn = shell_back_modrdn;
-               be->be_add = shell_back_add;
-               be->be_delete = shell_back_delete;
-               be->be_abandon = shell_back_abandon;
-               be->be_config = shell_back_config;
-               be->be_init = shell_back_init;
-               be->be_close = NULL;
-#ifdef SLAPD_ACLGROUPS
-               be->be_group = NULL;
-#endif
-               be->be_type = "shell";
-               foundit = 1;
+       if(n >= 0) {
+               /* startup a specific backend database */
+               Debug( LDAP_DEBUG_TRACE,
+                       "backend_startup: starting database %d\n",
+                       n, 0, 0 );
+
+               if ( backendDB[n].bd_info->bi_open ) {
+                       rc = backendDB[n].bd_info->bi_open(
+                               backendDB[n].bd_info );
+               }
+
+               if(rc != 0) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "backend_startup: bi_open failed!\n",
+                               0, 0, 0 );
+                       return rc;
+               }
+
+               if ( backendDB[n].bd_info->bi_db_open ) {
+                       rc = backendDB[n].bd_info->bi_db_open(
+                               &backendDB[n] );
+               }
+
+               if(rc != 0) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "backend_startup: bi_db_open failed!\n",
+                               0, 0, 0 );
+                       return rc;
+               }
+
+               return rc;
        }
-#endif
 
+       /* open each backend type */
+       for( i = 0; i < nBackendInfo; i++ ) {
+               if( backendInfo[i].bi_open ) {
+                       rc = backendInfo[i].bi_open(
+                               &backendInfo[i] );
+               }
 
-#ifdef SLAPD_PERL
-       if ( strcasecmp( type, "perl" ) == 0 ) {
-#ifdef notdef
-               be->be_abandon = perl_back_abandon;
-               be->be_bind = perl_back_bind;
-#else
-               be->be_abandon = NULL;
-               be->be_bind = NULL;
-#endif
-               be->be_unbind = perl_back_unbind;
-               be->be_search = perl_back_search;
-               be->be_compare = perl_back_compare;
-               be->be_modify = perl_back_modify;
-               be->be_modrdn = perl_back_modrdn;
-               be->be_add = perl_back_add;
-               be->be_delete = perl_back_delete;
-               be->be_config = perl_back_config;
-               be->be_init = perl_back_init;
-               be->be_close = perl_back_close;
-               be->be_type = "perl";
-               foundit = 1;
+               if(rc != 0) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "backend_startup: bi_open %d failed!\n",
+                               i, 0, 0 );
+                       return rc;
+               }
        }
-#endif
 
+       /* open each backend database */
+       for( i = 0; i < nBackendDB; i++ ) {
+               if ( backendDB[i].bd_info->bi_db_open ) {
+                       rc = backendDB[i].bd_info->bi_db_open(
+                               &backendDB[i] );
+               }
+
+               if(rc != 0) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "backend_startup: bi_db_open %d failed!\n",
+                               i, 0, 0 );
+                       return rc;
+               }
+       }
+
+       return rc;
+}
+
+int backend_shutdown(int n)
+{
+       int i;
+
+       if(n >= 0) {
+               /* shutdown a specific backend database */
+
+               if ( backendDB[n].bd_info->bi_db_close ) {
+                       backendDB[n].bd_info->bi_db_close(
+                               &backendDB[n] );
+               }
+
+               if( backendDB[n].bd_info->bi_close ) {
+                       backendDB[n].bd_info->bi_close(
+                               backendDB[n].bd_info );
+               }
+
+               return 0;
+       }
+
+       /* close each backend database */
+       for( i = 0; i < nBackendDB; i++ ) {
+               if ( backendDB[i].bd_info->bi_db_close ) {
+                       backendDB[i].bd_info->bi_db_close(
+                               &backendDB[i] );
+               }
+       }
+
+       /* close each backend type */
+       for( i = 0; i < nBackendInfo; i++ ) {
+               if( backendInfo[i].bi_close ) {
+                       backendInfo[i].bi_close(
+                               &backendInfo[i] );
+               }
+       }
+
+       return 0;
+}
+
+int backend_destroy(void)
+{
+       int i;
+
+       /* destroy each backend database */
+       for( i = 0; i < nBackendDB; i++ ) {
+               if ( backendDB[i].bd_info->bi_db_destroy ) {
+                       backendDB[i].bd_info->bi_db_destroy(
+                               &backendDB[i] );
+               }
+       }
 
+       /* destroy each backend type */
+       for( i = 0; i < nBackendInfo; i++ ) {
+               if( backendInfo[i].bi_close ) {
+                       backendInfo[i].bi_close(
+                               &backendInfo[i] );
+               }
+       }
+
+       return 0;
+}
+
+BackendInfo* backend_info(char *type)
+{
+       int i;
 
-       if ( be->be_init != NULL ) {
-               (*be->be_init)( be );
+       /* search for the backend type */
+       for( i = 0; i < nBackendInfo; i++ ) {
+               if( strcasecmp(backendInfo[i].bi_type, type) == 0 ) {
+                       return &backendInfo[i];
+               }
        }
 
-       if ( foundit == 0 ) {
+       return NULL;
+}
+
+
+BackendDB *
+backend_db_init(
+    char       *type
+)
+{
+       Backend *be;
+       BackendInfo *bi = backend_info(type);
+       int     rc = 0;
+
+       if( bi == NULL ) {
                fprintf( stderr, "Unrecognized database type (%s)\n", type );
-               exit( 1 );
+               return NULL;
+       }
+
+       backendDB = (BackendDB *) ch_realloc(
+                       (char *) backendDB,
+                   (nBackendDB + 1) * sizeof(Backend) );
+
+       memset( &backendDB[nbackends], '\0', sizeof(Backend) );
+
+       be = &backends[nbackends++];
+
+       be->bd_info = bi;
+       be->be_sizelimit = defsize;
+       be->be_timelimit = deftime;
+
+       if(bi->bi_db_init) {
+               rc = bi->bi_db_init( be );
+       }
+
+       if(rc != 0) {
+               fprintf( stderr, "database init failed (%s)\n", type );
+               nbackends--;
+               return NULL;
        }
 
        return( be );
 }
 
+void
+be_db_close( void )
+{
+       int     i;
+
+       for ( i = 0; i < nbackends; i++ ) {
+               if ( backends[i].bd_info->bi_db_close != NULL ) {
+                       (*backends[i].bd_info->bi_db_close)( &backends[i] );
+               }
+       }
+}
+
 Backend *
 select_backend( char * dn )
 {
@@ -270,21 +429,8 @@ be_isroot_pw( Backend *be, char *ndn, struct berval *cred )
        return result == 0;
 }
 
-void
-be_close( void )
-{
-       int     i;
-
-       for ( i = 0; i < nbackends; i++ ) {
-               if ( backends[i].be_close != NULL ) {
-                       (*backends[i].be_close)( &backends[i] );
-               }
-       }
-}
-
-
-void
-be_unbind(
+int
+backend_unbind(
        Connection   *conn,
        Operation    *op
 )
@@ -296,11 +442,13 @@ be_unbind(
                        (*backends[i].be_unbind)( &backends[i], conn, op );
                }
        }
+
+       return 0;
 }
 
 #ifdef SLAPD_ACLGROUPS
 int 
-be_group(
+backend_group(
        Backend *be,
        Entry   *target,
        char    *gr_ndn,
index b810460680585fa12a89373d58802fb0e162d673..306b6d9b83cbbbda4c19667efaea74abd585d889 100644 (file)
@@ -29,32 +29,35 @@ char   *slapd_args_file = NULL;
 
 static char    *fp_getline(FILE *fp, int *lineno);
 static void    fp_getline_init(int *lineno);
-static void    fp_parse_line(char *line, int *argcp, char **argv);
+static int     fp_parse_line(char *line, int *argcp, char **argv);
 
 static char    *strtok_quote(char *line, char *sep);
 
-void
-read_config( char *fname, Backend **bep, FILE *pfp )
+int
+read_config( char *fname )
 {
        FILE    *fp;
        char    *line, *savefname;
        int     cargc, savelineno;
        char    *cargv[MAXARGS];
        int     lineno, i;
-       Backend *be;
 
-       if ( (fp = pfp) == NULL && (fp = fopen( fname, "r" )) == NULL ) {
+       static BackendInfo *bi = NULL;
+       static BackendDB        *be = NULL;
+
+       if ( (fp = fopen( fname, "r" )) == NULL ) {
                ldap_syslog = 1;
                Debug( LDAP_DEBUG_ANY,
                    "could not open config file \"%s\" - absolute path?\n",
                    fname, 0, 0 );
                perror( fname );
-               exit( 1 );
+               return 1;
        }
 
        Debug( LDAP_DEBUG_CONFIG, "reading config file %s\n", fname, 0, 0 );
-       be = *bep;
+
        fp_getline_init( &lineno );
+
        while ( (line = fp_getline( fp, &lineno )) != NULL ) {
                /* skip comments and blank lines */
                if ( line[0] == '#' || line[0] == '\0' ) {
@@ -63,7 +66,9 @@ read_config( char *fname, Backend **bep, FILE *pfp )
 
                Debug( LDAP_DEBUG_CONFIG, "line %d (%s)\n", lineno, line, 0 );
 
-               fp_parse_line( line, &cargc, cargv );
+               if ( fp_parse_line( line, &cargc, cargv ) != 0 ) {
+                       return( 1 );
+               }
 
                if ( cargc < 1 ) {
                        Debug( LDAP_DEBUG_ANY,
@@ -72,16 +77,33 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                        continue;
                }
 
+               if ( strcasecmp( cargv[0], "backend" ) == 0 ) {
+                       if ( cargc < 2 ) {
+                               Debug( LDAP_DEBUG_ANY,
+               "%s: line %d: missing type in \"backend <type>\" line\n",
+                                   fname, lineno, 0 );
+                               return( 1 );
+                       }
+
+                       if( be != NULL ) {
+                               Debug( LDAP_DEBUG_ANY,
+"%s: line %d: backend line must appear before any database definition\n",
+                                   fname, lineno, 0 );
+                               return( 1 );
+                       }
+
+                       bi = backend_info( cargv[1] );
+
                /* start of a new database definition */
-               if ( strcasecmp( cargv[0], "database" ) == 0 ) {
+               } else if ( strcasecmp( cargv[0], "database" ) == 0 ) {
                        if ( cargc < 2 ) {
                                Debug( LDAP_DEBUG_ANY,
                "%s: line %d: missing type in \"database <type>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
-                       *bep = new_backend( cargv[1] );
-                       be = *bep;
+                       bi = NULL;
+                       be = backend_db_init( cargv[1] );
 
                /* assign a default depth limit for alias deref */
                be->be_maxDerefDepth = SLAPD_DEFAULT_MAXDEREFDEPTH; 
@@ -92,7 +114,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing file name in \"pidfile <file>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
 
                        slapd_pid_file = ch_strdup( cargv[1] );
@@ -103,7 +125,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing file name in \"argsfile <file>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
 
                        slapd_args_file = ch_strdup( cargv[1] );
@@ -114,7 +136,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing limit in \"sizelimit <limit>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                defsize = atoi( cargv[1] );
@@ -128,7 +150,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing limit in \"timelimit <limit>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                deftime = atoi( cargv[1] );
@@ -142,7 +164,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
                    "%s: line %d: missing dn in \"suffix <dn>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        } else if ( cargc > 2 ) {
                                Debug( LDAP_DEBUG_ANY,
     "%s: line %d: extra cruft after <dn> in \"suffix %s\" line (ignored)\n",
@@ -164,12 +186,12 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                 Debug( LDAP_DEBUG_ANY,
                     "%s: line %d: missing alias and aliased_dn in \"suffixAlias <alias> <aliased_dn>\" line\n",
                                     fname, lineno, 0 );
-                                exit( 1 );
+                                return( 1 );
                         } else if ( cargc < 3 ) {
                                 Debug( LDAP_DEBUG_ANY,
                     "%s: line %d: missing aliased_dn in \"suffixAlias <alias> <aliased_dn>\" line\n",
                                     fname, lineno, 0 );
-                                exit( 1 );
+                                return( 1 );
                         } else if ( cargc > 3 ) {
                                 Debug( LDAP_DEBUG_ANY,
     "%s: line %d: extra cruft in suffixAlias line (ignored)\n",
@@ -210,7 +232,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
                    "%s: line %d: missing depth in \"maxDerefDepth <depth>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                Debug( LDAP_DEBUG_ANY,
@@ -227,7 +249,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
                    "%s: line %d: missing dn in \"rootdn <dn>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                Debug( LDAP_DEBUG_ANY,
@@ -244,7 +266,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing passwd in \"rootpw <passwd>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                Debug( LDAP_DEBUG_ANY,
@@ -260,7 +282,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing on|off in \"readonly <on|off>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                Debug( LDAP_DEBUG_ANY,
@@ -280,7 +302,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
                    "%s: line %d: missing URL in \"referral <URL>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        default_referral = (char *) ch_malloc( strlen( cargv[1] )
                            + sizeof("Referral:\n") + 1 );
@@ -302,7 +324,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
     "%s: line %d: missing on|off in \"schemacheck <on|off>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( strcasecmp( cargv[1], "on" ) == 0 ) {
                                global_schemacheck = 1;
@@ -320,7 +342,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing limit in \"defaultaccess <access>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                if ( (global_default_access =
@@ -328,7 +350,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                        Debug( LDAP_DEBUG_ANY,
 "%s: line %d: bad access \"%s\" expecting [self]{none|compare|read|write}\n",
                                            fname, lineno, cargv[1] );
-                                       exit( 1 );
+                                       return( 1 );
                                }
                        } else {
                                if ( (be->be_dfltaccess =
@@ -336,7 +358,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                        Debug( LDAP_DEBUG_ANY,
 "%s: line %d: bad access \"%s\" expecting [self]{none|compare|read|write}\n",
                                            fname, lineno, cargv[1] );
-                                       exit( 1 );
+                                       return( 1 );
                                }
                        }
 
@@ -346,7 +368,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
                    "%s: line %d: missing level in \"loglevel <level>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        ldap_syslog = atoi( cargv[1] );
 
@@ -356,7 +378,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing host in \"replica <host[:port]>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                Debug( LDAP_DEBUG_ANY,
@@ -384,7 +406,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
                    "%s: line %d: missing dn in \"updatedn <dn>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be == NULL ) {
                                Debug( LDAP_DEBUG_ANY,
@@ -401,7 +423,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing dn in \"replogfile <filename>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( be ) {
                                be->be_replogfile = ch_strdup( cargv[1] );
@@ -415,7 +437,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing on|off in \"lastmod <on|off>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        if ( strcasecmp( cargv[1], "on" ) == 0 ) {
                                if ( be )
@@ -435,12 +457,15 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
     "%s: line %d: missing filename in \"include <filename>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        savefname = ch_strdup( cargv[1] );
                        savelineno = lineno;
-                       read_config( savefname, bep, NULL );
-                       be = *bep;
+
+                       if ( read_config( savefname ) != 0 ) {
+                               return( 1 );
+                       }
+
                        free( savefname );
                        lineno = savelineno - 1;
 
@@ -450,30 +475,47 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                Debug( LDAP_DEBUG_ANY,
            "%s: line %d: missing filename in \"srvtab <filename>\" line\n",
                                    fname, lineno, 0 );
-                               exit( 1 );
+                               return( 1 );
                        }
                        ldap_srvtab = ch_strdup( cargv[1] );
 
-               /* pass anything else to the current backend config routine */
+               /* pass anything else to the current backend info/db config routine */
                } else {
-                       if ( be == NULL ) {
-                               Debug( LDAP_DEBUG_ANY,
-"%s: line %d: unknown directive \"%s\" outside database definition (ignored)\n",
-                                   fname, lineno, cargv[0] );
-                       } else if ( be->be_config == NULL ) {
+                       if ( bi != NULL ) {
+                               if (bi->bi_config == NULL) {
+                                       Debug( LDAP_DEBUG_ANY,
+"%s: line %d: unknown directive \"%s\" inside backend info definition (ignored)\n",
+                                               fname, lineno, cargv[0] );
+                               } else {
+                                       if ( (*bi->bi_config)( bi, fname, lineno, cargc, cargv )
+                                               != 0 )
+                                       {
+                                               return( 1 );
+                                       }
+                               }
+                       } else if ( be != NULL ) {
+                               if ( be->be_config == NULL ) {
+                                       Debug( LDAP_DEBUG_ANY,
+"%s: line %d: unknown directive \"%s\" inside backend database definition (ignored)\n",
+                                       fname, lineno, cargv[0] );
+                               } else {
+                                       if ( (*be->be_config)( be, fname, lineno, cargc, cargv )
+                                               != 0 )
+                                       {
+                                               return( 1 );
+                                       }
+                               }
+                       } else {
                                Debug( LDAP_DEBUG_ANY,
-"%s: line %d: unknown directive \"%s\" inside database definition (ignored)\n",
+"%s: line %d: unknown directive \"%s\" outside backend info and database definitions (ignored)\n",
                                    fname, lineno, cargv[0] );
-                       } else {
-                               (*be->be_config)( be, fname, lineno, cargc,
-                                   cargv );
                        }
                }
        }
        fclose( fp );
 }
 
-static void
+static int
 fp_parse_line(
     char       *line,
     int                *argcp,
@@ -488,11 +530,12 @@ fp_parse_line(
                if ( *argcp == MAXARGS ) {
                        Debug( LDAP_DEBUG_ANY, "Too many tokens (max %d)\n",
                            MAXARGS, 0, 0 );
-                       exit( 1 );
+                       return( 1 );
                }
                argv[(*argcp)++] = token;
        }
        argv[*argcp] = NULL;
+       return 0;
 }
 
 static char *
index 8ed04295fcf5b631bb87bc3b1b6b57bac50d0ab7..aaed6b7cc444b323a3e48bde66d5e6932b47e0be 100644 (file)
@@ -390,18 +390,6 @@ slapd_daemon(
        }
        ldap_pvt_thread_mutex_unlock( &active_threads_mutex );
 
-       /* let backends do whatever cleanup they need to do */
-       Debug( LDAP_DEBUG_TRACE,
-           "slapd shutdown: closing each backends.\n",
-           0, 0, 0 );
-       be_close();
-
-       Debug( LDAP_DEBUG_TRACE,
-           "slapd shutdown: shutdown backends.\n",
-           0, 0, 0 );
-       /* be_shutdown(); */
-       Debug( LDAP_DEBUG_ANY, "slapd: stopped\n", 0, 0, 0 );
-
        return NULL;
 }
 
index 2b6cd5a7256c6d7f5bbdcae53d1565497dcd6aab..5f7e6a3ef82eee5a4aaf65ced7fd7e50e7522dca 100644 (file)
@@ -61,9 +61,38 @@ ldap_pvt_thread_mutex_t      num_sent_mutex;
 ldap_pvt_thread_mutex_t        entry2str_mutex;
 ldap_pvt_thread_mutex_t        replog_mutex;
 
-void
-init( void )
+static char* slap_name;
+int slapMode = 0;
+
+int
+slap_init( int mode, char *name )
 {
+       int rc;
+
+       if( slapMode ) {
+               Debug( LDAP_DEBUG_ANY,
+                "%s init: init called twice (old=%d, new=%d)\n",
+                name, slapMode, mode );
+               return 1;
+       }
+
+       slapMode = mode;
+
+       if(!slapMode) {
+               Debug( LDAP_DEBUG_ANY,
+                "%s init: undefined mode (%d).\n",
+                name, mode, 0 );
+               return 1;
+       }
+
+       Debug( LDAP_DEBUG_TRACE,
+               "%s init: initiated %s.\n",
+               name,
+               mode == SLAP_SERVER_MODE ? "server" : "tool",
+               0 );
+
+       slap_name = name;
+       
        (void) ldap_pvt_thread_initialize();
 
        ldap_pvt_thread_mutex_init( &active_threads_mutex );
@@ -78,4 +107,50 @@ init( void )
 #ifdef SLAPD_CRYPT
        ldap_pvt_thread_mutex_init( &crypt_mutex );
 #endif
+
+       rc = backend_init();
+
+       return rc;
+}
+
+int slap_startup(int dbnum)
+{
+       int rc;
+
+       Debug( LDAP_DEBUG_TRACE,
+               "%s startup: initiated.\n",
+               slap_name, 0, 0 );
+
+       rc = backend_startup(dbnum);
+
+       return rc;
+}
+
+int slap_shutdown(int dbnum)
+{
+       int rc;
+
+       Debug( LDAP_DEBUG_TRACE,
+               "%s shutdown: initiated\n",
+               slap_name, 0, 0 );
+
+       /* let backends do whatever cleanup they need to do */
+       rc = backend_shutdown(dbnum); 
+
+       return rc;
 }
+
+int slap_destroy(void)
+{
+       int rc;
+
+       Debug( LDAP_DEBUG_TRACE,
+               "%s shutdown: freeing system resources.\n",
+               slap_name, 0, 0 );
+
+       rc = backend_destroy();
+
+       /* should destory the above mutex */
+       return rc;
+}
+
index 3a2a136c276d1e20fae96bcd4c41f2605be64ed9..67de0a0fdacf20ce0d7e6f7113fe5148d04b08ee 100644 (file)
 #define DEFAULT_SYSLOG_USER  LOG_LOCAL4
 
 typedef struct _str2intDispatch {
-
-        char    *stringVal;
-        int      abbr;
-        int      intVal;
-
+       char    *stringVal;
+       int      abbr;
+       int      intVal;
 } STRDISP, *STRDISP_P;
 
 
 /* table to compute syslog-options to integer */
 static STRDISP  syslog_types[] = {
-
     { "LOCAL0",         6, LOG_LOCAL0 },
     { "LOCAL1",         6, LOG_LOCAL1 },
     { "LOCAL2",         6, LOG_LOCAL2 },
@@ -42,7 +39,6 @@ static STRDISP  syslog_types[] = {
     { "LOCAL6",         6, LOG_LOCAL6 },
     { "LOCAL7",         6, LOG_LOCAL7 },
     NULL
-
 };
 
 static int   cnvt_str2int();
@@ -65,10 +61,9 @@ main( int argc, char **argv )
 {
        int             i;
        int             inetd = 0;
+       int             rc = 0;
        int             port;
        int             udp;
-       Backend         *be = NULL;
-       FILE            *fp = NULL;
 #ifdef LOG_LOCAL4
     int     syslogUser = DEFAULT_SYSLOG_USER;
 #endif
@@ -171,28 +166,36 @@ main( int argc, char **argv )
                serverName = ch_strdup( serverName + 1 );
        }
 
-       if ( ! inetd ) {
-               /* pre-open config file before detach in case it is a relative path */
-               fp = fopen( configfile, "r" );
-#ifdef LDAP_DEBUG
-               lutil_detach( ldap_debug, 0 );
-#else
-               lutil_detach( 0, 0 );
-#endif
-       }
-
 #ifdef LOG_LOCAL4
        openlog( serverName, OPENLOG_OPTIONS, syslogUser );
 #else
        openlog( serverName, OPENLOG_OPTIONS );
 #endif
 
-       init();
-       read_config( configfile, &be, fp );
+       if ( slap_init( SLAP_SERVER_MODE, serverName ) != 0 ) {
+               rc = 1;
+               goto destroy;
+       }
+
+       if ( read_config( configfile ) != 0 ) {
+               rc = 1;
+               goto destroy;
+       }
+
+       if ( slap_startup(-1)  != 0 ) {
+               rc = 1;
+               goto shutdown;
+       }
 
        if ( ! inetd ) {
                int             status;
 
+#ifdef LDAP_DEBUG
+               lutil_detach( ldap_debug, 0 );
+#else
+               lutil_detach( 0, 0 );
+#endif
+
                time( &starttime );
 
                if ( status = ldap_pvt_thread_create( &listener_tid, 0,
@@ -200,13 +203,13 @@ main( int argc, char **argv )
                {
                        Debug( LDAP_DEBUG_ANY,
                            "listener ldap_pvt_thread_create failed (%d)\n", status, 0, 0 );
-                       exit( 1 );
-               }
 
-               /* wait for the listener thread to complete */
-               ldap_pvt_thread_join( listener_tid, (void *) NULL );
+                       rc = 1;
+               } else {
 
-               return 0;
+                       /* wait for the listener thread to complete */
+                       ldap_pvt_thread_join( listener_tid, (void *) NULL );
+               }
 
        } else {
                Connection              c;
@@ -288,7 +291,12 @@ main( int argc, char **argv )
                        ber_free( &ber, 1 );
                }
        }
-       return 1;
+
+shutdown:
+       slap_shutdown(-1);
+destroy:
+       slap_destroy();
+       return rc;
 }
 
 
index 6b38c81e925c4207d76b355757885b1e4de5685e..a024b9a723523aed6b791c636176fefaaae6e11d 100644 (file)
@@ -58,13 +58,27 @@ void ava_free LDAP_P(( Ava *ava, int freeit ));
  * backend.c
  */
 
-Backend * new_backend LDAP_P(( char *type ));
-Backend * select_backend LDAP_P(( char * dn ));
+int backend_init LDAP_P((void));
+int backend_startup LDAP_P((int dbnum));
+int backend_shutdown LDAP_P((int dbnum));
+int backend_destroy LDAP_P((void));
+
+BackendInfo * backend_info LDAP_P(( char *type ));
+BackendDB * backend_db_init LDAP_P(( char *type ));
+
+BackendDB * select_backend LDAP_P(( char * dn ));
+
 int be_issuffix LDAP_P(( Backend *be, char *suffix ));
 int be_isroot LDAP_P(( Backend *be, char *ndn ));
 int be_isroot_pw LDAP_P(( Backend *be, char *ndn, struct berval *cred ));
 char* be_root_dn LDAP_P(( Backend *be ));
-void be_close LDAP_P(( void ));
+
+extern int     backend_unbind LDAP_P((Connection *conn, Operation *op));
+
+extern int     backend_group LDAP_P((Backend *be,
+       Entry *target,
+       char *gr_ndn, char *op_ndn,
+       char *objectclassValue, char *groupattrName));
 
 /*
  * ch_malloc.c
@@ -90,7 +104,7 @@ char ** str2charray LDAP_P(( char *str, char *brkstr ));
  * config.c
  */
 
-void read_config LDAP_P(( char *fname, Backend **bep, FILE *pfp ));
+int read_config LDAP_P(( char *fname ));
 
 /*
  * connection.c
@@ -266,11 +280,13 @@ extern struct acl *global_acl;
 extern struct objclass *global_oc;
 extern time_t          currenttime;
 
-extern int     be_group LDAP_P((Backend *be, Entry *target,
-       char *gr_ndn, char *op_ndn,
-       char *objectclassValue, char *groupattrName));
-extern void    init LDAP_P((void));
-extern void    be_unbind LDAP_P((Connection *conn, Operation *op));
+extern int     slap_init LDAP_P((int mode, char* name));
+extern int     slap_startup LDAP_P((int dbnum));
+extern int     slap_shutdown LDAP_P((int dbnum));
+extern int     slap_destroy LDAP_P((void));
+
+extern void *  slapd_daemon LDAP_P((void *port));
+
 extern void    config_info LDAP_P((Connection *conn, Operation *op));
 extern void    do_abandon LDAP_P((Connection *conn, Operation *op));
 extern void    do_add LDAP_P((Connection *conn, Operation *op));
@@ -281,10 +297,7 @@ extern void        do_modify LDAP_P((Connection *conn, Operation *op));
 extern void    do_modrdn LDAP_P((Connection *conn, Operation *op));
 extern void    do_search LDAP_P((Connection *conn, Operation *op));
 extern void    do_unbind LDAP_P((Connection *conn, Operation *op));
-extern void *  slapd_daemon LDAP_P((void *port));
 
-extern int             nbackends;
-extern Backend         *backends;
 extern int send_search_entry LDAP_P((Backend *be, Connection *conn, Operation *op, Entry *e, char **attrs, int attrsonly));
 extern int str2result LDAP_P(( char *s, int *code, char **matched, char **info ));
 
@@ -294,64 +307,5 @@ extern int         dtblsize;
 extern time_t          starttime;
 #endif
 
-#ifdef SLAPD_LDBM
-extern int  ldbm_back_bind   LDAP_P((Backend *be,
-       Connection *c, Operation *o,
-       char *dn, int method, struct berval *cred, char** edn ));
-extern void ldbm_back_unbind LDAP_P((Backend *be, Connection *c, Operation *o ));
-extern int  ldbm_back_search LDAP_P((Backend *be, Connection *c, Operation *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly));
-extern int  ldbm_back_compare LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, Ava *ava));
-extern int  ldbm_back_modify LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, LDAPModList *ml));
-extern int  ldbm_back_modrdn LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, char *newrdn, int deleteoldrdn ));
-extern int  ldbm_back_add    LDAP_P((Backend *be, Connection *c, Operation *o, Entry *e));
-extern int  ldbm_back_delete LDAP_P((Backend *be, Connection *c, Operation *o, char *dn));
-extern void ldbm_back_abandon LDAP_P((Backend *be, Connection *c, Operation *o, int msgid));
-extern void ldbm_back_config LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv ));
-extern void ldbm_back_init   LDAP_P((Backend *be));
-extern void ldbm_back_close  LDAP_P((Backend *be));
-extern int  ldbm_back_group  LDAP_P((Backend *be, Entry *target,
-       char *gr_ndn, char *op_ndn,
-       char *objectclassValue, char *groupattrName ));
-#endif
-
-#ifdef SLAPD_PASSWD
-extern int  passwd_back_search LDAP_P((Backend *be, Connection *c, Operation *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly));
-extern void passwd_back_config LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv ));
-#endif
-
-#ifdef SLAPD_SHELL
-extern int  shell_back_bind   LDAP_P((Backend *be,
-       Connection *c, Operation *o,
-       char *dn, int method, struct berval *cred, char** edn ));
-extern void shell_back_unbind LDAP_P((Backend *be, Connection *c, Operation *o ));
-extern int  shell_back_search LDAP_P((Backend *be, Connection *c, Operation *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly));
-extern int  shell_back_compare LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, Ava *ava));
-extern int  shell_back_modify LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, LDAPModList *m));
-extern int  shell_back_modrdn LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, char *newrdn, int deleteoldrdn ));
-extern int  shell_back_add    LDAP_P((Backend *be, Connection *c, Operation *o, Entry *e));
-extern int  shell_back_delete LDAP_P((Backend *be, Connection *c, Operation *o, char *dn));
-extern void shell_back_abandon LDAP_P((Backend *be, Connection *c, Operation *o, int msgid));
-extern void shell_back_config LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv ));
-extern void shell_back_init   LDAP_P((Backend *be));
-#endif
-
-#ifdef SLAPD_PERL
-extern int perl_back_bind LDAP_P(( Backend *be,
-       Connection *conn, Operation *op,
-       char *dn, int method, struct berval *cred, char** edn ));
-extern void    perl_back_unbind LDAP_P(( Backend *be, Connection *conn, Operation *op ));
-extern int     perl_back_search LDAP_P(( Backend *be, Connection *conn, Operation *op, char *base, int scope, int deref, int sizelimit, int timelimit,  Filter *filter, char *filterstr, char **attrs, int attrsonly ));
-extern int     perl_back_compare LDAP_P((Backend *be, Connection *conn, Operation *op, char *dn, Ava   *ava ));
-extern int     perl_back_modify LDAP_P(( Backend *be, Connection *conn, Operation *op, char *dn, LDAPModList *ml ));
-extern int     perl_back_modrdn LDAP_P(( Backend *be, Connection *conn, Operation *op, char *dn, char*newrdn, int deleteoldrdn ));
-extern int     perl_back_add LDAP_P(( Backend *be, Connection *conn, Operation *op, Entry *e ));
-extern int     perl_back_delete LDAP_P(( Backend *be, Connection *conn, Operation *op, char *dn ));
-/* extern int  perl_back_abandon(); */
-extern void    perl_back_config LDAP_P(( Backend *be, char *fname, int lineno, int argc, char **argv ));
-extern void    perl_back_init LDAP_P(( Backend *be ));
-extern void    perl_back_close LDAP_P(( Backend *be ));
-/* extern int      perl_back_group(); */
-#endif 
-
 #endif /* _proto_slap */
 
index a977323860e260369975c7e450bb6b601247b999..10f0135bf2c5ae98a5b0db9db8b88c39f400d945 100644 (file)
@@ -227,18 +227,54 @@ struct objclass {
 };
 
 /*
- * represents a "database"
+ * Backend-info
+ * represents a backend 
  */
 
-typedef struct backend Backend;
-struct backend {
+typedef struct backend_info BackendInfo;       /* per backend type */
+typedef struct backend_db BackendDB;           /* per backend database */
+
+extern int nBackendInfo;
+extern int nBackendDB;
+extern BackendInfo     *backendInfo;
+extern BackendDB       *backendDB;
+
+extern int                     slapMode;       
+#define SLAP_UNDEFINED_MODE    0
+#define SLAP_SERVER_MODE       1
+#define SLAP_TOOL_MODE         2
+
+/* temporary aliases */
+typedef BackendDB Backend;
+#define nbackends nBackendDB
+#define backends backendDB
+
+struct backend_db {
+       BackendInfo     *bd_info;       /* pointer to shared backend info */
+
+       /* BackendInfo accessors */
+#define                be_config       bd_info->bi_db_config
+#define                be_type         bd_info->bi_type
+
+#define                be_bind         bd_info->bi_op_bind
+#define                be_unbind       bd_info->bi_op_unbind
+#define                be_add          bd_info->bi_op_add
+#define                be_compare      bd_info->bi_op_compare
+#define                be_delete       bd_info->bi_op_delete
+#define                be_modify       bd_info->bi_op_modify
+#define                be_modrdn       bd_info->bi_op_modrdn
+#define                be_search       bd_info->bi_op_search
+
+#define                be_group        bd_info->bi_acl_group
+
+       /* these should be renamed from be_ to bd_ */
        char    **be_suffix;    /* the DN suffixes of data in this backend */
-        char    **be_suffixAlias;       /* the DN suffix aliases of data in this backend */
+       char    **be_suffixAlias;       /* the DN suffix aliases of data in this backend */
        char    *be_root_dn;    /* the magic "root" dn for this db      */
        char    *be_root_ndn;   /* the magic "root" normalized dn for this db   */
        char    *be_root_pw;    /* the magic "root" password for this db        */
        int     be_readonly;    /* 1 => db is in "read only" mode          */
-        int     be_maxDerefDepth;       /* limit for depth of an alias deref  */
+       int     be_maxDerefDepth;       /* limit for depth of an alias deref  */
        int     be_sizelimit;   /* size limit for this backend             */
        int     be_timelimit;   /* time limit for this backend             */
        struct acl *be_acl;     /* access control list for this backend    */
@@ -247,49 +283,106 @@ struct backend {
        char    *be_replogfile; /* replication log file (in master)        */
        char    *be_update_ndn; /* allowed to make changes (in replicas)   */
        int     be_lastmod;     /* keep track of lastmodified{by,time}     */
-       char    *be_type;       /* type of database                        */
 
        void    *be_private;    /* anything the backend needs              */
+};
+
+struct backend_info {
+       char    *bi_type;       /* type of backend */
 
-       /* backend routines */
-       int     (*be_bind)   LDAP_P((Backend *be,
+       /*
+        * per backend type routines:
+        * bi_init: called to allocate a backend_info structure,
+        *              called once BEFORE configuration file is read.
+        *              bi_init() initializes this structure hence is
+        *              called directly from be_initialize()
+        * bi_config: called per 'backend' specific option
+        *              all such options must before any 'database' options
+        *              bi_config() is called only from read_config()
+        * bi_open: called to open each database, called
+        *              once AFTER configuration file is read but
+        *              BEFORE any bi_db_open() calls.
+        *              bi_open() is called from backend_startup()
+        * bi_close: called to close each database, called
+        *              once during shutdown after all bi_db_close calls.
+        *              bi_close() is called from backend_shutdown()
+        * bi_destroy: called to destroy each database, called
+        *              once during shutdown after all bi_db_destroy calls.
+        *              bi_destory() is called from backend_destroy()
+        */
+       int (*bi_init)  LDAP_P((BackendInfo *bi));
+       int     (*bi_config) LDAP_P((BackendInfo *bi,
+               char *fname, int lineno, int argc, char **argv ));
+       int (*bi_open) LDAP_P((BackendInfo *bi));
+       int (*bi_close) LDAP_P((BackendInfo *bi));
+       int (*bi_destroy) LDAP_P((BackendInfo *bi));
+
+       /*
+        * per database routines:
+        * bi_db_init: called to initialize each database,
+        *      called upon reading 'database <type>' 
+        *      called only from backend_db_init()
+        * bi_db_config: called to configure each database,
+        *  called per database to handle per database options
+        *      called only from read_config()
+        * bi_db_open: called to open each database
+        *      called once per database immediately AFTER bi_open()
+        *      calls but before daemon startup.
+        *  called only by backend_startup()
+        * bi_db_close: called to close each database
+        *      called once per database during shutdown but BEFORE
+        *  any bi_close call.
+        *  called only by backend_shutdown()
+        * bi_db_destroy: called to destroy each database
+        *  called once per database during shutdown AFTER all
+        *  bi_close calls but before bi_destory calls.
+        *  called only by backend_destory()
+        */
+       int (*bi_db_init) LDAP_P((Backend *bd));
+       int     (*bi_db_config) LDAP_P((Backend *bd,
+               char *fname, int lineno, int argc, char **argv ));
+       int (*bi_db_open) LDAP_P((Backend *bd));
+       int (*bi_db_close) LDAP_P((Backend *bd));
+       int (*bi_db_destroy) LDAP_P((Backend *db));
+
+       /* LDAP Operations Handling Routines */
+       int     (*bi_op_bind)  LDAP_P(( BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                char *dn, int method, struct berval *cred, char** edn ));
-       void    (*be_unbind) LDAP_P((Backend *be,
+       int (*bi_op_unbind) LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o ));
-       int     (*be_search) LDAP_P((Backend *be,
+       int     (*bi_op_search) LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                char *base, int scope, int deref, int slimit, int tlimit,
                Filter *f, char *filterstr, char **attrs, int attrsonly));
-       int     (*be_compare)LDAP_P((Backend *be,
+       int     (*bi_op_compare)LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                char *dn, Ava *ava));
-       int     (*be_modify) LDAP_P((Backend *be,
+       int     (*bi_op_modify) LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                char *dn, LDAPModList *m));
-       int     (*be_modrdn) LDAP_P((Backend *be,
+       int     (*bi_op_modrdn) LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                char *dn, char *newrdn, int deleteoldrdn ));
-       int     (*be_add)    LDAP_P((Backend *be,
+       int     (*bi_op_add)    LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                Entry *e));
-       int     (*be_delete) LDAP_P((Backend *be,
+       int     (*bi_op_delete) LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                char *dn));
-       /* Bug: be_abandon in unused! */
-       void    (*be_abandon)LDAP_P((Backend *be,
+       /* Bug: be_op_abandon in unused! */
+       int     (*bi_op_abandon) LDAP_P((BackendDB *bd,
                struct slap_conn *c, struct slap_op *o,
                int msgid));
-       void    (*be_config) LDAP_P((Backend *be,
-               char *fname, int lineno, int argc, char **argv ));
-       void    (*be_init)   LDAP_P((Backend *be));
-       void    (*be_close)  LDAP_P((Backend *be));
 
+       /* Auxilary Functions */
 #ifdef SLAPD_ACLGROUPS
-       int     (*be_group)  LDAP_P((Backend *be, Entry *e,
-               char *bdn, char *edn,
+       int     (*bi_acl_group)  LDAP_P((Backend *bd,
+               Entry *e, char *bdn, char *edn,
                char *objectclassValue, char *groupattrName ));
 #endif
+
+       void    *bi_private;    /* anything the backend needs */
 };
 
 /*
index afdd148ee0c6b9222c7d7da4c66be390faa58511..5fd7119dadff2e5c1d9dea6eb454b16fc6c1a642 100644 (file)
@@ -80,8 +80,9 @@ main( int argc, char **argv )
         * initialize stuff and figure out which backend we're dealing with
         */
 
-       init();
-       read_config( tailorfile, &be, NULL );
+       slap_init(SLAP_TOOL_MODE, "ldbmtest");
+       read_config( tailorfile );
+       slap_startup(-1);
 
        while ( 1 ) {
                printf( "dbtest: " );
@@ -357,6 +358,9 @@ main( int argc, char **argv )
                }
        }
 
+       slap_shutdown(-1);
+       slap_destroy();
+
        return( 0 );
 }
 
index f15fb5ac32303ad06fb6a7246edd311d8f4d29f7..484125cb90fd6f63811e800b6e808d00d322e2ff 100644 (file)
@@ -83,8 +83,8 @@ main( int argc, char **argv )
         * initialize stuff and figure out which backend we're dealing with
         */
 
-       init();
-       read_config( tailorfile, &be, NULL );
+       slap_init(SLAP_TOOL_MODE, "ldif2id2children");
+       read_config( tailorfile );
 
        if ( dbnum == -1 ) {
                for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
@@ -105,6 +105,8 @@ main( int argc, char **argv )
                fprintf( stderr, "Database number %d selected via -n is not an ldbm database\n", dbnum );
                exit( 1 );
        }
+
+       slap_startup(dbnum);
        be = &backends[dbnum];
 
        /* disable write sync'ing */
@@ -301,7 +303,9 @@ main( int argc, char **argv )
                        line[0] = '\0';
                }
        }
-       (*be->be_close)( be );
+
+       slap_shutdown(dbnum);
+       slap_destroy();
 
        exit( 0 );
 }
index 96ed84ffe3c34e1e4cf8ba25db158c9c748cb06f..25a9d9ee2033fa68a552de642b6dedda5056d5f6 100644 (file)
@@ -81,8 +81,8 @@ main( int argc, char **argv )
         * initialize stuff and figure out which backend we're dealing with
         */
 
-       init();
-       read_config( tailorfile, &be, NULL );
+       slap_init(SLAP_TOOL_MODE, "ldif2id2entry");
+       read_config( tailorfile );
 
        if ( dbnum == -1 ) {
                for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
@@ -103,6 +103,9 @@ main( int argc, char **argv )
                fprintf( stderr, "Database number %d selected via -n is not an ldbm database\n", dbnum );
                exit( 1 );
        }
+
+       slap_startup(dbnum);
+
        be = &backends[dbnum];
 
        /* disable write sync'ing */
@@ -183,7 +186,8 @@ main( int argc, char **argv )
                        line[0] = '\0';
                }
        }
-       (*be->be_close)( be );
+
+       slap_shutdown(dbnum);
 
        id++;
        sprintf( line, "%s/NEXTID",
@@ -196,5 +200,7 @@ main( int argc, char **argv )
                fclose( fp );
        }
 
+       slap_destroy();
+
        exit( 0 );
 }
index 18f497f48f607f7a70570070e35c39a3226817a0..6aa24891d7191a22cdfeb8d4e47b3804aabdb043 100644 (file)
@@ -77,8 +77,8 @@ main( int argc, char **argv )
                }
        }
 
-       init();
-       read_config( tailorfile, &be, NULL );
+       slap_init(SLAP_TOOL_MODE, ch_strdup(argv[0]));
+       read_config( tailorfile );
 
        if ( dbnum == -1 ) {
                for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
@@ -99,6 +99,9 @@ main( int argc, char **argv )
                fprintf( stderr, "Database number %d selected via -n is not an ldbm database\n", dbnum );
                exit( 1 );
        }
+
+       slap_startup(dbnum);
+
        be = &backends[dbnum];
 
        /* disable write sync'ing */
@@ -166,7 +169,9 @@ main( int argc, char **argv )
                        lcur = 0;
                }
        }
-       (*be->be_close)( be );
+
+       slap_shutdown(dbnum);
+       slap_destroy();
 
        exit( 0 );
 }
index a3714161b991a86882a2b394175174cdacce81e9..9cbdf52b378f9573bed46b992a53e29ccbdde2e4 100644 (file)
@@ -49,6 +49,7 @@ main( int argc, char **argv )
        int             lmax, lcur;
        int             dbnum;
        ID              id;
+       int             rc;
        Backend         *be = NULL;
        struct ldbminfo *li;
        struct berval   bv;
@@ -103,8 +104,13 @@ main( int argc, char **argv )
         * initialize stuff and figure out which backend we're dealing with
         */
 
-       init();
-       read_config( tailorfile, &be, NULL );
+       rc = slap_init(SLAP_TOOL_MODE, "ldif2ldbm");
+       if (rc != 0 ) {
+               fprintf( stderr, "ldif2ldbm: slap_init failed!\n");
+               exit(1);
+       }
+
+       read_config( tailorfile );
 
        if ( dbnum == -1 ) {
                for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
@@ -125,6 +131,9 @@ main( int argc, char **argv )
                fprintf( stderr, "Database number %d selected via -n is not an ldbm database\n", dbnum );
                exit( 1 );
        }
+
+       slap_startup(dbnum);
+
        be = &backends[dbnum];
 
        /* disable write sync'ing */
@@ -260,10 +269,13 @@ main( int argc, char **argv )
                        lcur = 0;
                }
        }
-       (*be->be_close)( be );
+
+       slap_shutdown(dbnum);
 
        wait4kids( -1 );
 
+       slap_destroy();
+
        exit( 0 );
 }
 
index a4a85468124237064672c122c0153230020709d9..1416393343a1c4e395298ee0d0a6d73cf3c8e98e 100644 (file)
@@ -40,7 +40,7 @@ do_unbind(
            op->o_opid, 0, 0, 0 );
 
        /* pass the unbind to all backends */
-       be_unbind( conn, op );
+       backend_unbind( conn, op );
        
        /* close the connection to the client */
        close_connection( conn, op->o_connid, op->o_opid );