From 35fda6c5f344e71b1ed0bd195a62161e31401149 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 10 Jul 2006 12:51:36 +0000 Subject: 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) --- source4/lib/db_wrap.c | 4 +++- source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c | 7 +++++-- source4/lib/tdb/common/open.c | 22 +++++++++++++--------- source4/lib/tdb/common/tdb.c | 2 +- source4/lib/tdb/common/tdb_private.h | 5 ++--- source4/lib/tdb/include/tdb.h | 10 +++++++--- source4/lib/tdb/tools/tdbtool.c | 5 ++++- source4/lib/tdb/tools/tdbtorture.c | 5 ++++- 8 files changed, 39 insertions(+), 21 deletions(-) (limited to 'source4/lib') 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"); } -- cgit