]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib: Add g_lock_writev_data
authorVolker Lendecke <vl@samba.org>
Wed, 29 Apr 2020 13:35:39 +0000 (15:35 +0200)
committerJeremy Allison <jra@samba.org>
Fri, 15 May 2020 00:48:32 +0000 (00:48 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/include/g_lock.h
source3/lib/g_lock.c

index ce811c37a5ec0abc78e1a69dd21db57a664efb28..b44586d912373a5b37a5162e9560f344b805bdaf 100644 (file)
@@ -49,6 +49,11 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, TDB_DATA key,
                     enum g_lock_type lock_type, struct timeval timeout);
 NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, TDB_DATA key);
 
+NTSTATUS g_lock_writev_data(
+       struct g_lock_ctx *ctx,
+       TDB_DATA key,
+       const TDB_DATA *dbufs,
+       size_t num_dbufs);
 NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key,
                           const uint8_t *buf, size_t buflen);
 
index 0481c21c19469d6f69e7709b5d66717c5becd1e3..8789b43feeeccd3bd994ee0c8f195a01b2f046a6 100644 (file)
@@ -892,20 +892,20 @@ NTSTATUS g_lock_unlock(struct g_lock_ctx *ctx, TDB_DATA key)
        return NT_STATUS_OK;
 }
 
-struct g_lock_write_data_state {
+struct g_lock_writev_data_state {
        TDB_DATA key;
        struct server_id self;
-       const uint8_t *data;
-       size_t datalen;
+       const TDB_DATA *dbufs;
+       size_t num_dbufs;
        NTSTATUS status;
 };
 
-static void g_lock_write_data_fn(
+static void g_lock_writev_data_fn(
        struct db_record *rec,
        TDB_DATA value,
        void *private_data)
 {
-       struct g_lock_write_data_state *state = private_data;
+       struct g_lock_writev_data_state *state = private_data;
        struct g_lock lck;
        bool exclusive;
        bool ok;
@@ -935,29 +935,35 @@ static void g_lock_write_data_fn(
        }
 
        lck.data_seqnum += 1;
-       lck.data = discard_const_p(uint8_t, state->data);
-       lck.datalen = state->datalen;
-       state->status = g_lock_store(rec, &lck, NULL, NULL, 0);
+       lck.data = NULL;
+       lck.datalen = 0;
+       state->status = g_lock_store(
+               rec, &lck, NULL, state->dbufs, state->num_dbufs);
 }
 
-NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key,
-                          const uint8_t *buf, size_t buflen)
+NTSTATUS g_lock_writev_data(
+       struct g_lock_ctx *ctx,
+       TDB_DATA key,
+       const TDB_DATA *dbufs,
+       size_t num_dbufs)
 {
-       struct g_lock_write_data_state state = {
-               .key = key, .self = messaging_server_id(ctx->msg),
-               .data = buf, .datalen = buflen
+       struct g_lock_writev_data_state state = {
+               .key = key,
+               .self = messaging_server_id(ctx->msg),
+               .dbufs = dbufs,
+               .num_dbufs = num_dbufs,
        };
        NTSTATUS status;
 
-       status = dbwrap_do_locked(ctx->db, key,
-                                 g_lock_write_data_fn, &state);
+       status = dbwrap_do_locked(
+               ctx->db, key, g_lock_writev_data_fn, &state);
        if (!NT_STATUS_IS_OK(status)) {
                DBG_WARNING("dbwrap_do_locked failed: %s\n",
                            nt_errstr(status));
                return status;
        }
        if (!NT_STATUS_IS_OK(state.status)) {
-               DBG_WARNING("g_lock_write_data_fn failed: %s\n",
+               DBG_WARNING("g_lock_writev_data_fn failed: %s\n",
                            nt_errstr(state.status));
                return state.status;
        }
@@ -965,6 +971,16 @@ NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key,
        return NT_STATUS_OK;
 }
 
+NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key,
+                          const uint8_t *buf, size_t buflen)
+{
+       TDB_DATA dbuf = {
+               .dptr = discard_const_p(uint8_t, buf),
+               .dsize = buflen,
+       };
+       return g_lock_writev_data(ctx, key, &dbuf, 1);
+}
+
 struct g_lock_locks_state {
        int (*fn)(TDB_DATA key, void *private_data);
        void *private_data;