diff options
author | Volker Lendecke <vl@samba.org> | 2017-05-23 12:32:24 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2017-06-15 13:19:14 +0200 |
commit | 4478cd59ad1689f8719c031766b981ae37c24212 (patch) | |
tree | 19fbf429a1d8f4321cd2a2b2bd82c6d1f199025b /source3/lib | |
parent | c400e2b54ed763d7d294368320aa339530da5852 (diff) | |
download | samba-4478cd59ad1689f8719c031766b981ae37c24212.tar.gz |
g_lock: Add g_lock_write_data
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/g_lock.c | 49 |
1 files changed, 49 insertions, 0 deletions
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<num_locks; i++) { + if (server_id_equal(&self, &locks[i].pid) && + (locks[i].lock_type == G_LOCK_WRITE)) { + break; + } + } + if (i == num_locks) { + DBG_DEBUG("Not locked by us\n"); + status = NT_STATUS_NOT_LOCKED; + goto done; + } + + status = g_lock_record_store(rec, locks, num_locks, buf, buflen); + +done: + TALLOC_FREE(locks); + TALLOC_FREE(rec); + return status; +} + struct g_lock_locks_state { int (*fn)(const char *name, void *private_data); void *private_data; |