summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2006-07-10 12:51:36 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:09:59 -0500
commit35fda6c5f344e71b1ed0bd195a62161e31401149 (patch)
tree6fd96d68dceac6bdde0ddf557b66103207e7be33
parentbfc02627ceb02046fb23c62f28dc69765c8aa8f0 (diff)
downloadsamba-35fda6c5f344e71b1ed0bd195a62161e31401149.tar.gz
samba-35fda6c5f344e71b1ed0bd195a62161e31401149.tar.bz2
samba-35fda6c5f344e71b1ed0bd195a62161e31401149.zip
r16916: Implement metze's proposed changes to the tdb logging API.
This clearly links the log function with its private pointer, and makes the argument list for tdb_open_ex a bit shorter. Andrew Bartlett (This used to be commit 5d5503e8d8a10ead3ef21a5ffda52cadb9a07727)
-rw-r--r--source4/lib/db_wrap.c4
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c7
-rw-r--r--source4/lib/tdb/common/open.c22
-rw-r--r--source4/lib/tdb/common/tdb.c2
-rw-r--r--source4/lib/tdb/common/tdb_private.h5
-rw-r--r--source4/lib/tdb/include/tdb.h10
-rw-r--r--source4/lib/tdb/tools/tdbtool.c5
-rw-r--r--source4/lib/tdb/tools/tdbtorture.c5
8 files changed, 39 insertions, 21 deletions
diff --git a/source4/lib/db_wrap.c b/source4/lib/db_wrap.c
index 4a21648403..9fabd58caa 100644
--- a/source4/lib/db_wrap.c
+++ b/source4/lib/db_wrap.c
@@ -200,6 +200,8 @@ struct tdb_wrap *tdb_wrap_open(TALLOC_CTX *mem_ctx,
int open_flags, mode_t mode)
{
struct tdb_wrap *w;
+ struct tdb_logging_context log_ctx;
+ log_ctx.log_fn = tdb_wrap_log;
for (w=tdb_list;w;w=w->next) {
if (strcmp(name, w->name) == 0) {
@@ -215,7 +217,7 @@ struct tdb_wrap *tdb_wrap_open(TALLOC_CTX *mem_ctx,
w->name = talloc_strdup(w, name);
w->tdb = tdb_open_ex(name, hash_size, tdb_flags,
- open_flags, mode, tdb_wrap_log, NULL, NULL);
+ open_flags, mode, &log_ctx, NULL);
if (w->tdb == NULL) {
talloc_free(w);
return NULL;
diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c b/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c
index 31276d3948..df9cac1307 100644
--- a/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c
+++ b/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c
@@ -63,7 +63,7 @@ static void ltdb_log_fn(struct tdb_context *tdb, enum tdb_debug_level level, con
{
va_list ap;
const char *name = tdb_name(tdb);
- struct ldb_context *ldb = talloc_get_type(tdb_logging_private(tdb), struct ldb_context);
+ struct ldb_context *ldb = talloc_get_type(tdb_get_logging_private(tdb), struct ldb_context);
enum ldb_debug_level ldb_level;
char *message;
va_start(ap, fmt);
@@ -106,6 +106,9 @@ struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx,
{
struct ltdb_wrap *w;
struct stat st;
+ struct tdb_logging_context log_ctx;
+ log_ctx.log_fn = ltdb_log_fn;
+ log_ctx.log_private = ldb;
if (stat(path, &st) == 0) {
for (w=tdb_list;w;w=w->next) {
@@ -121,7 +124,7 @@ struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx,
return NULL;
}
- w->tdb = tdb_open_ex(path, hash_size, tdb_flags, open_flags, mode, ltdb_log_fn, ldb, NULL);
+ w->tdb = tdb_open_ex(path, hash_size, tdb_flags, open_flags, mode, &log_ctx, NULL);
if (w->tdb == NULL) {
talloc_free(w);
return NULL;
diff --git a/source4/lib/tdb/common/open.c b/source4/lib/tdb/common/open.c
index 6332e34f13..ff4b38e41a 100644
--- a/source4/lib/tdb/common/open.c
+++ b/source4/lib/tdb/common/open.c
@@ -119,7 +119,7 @@ static int tdb_already_open(dev_t device,
struct tdb_context *tdb_open(const char *name, int hash_size, int tdb_flags,
int open_flags, mode_t mode)
{
- return tdb_open_ex(name, hash_size, tdb_flags, open_flags, mode, NULL, NULL, NULL);
+ return tdb_open_ex(name, hash_size, tdb_flags, open_flags, mode, NULL, NULL);
}
/* a default logging function */
@@ -131,7 +131,7 @@ static void null_log_fn(struct tdb_context *tdb, enum tdb_debug_level level, con
struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- tdb_log_func log_fn, void *log_private,
+ const struct tdb_logging_context *log_ctx,
tdb_hash_func hash_fn)
{
struct tdb_context *tdb;
@@ -151,8 +151,12 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
tdb->map_ptr = NULL;
tdb->flags = tdb_flags;
tdb->open_flags = open_flags;
- tdb->log_fn = log_fn?log_fn:null_log_fn;
- tdb->log_private = log_fn?log_private:NULL;
+ if (log_ctx) {
+ tdb->log = *log_ctx;
+ } else {
+ tdb->log.log_fn = null_log_fn;
+ tdb->log.log_private = NULL;
+ }
tdb->hash_fn = hash_fn ? hash_fn : default_tdb_hash;
/* cache the page size */
@@ -366,15 +370,15 @@ int tdb_close(struct tdb_context *tdb)
}
/* register a loging function */
-void tdb_logging_function(struct tdb_context *tdb, tdb_log_func log_fn, void *log_private)
+void tdb_set_logging_function(struct tdb_context *tdb,
+ const struct tdb_logging_context *log)
{
- tdb->log_fn = log_fn?log_fn:null_log_fn;
- tdb->log_private = log_fn?log_private:NULL;
+ tdb->log = *log;
}
-void *tdb_logging_private(struct tdb_context *tdb)
+void *tdb_get_logging_private(struct tdb_context *tdb)
{
- return tdb->log_private;
+ return tdb->log.log_private;
}
/* reopen a tdb - this can be used after a fork to ensure that we have an independent
diff --git a/source4/lib/tdb/common/tdb.c b/source4/lib/tdb/common/tdb.c
index 2513eecfb1..a052ffeb61 100644
--- a/source4/lib/tdb/common/tdb.c
+++ b/source4/lib/tdb/common/tdb.c
@@ -402,7 +402,7 @@ int tdb_fd(struct tdb_context *tdb)
*/
tdb_log_func tdb_log_fn(struct tdb_context *tdb)
{
- return tdb->log_fn;
+ return tdb->log.log_fn;
}
diff --git a/source4/lib/tdb/common/tdb_private.h b/source4/lib/tdb/common/tdb_private.h
index 90afb64b72..b3e074f978 100644
--- a/source4/lib/tdb/common/tdb_private.h
+++ b/source4/lib/tdb/common/tdb_private.h
@@ -101,7 +101,7 @@ typedef u32 tdb_off_t;
/* NB assumes there is a local variable called "tdb" that is the
* current context, also takes doubly-parenthesized print-style
* argument. */
-#define TDB_LOG(x) tdb->log_fn x
+#define TDB_LOG(x) tdb->log.log_fn x
/* lock offsets */
#define GLOBAL_LOCK 0
@@ -197,8 +197,7 @@ struct tdb_context {
struct tdb_context *next; /* all tdbs to avoid multiple opens */
dev_t device; /* uniquely identifies this tdb */
ino_t inode; /* uniquely identifies this tdb */
- tdb_log_func log_fn;
- void *log_private;
+ struct tdb_logging_context log;
unsigned int (*hash_fn)(TDB_DATA *key);
int open_flags; /* flags used in the open - needed by reopen */
unsigned int num_locks; /* number of chain locks held */
diff --git a/source4/lib/tdb/include/tdb.h b/source4/lib/tdb/include/tdb.h
index 785bbbe29b..296a946c42 100644
--- a/source4/lib/tdb/include/tdb.h
+++ b/source4/lib/tdb/include/tdb.h
@@ -83,17 +83,21 @@ typedef int (*tdb_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void
typedef void (*tdb_log_func)(struct tdb_context *, enum tdb_debug_level, const char *, ...) PRINTF_ATTRIBUTE(3, 4);
typedef unsigned int (*tdb_hash_func)(TDB_DATA *key);
+struct tdb_logging_context {
+ tdb_log_func log_fn;
+ void *log_private;
+};
+
struct tdb_context *tdb_open(const char *name, int hash_size, int tdb_flags,
int open_flags, mode_t mode);
struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- tdb_log_func log_fn, void *log_private,
+ const struct tdb_logging_context *log_ctx,
tdb_hash_func hash_fn);
-void *tdb_logging_private(struct tdb_context *tdb);
int tdb_reopen(struct tdb_context *tdb);
int tdb_reopen_all(int parent_longlived);
-void tdb_logging_function(struct tdb_context *tdb, tdb_log_func log_fn, void *log_private);
+void tdb_set_logging_function(struct tdb_context *tdb, const struct tdb_logging_context *log);
enum TDB_ERROR tdb_error(struct tdb_context *tdb);
const char *tdb_errorstr(struct tdb_context *tdb);
TDB_DATA tdb_fetch(struct tdb_context *tdb, TDB_DATA key);
diff --git a/source4/lib/tdb/tools/tdbtool.c b/source4/lib/tdb/tools/tdbtool.c
index 5aa47bd9f5..7f7dce8c3c 100644
--- a/source4/lib/tdb/tools/tdbtool.c
+++ b/source4/lib/tdb/tools/tdbtool.c
@@ -183,6 +183,9 @@ static char *get_token(int startover)
static void create_tdb(void)
{
+ struct tdb_logging_context log_ctx;
+ log_ctx.log_fn = tdb_log;
+
char *tok = get_token(1);
if (!tok) {
help();
@@ -190,7 +193,7 @@ static void create_tdb(void)
}
if (tdb) tdb_close(tdb);
tdb = tdb_open_ex(tok, 0, TDB_CLEAR_IF_FIRST,
- O_RDWR | O_CREAT | O_TRUNC, 0600, tdb_log, NULL, NULL);
+ O_RDWR | O_CREAT | O_TRUNC, 0600, log_ctx, NULL);
if (!tdb) {
printf("Could not create %s: %s\n", tok, strerror(errno));
}
diff --git a/source4/lib/tdb/tools/tdbtorture.c b/source4/lib/tdb/tools/tdbtorture.c
index 559a84d99b..d88211c4a7 100644
--- a/source4/lib/tdb/tools/tdbtorture.c
+++ b/source4/lib/tdb/tools/tdbtorture.c
@@ -237,6 +237,9 @@ static void usage(void)
extern char *optarg;
pid_t *pids;
+ struct tdb_logging_context log_ctx;
+ log_ctx.log_fn = tdb_log;
+
while ((c = getopt(argc, argv, "n:l:s:H:h")) != -1) {
switch (c) {
case 'n':
@@ -266,7 +269,7 @@ static void usage(void)
}
db = tdb_open_ex("torture.tdb", hash_size, TDB_CLEAR_IF_FIRST,
- O_RDWR | O_CREAT, 0600, tdb_log, NULL, NULL);
+ O_RDWR | O_CREAT, 0600, &log_ctx, NULL);
if (!db) {
fatal("db open failed");
}