From: Volker Lendecke Date: Tue, 23 May 2017 10:32:24 +0000 (+0200) Subject: g_lock: Add g_lock_write_data X-Git-Tag: ldb-1.1.31~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4478cd59ad1689f8719c031766b981ae37c24212;p=thirdparty%2Fsamba.git g_lock: Add g_lock_write_data Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/include/g_lock.h b/source3/include/g_lock.h index 998a9da8544..f79e0ceef99 100644 --- a/source3/include/g_lock.h +++ b/source3/include/g_lock.h @@ -43,6 +43,9 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name, enum g_lock_type lock_type, struct timeval timeout); NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, const char *name); +NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, const char *name, + const uint8_t *buf, size_t buflen); + NTSTATUS g_lock_do(const char *name, enum g_lock_type lock_type, struct timeval timeout, void (*fn)(void *private_data), void *private_data); diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index 4a9d22968b2..f6c35bb1bcc 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -551,6 +551,55 @@ done: return status; } +NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, const char *name, + const uint8_t *buf, size_t buflen) +{ + struct server_id self = messaging_server_id(ctx->msg); + struct db_record *rec = NULL; + struct g_lock_rec *locks = NULL; + size_t i, num_locks; + NTSTATUS status; + TDB_DATA value; + + rec = dbwrap_fetch_locked(ctx->db, talloc_tos(), + string_term_tdb_data(name)); + if (rec == NULL) { + DEBUG(10, ("fetch_locked(\"%s\") failed\n", name)); + status = NT_STATUS_INTERNAL_ERROR; + goto done; + } + + value = dbwrap_record_get_value(rec); + + status = g_lock_get_talloc(talloc_tos(), value, &locks, &num_locks, + NULL, NULL); + if (!NT_STATUS_IS_OK(status)) { + DBG_DEBUG("g_lock_get for %s failed: %s\n", name, + nt_errstr(status)); + status = NT_STATUS_FILE_INVALID; + goto done; + } + + for (i=0; i