summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dbwrap/dbwrap.h14
-rw-r--r--lib/dbwrap/dbwrap_local_open.c70
-rw-r--r--lib/dbwrap/dbwrap_tdb.c7
-rw-r--r--lib/dbwrap/wscript_build1
-rw-r--r--source3/Makefile.in1
-rw-r--r--source3/lib/dbwrap/dbwrap_open.c6
6 files changed, 96 insertions, 3 deletions
diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h
index ef4ffc94d7..6c789e91a4 100644
--- a/lib/dbwrap/dbwrap.h
+++ b/lib/dbwrap/dbwrap.h
@@ -133,4 +133,18 @@ NTSTATUS dbwrap_store_bystring_upper(struct db_context *db, const char *key,
NTSTATUS dbwrap_fetch_bystring_upper(struct db_context *db, TALLOC_CTX *mem_ctx,
const char *key, TDB_DATA *value);
+/**
+ * This opens an ntdb or tdb file: you can hand it a .ntdb or .tdb extension
+ * and it will decide (based on parameter settings, or else what exists) which
+ * to use.
+ *
+ * For backwards compatibility, it takes tdb-style open flags, not ntdb!
+ */
+struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
+ struct loadparm_context *lp_ctx,
+ const char *name,
+ int hash_size, int tdb_flags,
+ int open_flags, mode_t mode,
+ enum dbwrap_lock_order lock_order);
+
#endif /* __DBWRAP_H__ */
diff --git a/lib/dbwrap/dbwrap_local_open.c b/lib/dbwrap/dbwrap_local_open.c
new file mode 100644
index 0000000000..bb0df485fb
--- /dev/null
+++ b/lib/dbwrap/dbwrap_local_open.c
@@ -0,0 +1,70 @@
+/*
+ Unix SMB/CIFS implementation.
+ Database interface wrapper: local open code.
+
+ Copyright (C) Rusty Russell 2012
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "dbwrap/dbwrap.h"
+#include "dbwrap/dbwrap_tdb.h"
+#include "tdb.h"
+#include "lib/util/util_ntdb.h"
+#include "lib/param/param.h"
+#include "system/filesys.h"
+#include "ccan/str/str.h"
+
+struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
+ struct loadparm_context *lp_ctx,
+ const char *name,
+ int hash_size, int tdb_flags,
+ int open_flags, mode_t mode,
+ enum dbwrap_lock_order lock_order)
+{
+ TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+ const char *ntdbname, *tdbname;
+ struct db_context *db = NULL;
+
+ /* Get both .ntdb and .tdb variants of the name. */
+ if (!name) {
+ tdbname = ntdbname = "unnamed database";
+ } else if (strends(name, ".tdb")) {
+ tdbname = name;
+ ntdbname = talloc_asprintf(tmp_ctx,
+ "%.*s.ntdb",
+ (int)strlen(name) - 4, name);
+ } else if (strends(name, ".ntdb")) {
+ ntdbname = name;
+ tdbname = talloc_asprintf(tmp_ctx,
+ "%.*s.tdb",
+ (int)strlen(name) - 5, name);
+ } else {
+ ntdbname = tdbname = name;
+ }
+
+ if (ntdbname == NULL || tdbname == NULL) {
+ DEBUG(0, ("talloc failed\n"));
+ goto out;
+ }
+
+ /* We currently always open a tdb, not an ntdb. */
+ db = db_open_tdb(mem_ctx, lp_ctx, tdbname, hash_size,
+ tdb_flags, open_flags, mode,
+ lock_order);
+out:
+ talloc_free(tmp_ctx);
+ return db;
+}
diff --git a/lib/dbwrap/dbwrap_tdb.c b/lib/dbwrap/dbwrap_tdb.c
index ece7b9d8b5..1452ff7e8a 100644
--- a/lib/dbwrap/dbwrap_tdb.c
+++ b/lib/dbwrap/dbwrap_tdb.c
@@ -24,6 +24,7 @@
#include "lib/tdb_wrap/tdb_wrap.h"
#include "lib/util/util_tdb.h"
#include "system/filesys.h"
+#include "ccan/str/str.h"
struct db_tdb_ctx {
struct tdb_wrap *wtdb;
@@ -385,6 +386,12 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
struct db_tdb_ctx *db_tdb;
struct stat st;
+ /* Extra paranoia. */
+ if (name && strends(name, ".ntdb")) {
+ DEBUG(0, ("can't try to open %s with tdb!\n", name));
+ return NULL;
+ }
+
result = talloc_zero(mem_ctx, struct db_context);
if (result == NULL) {
DEBUG(0, ("talloc failed\n"));
diff --git a/lib/dbwrap/wscript_build b/lib/dbwrap/wscript_build
index d172efbb6e..3b247b3b5b 100644
--- a/lib/dbwrap/wscript_build
+++ b/lib/dbwrap/wscript_build
@@ -5,6 +5,7 @@ bld.SAMBA_LIBRARY('dbwrap',
dbwrap_rbt.c
dbwrap_cache.c
dbwrap_tdb.c
+ dbwrap_local_open.c
''',
deps='samba-util util_tdb errors tdb tdb-wrap',
private_library=True)
diff --git a/source3/Makefile.in b/source3/Makefile.in
index d66f6bfd99..abdeb72d62 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -263,6 +263,7 @@ EXTRA_ALL_TARGETS = @EXTRA_ALL_TARGETS@
TDB_LIB_OBJ = lib/util_tdb.o ../lib/util/util_tdb.o \
../lib/tdb_wrap/tdb_wrap.o \
../lib/dbwrap/dbwrap.o \
+ ../lib/dbwrap/dbwrap_local_open.o \
lib/dbwrap/dbwrap_open.o \
../lib/dbwrap/dbwrap_tdb.o \
lib/dbwrap/dbwrap_ctdb.o \
diff --git a/source3/lib/dbwrap/dbwrap_open.c b/source3/lib/dbwrap/dbwrap_open.c
index b7e6bd586f..e5adab7eaa 100644
--- a/source3/lib/dbwrap/dbwrap_open.c
+++ b/source3/lib/dbwrap/dbwrap_open.c
@@ -119,9 +119,9 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
if (result == NULL) {
struct loadparm_context *lp_ctx = loadparm_init_s3(mem_ctx, loadparm_s3_context());
- result = db_open_tdb(mem_ctx, lp_ctx, name, hash_size,
- tdb_flags, open_flags, mode,
- lock_order);
+ result = dbwrap_local_open(mem_ctx, lp_ctx, name, hash_size,
+ tdb_flags, open_flags, mode,
+ lock_order);
talloc_unlink(mem_ctx, lp_ctx);
}
return result;