diff options
-rw-r--r-- | lib/dbwrap/dbwrap.h | 14 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap_local_open.c | 70 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap_tdb.c | 7 | ||||
-rw-r--r-- | lib/dbwrap/wscript_build | 1 | ||||
-rw-r--r-- | source3/Makefile.in | 1 | ||||
-rw-r--r-- | source3/lib/dbwrap/dbwrap_open.c | 6 |
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; |