diff options
author | Andrew Bartlett <abartlet@samba.org> | 2011-05-04 10:28:15 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2011-05-06 07:51:24 +0200 |
commit | 14750139639b3531e57a3ca3f9e481d6e458dc06 (patch) | |
tree | 3aa3e6b64b0131b5c37700546411f0e0f18a01b8 /source3 | |
parent | f455772b99dec88ae0eafc3206d42d88de89461d (diff) | |
download | samba-14750139639b3531e57a3ca3f9e481d6e458dc06.tar.gz samba-14750139639b3531e57a3ca3f9e481d6e458dc06.tar.bz2 samba-14750139639b3531e57a3ca3f9e481d6e458dc06.zip |
lib/util Move source3 tdb_wrap_open() into the common code.
This #if _SAMBA_BUILD == 3 is very unfortunate, as it means that in
the top level build, these options are not available for these
databases. However, having two different tdb_wrap lists is a worse
fate, so this will do for now.
Andrew Bartlett
Diffstat (limited to 'source3')
-rw-r--r-- | source3/Makefile.in | 1 | ||||
-rw-r--r-- | source3/include/util_tdb.h | 8 | ||||
-rw-r--r-- | source3/lib/dbwrap_tdb.c | 1 | ||||
-rw-r--r-- | source3/lib/messages_local.c | 1 | ||||
-rw-r--r-- | source3/lib/server_mutex.c | 1 | ||||
-rw-r--r-- | source3/lib/serverid.c | 1 | ||||
-rw-r--r-- | source3/lib/util_tdb.c | 159 | ||||
-rw-r--r-- | source3/smbd/notify_internal.c | 1 | ||||
-rwxr-xr-x | source3/wscript_build | 2 |
9 files changed, 7 insertions, 168 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index bc5e76792c..54b51741e8 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -272,6 +272,7 @@ EXTRA_ALL_TARGETS = @EXTRA_ALL_TARGETS@ ###################################################################### TDB_LIB_OBJ = lib/util_tdb.o ../lib/util/util_tdb.o \ + ../lib/util/tdb_wrap.o \ lib/dbwrap.o lib/dbwrap_tdb.o \ lib/dbwrap_ctdb.o \ lib/g_lock.o \ diff --git a/source3/include/util_tdb.h b/source3/include/util_tdb.h index 3bdb6977d8..a6144ba44d 100644 --- a/source3/include/util_tdb.h +++ b/source3/include/util_tdb.h @@ -26,10 +26,6 @@ #include "../libcli/util/ntstatus.h" /* for map_nt_error_from_tdb() */ #include "../../lib/util/util_tdb.h" -struct tdb_wrap { - struct tdb_context *tdb; -}; - int tdb_chainlock_with_timeout( struct tdb_context *tdb, TDB_DATA key, unsigned int timeout); int tdb_lock_bystring_with_timeout(struct tdb_context *tdb, const char *keyval, @@ -51,10 +47,6 @@ bool tdb_pack_append(TALLOC_CTX *mem_ctx, uint8 **buf, size_t *len, struct tdb_context *tdb_open_log(const char *name, int hash_size, int tdb_flags, int open_flags, mode_t mode); -struct tdb_wrap *tdb_wrap_open(TALLOC_CTX *mem_ctx, - const char *name, int hash_size, int tdb_flags, - int open_flags, mode_t mode); - NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err); int tdb_data_cmp(TDB_DATA t1, TDB_DATA t2); diff --git a/source3/lib/dbwrap_tdb.c b/source3/lib/dbwrap_tdb.c index 4cdc1930ee..98fd255ece 100644 --- a/source3/lib/dbwrap_tdb.c +++ b/source3/lib/dbwrap_tdb.c @@ -19,6 +19,7 @@ #include "includes.h" #include "dbwrap.h" +#include "lib/util/tdb_wrap.h" struct db_tdb_ctx { struct tdb_wrap *wtdb; diff --git a/source3/lib/messages_local.c b/source3/lib/messages_local.c index 18074cdd92..f82b107bcc 100644 --- a/source3/lib/messages_local.c +++ b/source3/lib/messages_local.c @@ -45,6 +45,7 @@ #include "includes.h" #include "system/filesys.h" #include "messages.h" +#include "lib/util/tdb_wrap.h" struct messaging_tdb_context { struct messaging_context *msg_ctx; diff --git a/source3/lib/server_mutex.c b/source3/lib/server_mutex.c index 1ba9d6a65b..9d38907a20 100644 --- a/source3/lib/server_mutex.c +++ b/source3/lib/server_mutex.c @@ -20,6 +20,7 @@ #include "includes.h" #include "system/filesys.h" +#include "lib/util/tdb_wrap.h" /* For reasons known only to MS, many of their NT/Win2k versions need serialised access only. Two connections at the same time diff --git a/source3/lib/serverid.c b/source3/lib/serverid.c index f13c66e2c9..7105e179d7 100644 --- a/source3/lib/serverid.c +++ b/source3/lib/serverid.c @@ -21,6 +21,7 @@ #include "system/filesys.h" #include "serverid.h" #include "dbwrap.h" +#include "lib/util/tdb_wrap.h" struct serverid_key { pid_t pid; diff --git a/source3/lib/util_tdb.c b/source3/lib/util_tdb.c index a9290ab94a..2aff935bdf 100644 --- a/source3/lib/util_tdb.c +++ b/source3/lib/util_tdb.c @@ -482,165 +482,6 @@ int tdb_trans_delete(struct tdb_context *tdb, TDB_DATA key) return res; } -/* - Log tdb messages via DEBUG(). -*/ -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, - const char *format, ...) -{ - va_list ap; - char *ptr = NULL; - int debuglevel = 0; - int ret; - - switch (level) { - case TDB_DEBUG_FATAL: - debuglevel = 0; - break; - case TDB_DEBUG_ERROR: - debuglevel = 1; - break; - case TDB_DEBUG_WARNING: - debuglevel = 2; - break; - case TDB_DEBUG_TRACE: - debuglevel = 5; - break; - default: - debuglevel = 0; - } - - va_start(ap, format); - ret = vasprintf(&ptr, format, ap); - va_end(ap); - - if (ret != -1) { - const char *name = tdb_name(tdb); - DEBUG(debuglevel, ("tdb(%s): %s", name ? name : "unnamed", ptr)); - free(ptr); - } -} - -struct tdb_wrap_private { - struct tdb_context *tdb; - const char *name; - struct tdb_wrap_private *next, *prev; -}; - -static struct tdb_wrap_private *tdb_list; - -/* destroy the last connection to a tdb */ -static int tdb_wrap_private_destructor(struct tdb_wrap_private *w) -{ - 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, - int hash_size, - int tdb_flags, - int open_flags, - mode_t mode) -{ - struct tdb_wrap_private *result; - struct tdb_logging_context log_ctx; - - result = talloc(mem_ctx, struct tdb_wrap_private); - if (result == NULL) { - return NULL; - } - result->name = talloc_strdup(result, name); - if (result->name == NULL) { - goto fail; - } - - log_ctx.log_fn = tdb_wrap_log; - - if (!lp_use_mmap()) { - tdb_flags |= TDB_NOMMAP; - } - - if ((hash_size == 0) && (name != NULL)) { - const char *base; - base = strrchr_m(name, '/'); - - if (base != NULL) { - base += 1; - } else { - base = name; - } - hash_size = lp_parm_int(-1, "tdb_hashsize", base, 0); - } - - result->tdb = tdb_open_ex(name, hash_size, tdb_flags, - open_flags, mode, &log_ctx, NULL); - if (result->tdb == NULL) { - goto fail; - } - talloc_set_destructor(result, tdb_wrap_private_destructor); - DLIST_ADD(tdb_list, result); - return result; - -fail: - TALLOC_FREE(result); - return NULL; -} - -/* - wrapped connection to a tdb database - to close just talloc_free() the tdb_wrap pointer - */ -struct tdb_wrap *tdb_wrap_open(TALLOC_CTX *mem_ctx, - const char *name, int hash_size, int tdb_flags, - int open_flags, mode_t mode) -{ - struct tdb_wrap *result; - struct tdb_wrap_private *w; - - result = talloc(mem_ctx, struct tdb_wrap); - if (result == NULL) { - return NULL; - } - - for (w=tdb_list;w;w=w->next) { - if (strcmp(name, w->name) == 0) { - break; - } - } - - if (w == NULL) { - w = tdb_wrap_private_open(result, name, hash_size, tdb_flags, - open_flags, mode); - } else { - /* - * Correctly use talloc_reference: The tdb will be - * closed when "w" is being freed. The caller never - * sees "w", so an incorrect use of talloc_free(w) - * instead of calling talloc_unlink is not possible. - * To avoid having to refcount ourselves, "w" will - * have multiple parents that hang off all the - * tdb_wrap's being returned from here. Those parents - * can be freed without problem. - */ - if (talloc_reference(result, w) == NULL) { - goto fail; - } - } - if (w == NULL) { - goto fail; - } - result->tdb = w->tdb; - return result; -fail: - TALLOC_FREE(result); - return NULL; -} - NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err) { NTSTATUS result = NT_STATUS_INTERNAL_ERROR; diff --git a/source3/smbd/notify_internal.c b/source3/smbd/notify_internal.c index 050f931122..176fa863a5 100644 --- a/source3/smbd/notify_internal.c +++ b/source3/smbd/notify_internal.c @@ -29,6 +29,7 @@ #include "dbwrap.h" #include "smbd/smbd.h" #include "messages.h" +#include "lib/util/tdb_wrap.h" struct notify_context { struct db_context *db_recursive; diff --git a/source3/wscript_build b/source3/wscript_build index adeff836af..64df8f79ec 100755 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -961,6 +961,7 @@ bld.SAMBA3_SUBSYSTEM('ndr-util', bld.SAMBA3_SUBSYSTEM('tdb-wrap3', source='lib/util_tdb.c', + deps='tdb-wrap', vars=locals()) bld.SAMBA3_SUBSYSTEM('CHARSET3', @@ -1315,7 +1316,6 @@ bld.INSTALL_FILES('${SWATDIR}', swat_files, base_name='../swat') if not bld.env.toplevel_build: bld.SAMBA3_SUBSYSTEM('POPT_SAMBA', source='', deps='POPT_SAMBA3') - bld.SAMBA3_SUBSYSTEM('tdb-wrap', source='', deps='tdb-wrap3') bld.SAMBA3_SUBSYSTEM('errors', source='', deps='errors3') bld.SAMBA3_SUBSYSTEM('samba-util', source='', deps='DYNCONFIG') bld.SAMBA3_SUBSYSTEM('ldb', source='', deps='ldb3') |