From c0de06865abe58c1d8e5b7e74bbebc5898d9d33d Mon Sep 17 00:00:00 2001
From: Kurt Zeilenga <kurt@openldap.org>
Date: Mon, 4 Jun 2001 19:08:38 +0000
Subject: [PATCH] Add "directory" directive to backend configuration to set
 DB_ENV directory

---
 servers/slapd/back-ldbm/back-ldbm.h |  4 +++
 servers/slapd/back-ldbm/config.c    | 42 +++++++++++++++++++++++++++++
 servers/slapd/back-ldbm/external.h  |  3 +++
 servers/slapd/back-ldbm/init.c      | 16 ++++++++---
 4 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/servers/slapd/back-ldbm/back-ldbm.h b/servers/slapd/back-ldbm/back-ldbm.h
index b1b374b1a7..04ef6c4637 100644
--- a/servers/slapd/back-ldbm/back-ldbm.h
+++ b/servers/slapd/back-ldbm/back-ldbm.h
@@ -119,6 +119,10 @@ struct ldbminfo {
 	ldap_pvt_thread_cond_t		li_dbcache_cv;
 };
 
+struct ldbm_backend_info {
+	char	*lbi_directory;
+};
+
 LDAP_END_DECL
 
 #include "proto-back-ldbm.h"
diff --git a/servers/slapd/back-ldbm/config.c b/servers/slapd/back-ldbm/config.c
index a6c3e15a5b..60c6f4609d 100644
--- a/servers/slapd/back-ldbm/config.c
+++ b/servers/slapd/back-ldbm/config.c
@@ -16,6 +16,48 @@
 #include "back-ldbm.h"
 
 
+int
+ldbm_back_config(
+    BackendInfo	*bi,
+    const char	*fname,
+    int		lineno,
+    int		argc,
+    char	**argv
+)
+{
+	int rc;
+	struct ldbm_backend_info *lbi =
+		(struct ldbm_backend_info *) bi->bi_private;
+
+	if ( lbi == NULL ) {
+		fprintf( stderr, "%s: line %d: ldbm backend info is null!\n",
+		    fname, lineno );
+		return 1;
+	}
+
+	/* directory where database files live */
+	if ( strcasecmp( argv[0], "directory" ) == 0 ) {
+		if ( argc < 2 ) {
+			fprintf( stderr,
+		"%s: line %d: missing dir in \"directory <dir>\" line\n",
+			    fname, lineno );
+			return( 1 );
+		}
+		if ( lbi->lbi_directory ) {
+			free( lbi->lbi_directory );
+		}
+		lbi->lbi_directory = ch_strdup( argv[1] );
+
+	/* anything else */
+	} else {
+		fprintf( stderr,
+"%s: line %d: unknown directive \"%s\" in ldbm backend definition (ignored)\n",
+		    fname, lineno, argv[0] );
+	}
+
+	return 0;
+}
+
 int
 ldbm_back_db_config(
     Backend	*be,
diff --git a/servers/slapd/back-ldbm/external.h b/servers/slapd/back-ldbm/external.h
index 2bdac2f069..7bb6ec4a60 100644
--- a/servers/slapd/back-ldbm/external.h
+++ b/servers/slapd/back-ldbm/external.h
@@ -13,6 +13,9 @@ 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_config LDAP_P(( BackendInfo *bi,
+	const char *fname, int lineno,
+	int argc, char **argv ));
 
 extern int	ldbm_back_db_init LDAP_P(( BackendDB *bd ));
 extern int	ldbm_back_db_open LDAP_P(( BackendDB *bd ));
diff --git a/servers/slapd/back-ldbm/init.c b/servers/slapd/back-ldbm/init.c
index e856743e11..10a849a7e3 100644
--- a/servers/slapd/back-ldbm/init.c
+++ b/servers/slapd/back-ldbm/init.c
@@ -43,7 +43,7 @@ ldbm_back_initialize(
 	bi->bi_controls = controls;
 
 	bi->bi_open = ldbm_back_open;
-	bi->bi_config = 0;
+	bi->bi_config = ldbm_back_config;
 	bi->bi_close = ldbm_back_close;
 	bi->bi_destroy = ldbm_back_destroy;
 
@@ -85,6 +85,14 @@ ldbm_back_initialize(
 	bi->bi_connection_init = 0;
 	bi->bi_connection_destroy = 0;
 
+	{
+		struct ldbm_backend_info *lbi = malloc(
+			sizeof( struct ldbm_backend_info ) );
+
+		bi->bi_private = lbi;
+		lbi->lbi_directory = NULL;
+	}
+
 	return 0;
 }
 
@@ -103,9 +111,11 @@ ldbm_back_open(
 {
 	int rc;
 
-	/* initialize the underlying database system */
-	rc = ldbm_initialize( NULL );
+	struct ldbm_backend_info *lbi
+		= (struct ldbm_backend_info *) bi->bi_private;
 
+	/* initialize the underlying database system */
+	rc = ldbm_initialize( lbi->lbi_directory );
 	return rc;
 }
 
-- 
GitLab