summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2017-05-23 12:32:24 +0200
committerVolker Lendecke <vl@samba.org>2017-06-15 13:19:14 +0200
commit4478cd59ad1689f8719c031766b981ae37c24212 (patch)
tree19fbf429a1d8f4321cd2a2b2bd82c6d1f199025b /source3/lib
parentc400e2b54ed763d7d294368320aa339530da5852 (diff)
downloadsamba-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.c49
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;