-/*
+/*
Unix SMB/CIFS implementation.
TDB wrap functions
Copyright (C) Andrew Tridgell 2004
Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
-
+
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 "lib/util/dlinklist.h"
#include "lib/tdb_wrap/tdb_wrap.h"
#include "lib/param/param.h"
+#include "ccan/str/str.h"
-/* FIXME: TDB2 does this internally, so no need to wrap multiple opens! */
-#if BUILD_TDB2
-static void tdb_wrap_log(struct tdb_context *tdb,
- enum tdb_log_level level,
- enum TDB_ERROR ecode,
- const char *message,
- void *unused)
-{
- int dl;
- const char *name = tdb_name(tdb);
-
- switch (level) {
- case TDB_LOG_USE_ERROR:
- case TDB_LOG_ERROR:
- dl = 0;
- break;
- case TDB_LOG_WARNING:
- dl = 2;
- break;
- default:
- dl = 0;
- }
-
- DEBUG(dl, ("tdb(%s):%s: %s", name ? name : "unnamed",
- tdb_errorstr(ecode), message));
-}
-#else
/*
Log tdb messages via DEBUG().
*/
-static void tdb_wrap_log(TDB_CONTEXT *tdb, enum tdb_debug_level level,
+static void tdb_wrap_log(TDB_CONTEXT *tdb, enum tdb_debug_level level,
const char *format, ...) PRINTF_ATTRIBUTE(3,4);
-static void tdb_wrap_log(TDB_CONTEXT *tdb, enum tdb_debug_level level,
+static void tdb_wrap_log(TDB_CONTEXT *tdb, enum tdb_debug_level level,
const char *format, ...)
{
va_list ap;
break;
default:
debuglevel = 0;
- }
+ }
va_start(ap, format);
ret = vasprintf(&ptr, format, ap);
free(ptr);
}
}
-#endif
struct tdb_wrap_private {
struct tdb_context *tdb;
tdb_close(w->tdb);
DLIST_REMOVE(tdb_list, w);
return 0;
-}
+}
static struct tdb_wrap_private *tdb_wrap_private_open(TALLOC_CTX *mem_ctx,
const char *name,
struct loadparm_context *lp_ctx)
{
struct tdb_wrap_private *result;
+ struct tdb_logging_context lctx;
result = talloc(mem_ctx, struct tdb_wrap_private);
if (result == NULL) {
hash_size = lpcfg_parm_int(lp_ctx, NULL, "tdb_hashsize", base, 0);
}
- result->tdb = tdb_open_compat(name, hash_size, tdb_flags,
- open_flags, mode, tdb_wrap_log, NULL);
+ lctx.log_fn = tdb_wrap_log;
+ lctx.log_private = NULL;
+
+ result->tdb = tdb_open_ex(name, hash_size, tdb_flags,
+ open_flags, mode, &lctx, NULL);
if (result->tdb == NULL) {
goto fail;
}
struct tdb_wrap *result;
struct tdb_wrap_private *w;
+ /* If they specify a .ntdb extension, but the code hasn't been
+ * converted, we want to complain. */
+ if (name && strends(name, ".ntdb")) {
+ DEBUG(2, ("tdb(%s): This code does not yet understand ntdb. Please report.\n", name));
+ return NULL;
+ }
+
result = talloc(mem_ctx, struct tdb_wrap);
if (result == NULL) {
return NULL;