summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2012-06-22 15:07:36 +0930
committerRusty Russell <rusty@rustcorp.com.au>2012-06-22 07:35:17 +0200
commitfc9b2987611d7535b92288b26b09db19a0e2d78e (patch)
tree432223a076e40ca47465abfb665be5c01069601f
parent02bacf1f95046163dfb5afb40f33b37ccdf1f374 (diff)
downloadsamba-fc9b2987611d7535b92288b26b09db19a0e2d78e.tar.gz
samba-fc9b2987611d7535b92288b26b09db19a0e2d78e.tar.bz2
samba-fc9b2987611d7535b92288b26b09db19a0e2d78e.zip
util_tdb: move timeout chainlock variants from source3/lib/util/util_tdb.c
We're about to use them for dbwrap. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r--lib/util/util_tdb.c79
-rw-r--r--lib/util/util_tdb.h18
-rwxr-xr-xlib/util/wscript_build2
-rw-r--r--source3/Makefile.in25
-rw-r--r--source3/include/util_tdb.h7
-rw-r--r--source3/lib/util_tdb.c81
6 files changed, 122 insertions, 90 deletions
diff --git a/lib/util/util_tdb.c b/lib/util/util_tdb.c
index 41c9b50251..c005c82791 100644
--- a/lib/util/util_tdb.c
+++ b/lib/util/util_tdb.c
@@ -21,6 +21,7 @@
*/
#include "includes.h"
+#include "system/filesys.h"
#include "../lib/tdb/include/tdb.h"
#include "../lib/util/util_tdb.h"
@@ -301,6 +302,84 @@ int32_t tdb_change_int32_atomic(struct tdb_context *tdb, const char *keystr, int
return ret;
}
+static sig_atomic_t gotalarm;
+
+/***************************************************************
+ Signal function to tell us we timed out.
+****************************************************************/
+
+static void gotalarm_sig(int signum)
+{
+ gotalarm = 1;
+}
+
+/****************************************************************************
+ 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)
+{
+ /* Allow tdb_chainlock to be interrupted by an alarm. */
+ int ret;
+ gotalarm = 0;
+
+ if (timeout) {
+ CatchSignal(SIGALRM, gotalarm_sig);
+ tdb_setalarm_sigptr(tdb, &gotalarm);
+ alarm(timeout);
+ }
+
+ if (rw_type == F_RDLCK)
+ ret = tdb_chainlock_read(tdb, key);
+ else
+ ret = tdb_chainlock(tdb, key);
+
+ if (timeout) {
+ alarm(0);
+ tdb_setalarm_sigptr(tdb, NULL);
+ CatchSignal(SIGALRM, SIG_IGN);
+ if (gotalarm && (ret != 0)) {
+ DEBUG(0,("tdb_chainlock_with_timeout_internal: alarm (%u) timed out for key %s in tdb %s\n",
+ timeout, key.dptr, tdb_name(tdb)));
+ /* 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
+ * as part of the debugging message. -- mbp */
+ return -1;
+ }
+ }
+
+ return ret == 0 ? 0 : -1;
+}
+
+/****************************************************************************
+ Write lock a chain. Return non-zero if timeout or lock failed.
+****************************************************************************/
+
+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);
+}
+
+int tdb_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
+ int timeout)
+{
+ TDB_DATA key = string_term_tdb_data(keyval);
+
+ return tdb_chainlock_with_timeout(tdb, key, timeout);
+}
+
+/****************************************************************************
+ Read lock a chain by string. Return non-zero if timeout or lock failed.
+****************************************************************************/
+
+int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval, unsigned int timeout)
+{
+ TDB_DATA key = string_term_tdb_data(keyval);
+
+ return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_RDLCK);
+}
+
/****************************************************************************
Atomic unsigned integer change. Returns old value. To create, set initial value in *oldval.
****************************************************************************/
diff --git a/lib/util/util_tdb.h b/lib/util/util_tdb.h
index 0b6f3f18a4..d8a2333035 100644
--- a/lib/util/util_tdb.h
+++ b/lib/util/util_tdb.h
@@ -52,6 +52,24 @@ int tdb_read_lock_bystring(struct tdb_context *tdb, const char *keyval);
void tdb_read_unlock_bystring(struct tdb_context *tdb, const char *keyval);
/****************************************************************************
+ Lock a chain, with timeout.
+****************************************************************************/
+int tdb_chainlock_with_timeout( struct tdb_context *tdb, TDB_DATA key,
+ unsigned int timeout);
+
+/****************************************************************************
+ Lock a chain by string, with timeout Return non-zero if lock failed.
+****************************************************************************/
+int tdb_lock_bystring_with_timeout(struct tdb_context *tdb, const char *keyval,
+ int timeout);
+
+/****************************************************************************
+ Readlock a chain by string, with timeout Return non-zero if lock failed.
+****************************************************************************/
+int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
+ unsigned int timeout);
+
+/****************************************************************************
Fetch a int32_t value by a arbitrary blob key, return -1 if not found.
Output is int32_t in native byte order.
****************************************************************************/
diff --git a/lib/util/wscript_build b/lib/util/wscript_build
index a955ab6a48..82943a08f2 100755
--- a/lib/util/wscript_build
+++ b/lib/util/wscript_build
@@ -41,7 +41,7 @@ bld.SAMBA_SUBSYSTEM('UNIX_PRIVS',
bld.SAMBA_LIBRARY('util_tdb',
source='util_tdb.c',
local_include=False,
- public_deps='tdb talloc',
+ public_deps='tdb talloc samba-util',
private_library=True
)
diff --git a/source3/Makefile.in b/source3/Makefile.in
index f4b00a7ff0..d66f6bfd99 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -1567,7 +1567,30 @@ NTLM_AUTH_OBJ = ${NTLM_AUTH_OBJ1} \
VLP_OBJ = printing/tests/vlp.o \
- ../lib/util/util_tdb.o \
+ ../lib/util/util_tdb.o \
+ ../lib/util/signal.o \
+ ../lib/util/debug.o \
+ ../lib/util/util_strlist.o \
+ ../lib/util/fault.o \
+ ../lib/util/become_daemon.o \
+ ../lib/util/substitute.o \
+ lib/util_sec.o \
+ ../lib/util/time.o \
+ ../lib/util/charset/util_str.o \
+ ../lib/util/charset/pull_push.o \
+ ../lib/util/charset/util_unistr_w.o \
+ ../lib/util/charset/codepoints.o \
+ ../lib/util/charset/iconv.o \
+ ../lib/util/charset/weird.o \
+ ../lib/util/charset/convert_string.o \
+ ../lib/util/talloc_stack.o \
+ ../lib/util/smb_threads.o \
+ ../lib/util/xfile.o \
+ ../lib/util/util_file.o \
+ ../lib/util/util.o \
+ ../lib/util/util_str_common.o \
+ ../lib/util/data_blob.o \
+ ../dynconfig/dynconfig.o \
$(LIBSAMBAUTIL_OBJ) \
param/util.o
diff --git a/source3/include/util_tdb.h b/source3/include/util_tdb.h
index f127cea1ea..e350413cf9 100644
--- a/source3/include/util_tdb.h
+++ b/source3/include/util_tdb.h
@@ -26,13 +26,6 @@
#include "../libcli/util/ntstatus.h" /* for map_nt_error_from_tdb() */
#include "../../lib/util/util_tdb.h"
-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,
- int timeout);
-int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
- unsigned int timeout);
-
int tdb_trans_store_bystring(TDB_CONTEXT *tdb, const char *keystr,
TDB_DATA data, int flags);
int tdb_trans_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf,
diff --git a/source3/lib/util_tdb.c b/source3/lib/util_tdb.c
index 552a914eb4..c6c6d26277 100644
--- a/source3/lib/util_tdb.c
+++ b/source3/lib/util_tdb.c
@@ -31,87 +31,6 @@
/* these are little tdb utility functions that are meant to make
dealing with a tdb database a little less cumbersome in Samba */
-static SIG_ATOMIC_T gotalarm;
-
-/***************************************************************
- Signal function to tell us we timed out.
-****************************************************************/
-
-static void gotalarm_sig(int signum)
-{
- gotalarm = 1;
-}
-
-/****************************************************************************
- 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)
-{
- /* Allow tdb_chainlock to be interrupted by an alarm. */
- int ret;
- gotalarm = 0;
-
- if (timeout) {
- CatchSignal(SIGALRM, gotalarm_sig);
- tdb_setalarm_sigptr(tdb, &gotalarm);
- alarm(timeout);
- }
-
- if (rw_type == F_RDLCK)
- ret = tdb_chainlock_read(tdb, key);
- else
- ret = tdb_chainlock(tdb, key);
-
- if (timeout) {
- alarm(0);
- tdb_setalarm_sigptr(tdb, NULL);
- CatchSignal(SIGALRM, SIG_IGN);
- if (gotalarm && (ret != 0)) {
- DEBUG(0,("tdb_chainlock_with_timeout_internal: alarm (%u) timed out for key %s in tdb %s\n",
- timeout, key.dptr, tdb_name(tdb)));
- /* 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
- * as part of the debugging message. -- mbp */
- return -1;
- }
- }
-
- return ret == 0 ? 0 : -1;
-}
-
-/****************************************************************************
- Write lock a chain. Return non-zero if timeout or lock failed.
-****************************************************************************/
-
-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);
-}
-
-int tdb_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval,
- int timeout)
-{
- TDB_DATA key = string_term_tdb_data(keyval);
-
- return tdb_chainlock_with_timeout(tdb, key, timeout);
-}
-
-/****************************************************************************
- Read lock a chain by string. Return non-zero if timeout or lock failed.
-****************************************************************************/
-
-int tdb_read_lock_bystring_with_timeout(TDB_CONTEXT *tdb, const char *keyval, unsigned int timeout)
-{
- TDB_DATA key = string_term_tdb_data(keyval);
-
- return tdb_chainlock_with_timeout_internal(tdb, key, timeout, F_RDLCK);
-}
-
-
-
-
int tdb_trans_store_bystring(TDB_CONTEXT *tdb, const char *keystr,
TDB_DATA data, int flags)
{