diff options
-rw-r--r-- | source4/lib/basic.m4 | 6 | ||||
-rw-r--r-- | source4/lib/ldb/config.mk | 2 | ||||
-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 | ||||
-rw-r--r-- | source4/lib/tdb_helper.c | 67 |
7 files changed, 140 insertions, 62 deletions
diff --git a/source4/lib/basic.m4 b/source4/lib/basic.m4 index ac5f82440e..b575bad9b8 100644 --- a/source4/lib/basic.m4 +++ b/source4/lib/basic.m4 @@ -21,6 +21,6 @@ SMB_SUBSYSTEM(LIBBASIC,[lib/version.o], lib/gencache.o lib/module.o lib/mutex.o lib/ldap_escape.o lib/events.o lib/crypto/crc32.o lib/crypto/md5.o - lib/crypto/hmacmd5.o lib/crypto/md4.o - lib/tdb/tdb.o lib/tdb/spinlock.o lib/tdb/tdbutil.o],[], - [CHARSET]) + lib/crypto/hmacmd5.o lib/crypto/md4.o + lib/tdb_helper.o],[], + [LIBTDB CHARSET]) diff --git a/source4/lib/ldb/config.mk b/source4/lib/ldb/config.mk index 09d4d421fb..677c31ac28 100644 --- a/source4/lib/ldb/config.mk +++ b/source4/lib/ldb/config.mk @@ -19,6 +19,8 @@ ADD_OBJ_FILES = \ lib/ldb/ldb_tdb/ldb_index.o \ lib/ldb/ldb_tdb/ldb_match.o \ lib/ldb/ldb_tdb/ldb_cache.o +REQUIRED_SUBSYSTEMS = \ + LIBTDB # End MODULE libldb_tdb ################################################ 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); } diff --git a/source4/lib/tdb_helper.c b/source4/lib/tdb_helper.c new file mode 100644 index 0000000000..121243bd0f --- /dev/null +++ b/source4/lib/tdb_helper.c @@ -0,0 +1,67 @@ +/* + Unix SMB/CIFS implementation. + tdb utility functions + Copyright (C) Andrew Tridgell 1992-1998 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include <fnmatch.h> + +/* these are little tdb utility functions that are meant to make + dealing with a tdb database a little less cumbersome in Samba */ + + +/**************************************************************************** + Log tdb messages via DEBUG(). +****************************************************************************/ + +static void tdb_log(TDB_CONTEXT *tdb, int level, const char *format, ...) +{ + va_list ap; + char *ptr = NULL; + + va_start(ap, format); + vasprintf(&ptr, format, ap); + va_end(ap); + + if (!ptr || !*ptr) + 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; +} |