diff options
Diffstat (limited to 'source4/lib/tdb')
-rw-r--r-- | source4/lib/tdb/config.m4 | 9 | ||||
-rw-r--r-- | source4/lib/tdb/config.mk | 23 | ||||
-rw-r--r-- | source4/lib/tdb/tdb.h | 2 | ||||
-rw-r--r-- | source4/lib/tdb/tdbutil.c | 93 |
4 files changed, 68 insertions, 59 deletions
diff --git a/source4/lib/tdb/config.m4 b/source4/lib/tdb/config.m4 new file mode 100644 index 0000000000..12d88ed6a8 --- /dev/null +++ b/source4/lib/tdb/config.m4 @@ -0,0 +1,9 @@ + +SMB_SUBSYSTEM_MK(LIBTDB,lib/tdb/config.mk) + +if test x"$experimental" = x"yes"; then + SMB_LIBRARY_ENABLE(libtdb,YES) +fi + +SMB_LIBRARY_MK(libtdb,lib/tdb/config.mk) + diff --git a/source4/lib/tdb/config.mk b/source4/lib/tdb/config.mk new file mode 100644 index 0000000000..797c793ce3 --- /dev/null +++ b/source4/lib/tdb/config.mk @@ -0,0 +1,23 @@ +################################################ +# Start SUBSYSTEM LIBTDB +[SUBSYSTEM::LIBTDB] +INIT_OBJ_FILES = \ + lib/tdb/tdb.o +ADD_OBJ_FILES = \ + lib/tdb/tdbutil.o \ + lib/tdb/spinlock.o +# +# End SUBSYSTEM LIBLDB +################################################ + +################################################ +# Start LIBRARY LIBTDB +[LIBRARY::libtdb] +MAJOR_VERSION = 0 +MINOR_VERSION = 0 +RELEASE_VERSION = 1 +REQUIRED_SUBSYSTEMS = \ + LIBTDB +# +# End LIBRARY LIBLDB +################################################ diff --git a/source4/lib/tdb/tdb.h b/source4/lib/tdb/tdb.h index 281925068c..73a0ea8f83 100644 --- a/source4/lib/tdb/tdb.h +++ b/source4/lib/tdb/tdb.h @@ -105,6 +105,8 @@ typedef struct tdb_context { int open_flags; /* flags used in the open - needed by reopen */ } TDB_CONTEXT; +void tdb_debug(TDB_CONTEXT *, int , const char *, ...); + typedef int (*tdb_traverse_func)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *); typedef void (*tdb_log_func)(TDB_CONTEXT *, int , const char *, ...); diff --git a/source4/lib/tdb/tdbutil.c b/source4/lib/tdb/tdbutil.c index 4a4423d2ce..9a0e8b0c44 100644 --- a/source4/lib/tdb/tdbutil.c +++ b/source4/lib/tdb/tdbutil.c @@ -51,7 +51,7 @@ static TDB_DATA make_tdb_data(const char *dptr, size_t dsize) Lock a chain with timeout (in seconds). ****************************************************************************/ -static int tdb_chainlock_with_timeout_internal( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout, int rw_type) +static int tdb_chainlock_with_timeout_internal(TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout, int rw_type) { /* Allow tdb_chainlock to be interrupted by an alarm. */ int ret; @@ -72,8 +72,8 @@ static int tdb_chainlock_with_timeout_internal( TDB_CONTEXT *tdb, TDB_DATA key, alarm(0); CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN); if (gotalarm) { - DEBUG(0,("tdb_chainlock_with_timeout_internal: alarm (%u) timed out for key %s in tdb %s\n", - timeout, key.dptr, tdb->name )); + tdb_debug(tdb, 0, "tdb_chainlock_with_timeout_internal: alarm (%u) timed out for key %s in tdb %s\n", + timeout, key.dptr, tdb->name ); /* TODO: If we time out waiting for a lock, it might * be nice to use F_GETLK to get the pid of the * process currently holding the lock and print that @@ -89,7 +89,7 @@ static int tdb_chainlock_with_timeout_internal( TDB_CONTEXT *tdb, TDB_DATA key, Write lock a chain. Return -1 if timeout or lock failed. ****************************************************************************/ -int tdb_chainlock_with_timeout( TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout) +int tdb_chainlock_with_timeout(TDB_CONTEXT *tdb, TDB_DATA key, unsigned int timeout) { return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_WRLCK); } @@ -384,7 +384,7 @@ BOOL tdb_change_uint32_atomic(TDB_CONTEXT *tdb, const char *keystr, uint32 *oldv integers and strings. ****************************************************************************/ -size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) +size_t tdb_pack(TDB_CONTEXT *tdb, char *buf, int bufsize, const char *fmt, ...) { va_list ap; uint8 bt; @@ -452,8 +452,8 @@ size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) } break; default: - DEBUG(0,("Unknown tdb_pack format %c in %s\n", - c, fmt)); + tdb_debug(tdb, 0,"Unknown tdb_pack format %c in %s\n", + c, fmt); len = 0; break; } @@ -467,8 +467,8 @@ size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) va_end(ap); - DEBUG(18,("tdb_pack(%s, %d) -> %d\n", - fmt0, bufsize0, (int)PTR_DIFF(buf, buf0))); + tdb_debug(tdb, 18,"tdb_pack(%s, %d) -> %d\n", + fmt0, bufsize0, (int)PTR_DIFF(buf, buf0)); return PTR_DIFF(buf, buf0); } @@ -478,7 +478,7 @@ size_t tdb_pack(char *buf, int bufsize, const char *fmt, ...) integers and strings. ****************************************************************************/ -int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) +int tdb_unpack(TDB_CONTEXT *tdb, char *buf, int bufsize, const char *fmt, ...) { va_list ap; uint8 *bt; @@ -559,8 +559,8 @@ int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) memcpy(*b, buf+4, *i); break; default: - DEBUG(0,("Unknown tdb_unpack format %c in %s\n", - c, fmt)); + tdb_debug(tdb, 0, "Unknown tdb_unpack format %c in %s\n", + c, fmt); len = 0; break; @@ -572,8 +572,8 @@ int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) va_end(ap); - DEBUG(18,("tdb_unpack(%s, %d) -> %d\n", - fmt0, bufsize0, (int)PTR_DIFF(buf, buf0))); + tdb_debug(tdb, 18, "tdb_unpack(%s, %d) -> %d\n", + fmt0, bufsize0, (int)PTR_DIFF(buf, buf0)); return PTR_DIFF(buf, buf0); @@ -591,22 +591,22 @@ int tdb_unpack(char *buf, int bufsize, const char *fmt, ...) * * @return length of the packed representation of the whole structure **/ -size_t tdb_sid_pack(char* pack_buf, int bufsize, DOM_SID* sid) +size_t tdb_sid_pack(TDB_CONTEXT *tdb, char* pack_buf, int bufsize, DOM_SID* sid) { int idx; size_t len = 0; if (!sid || !pack_buf) return -1; - len += tdb_pack(pack_buf + len, bufsize - len, "bb", sid->sid_rev_num, + len += tdb_pack(tdb, pack_buf + len, bufsize - len, "bb", sid->sid_rev_num, sid->num_auths); for (idx = 0; idx < 6; idx++) { - len += tdb_pack(pack_buf + len, bufsize - len, "b", sid->id_auth[idx]); + len += tdb_pack(tdb, pack_buf + len, bufsize - len, "b", sid->id_auth[idx]); } for (idx = 0; idx < MAXSUBAUTHS; idx++) { - len += tdb_pack(pack_buf + len, bufsize - len, "d", sid->sub_auths[idx]); + len += tdb_pack(tdb, pack_buf + len, bufsize - len, "d", sid->sub_auths[idx]); } return len; @@ -622,65 +622,40 @@ size_t tdb_sid_pack(char* pack_buf, int bufsize, DOM_SID* sid) * * @return size of structure unpacked from buffer **/ -size_t tdb_sid_unpack(char* pack_buf, int bufsize, DOM_SID* sid) +size_t tdb_sid_unpack(TDB_CONTEXT *tdb, char* pack_buf, int bufsize, DOM_SID* sid) { int idx, len = 0; if (!sid || !pack_buf) return -1; - len += tdb_unpack(pack_buf + len, bufsize - len, "bb", + len += tdb_unpack(tdb, pack_buf + len, bufsize - len, "bb", &sid->sid_rev_num, &sid->num_auths); for (idx = 0; idx < 6; idx++) { - len += tdb_unpack(pack_buf + len, bufsize - len, "b", &sid->id_auth[idx]); + len += tdb_unpack(tdb, pack_buf + len, bufsize - len, "b", &sid->id_auth[idx]); } for (idx = 0; idx < MAXSUBAUTHS; idx++) { - len += tdb_unpack(pack_buf + len, bufsize - len, "d", &sid->sub_auths[idx]); + len += tdb_unpack(tdb, pack_buf + len, bufsize - len, "d", &sid->sub_auths[idx]); } return len; } + /**************************************************************************** - Log tdb messages via DEBUG(). + Print out debug messages. ****************************************************************************/ -static void tdb_log(TDB_CONTEXT *tdb, int level, const char *format, ...) +void tdb_debug(TDB_CONTEXT *tdb, int level, const char *fmt, ...) { va_list ap; - char *ptr = NULL; - - va_start(ap, format); - vasprintf(&ptr, format, ap); - va_end(ap); - - if (!ptr || !*ptr) + if (tdb->log_fn == NULL) { return; - - DEBUG(level, ("tdb(%s): %s", tdb->name ? tdb->name : "unnamed", ptr)); - SAFE_FREE(ptr); -} - -/**************************************************************************** - Like tdb_open() but also setup a logging function that redirects to - the samba DEBUG() system. -****************************************************************************/ - -TDB_CONTEXT *tdb_open_log(const char *name, int hash_size, int tdb_flags, - int open_flags, mode_t mode) -{ - TDB_CONTEXT *tdb; - - if (!lp_use_mmap()) - tdb_flags |= TDB_NOMMAP; - - tdb = tdb_open_ex(name, hash_size, tdb_flags, - open_flags, mode, tdb_log); - if (!tdb) - return NULL; - - return tdb; + } + va_start(ap, fmt); + tdb->log_fn(tdb, level, fmt, ap); + va_end(ap); } @@ -715,11 +690,11 @@ TDB_LIST_NODE *tdb_search_keys(TDB_CONTEXT *tdb, const char* pattern) /* duplicate key string to ensure null-termination */ char *key_str = (char*) strndup(key.dptr, key.dsize); if (!key_str) { - DEBUG(0, ("tdb_search_keys: strndup() failed!\n")); + tdb_debug(tdb, 0, "tdb_search_keys: strndup() failed!\n"); smb_panic("strndup failed!\n"); } - - DEBUG(18, ("checking %s for match to pattern %s\n", key_str, pattern)); + + tdb_debug(tdb, 18, "checking %s for match to pattern %s\n", key_str, pattern); next = tdb_nextkey(tdb, key); @@ -732,7 +707,7 @@ TDB_LIST_NODE *tdb_search_keys(TDB_CONTEXT *tdb, const char* pattern) DLIST_ADD_END(list, rec, TDB_LIST_NODE *); - DEBUG(18, ("checking %s matched pattern %s\n", key_str, pattern)); + tdb_debug(tdb, 18, "checking %s matched pattern %s\n", key_str, pattern); } else { free(key.dptr); } |