lib: Add g_lock_dump_send/recv
authorVolker Lendecke <vl@samba.org>
Tue, 24 Mar 2020 08:54:26 +0000 (09:54 +0100)
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 e35ba4b2d3143e023f5e0d19a2c2ce39efc61303..5892f10fcd632a2a8671ccc655f1d8344f4de62e 100644 (file)
@@ -62,6 +62,19 @@ NTSTATUS g_lock_write_data(struct g_lock_ctx *ctx, TDB_DATA key,
 int g_lock_locks(struct g_lock_ctx *ctx,
                 int (*fn)(TDB_DATA key, void *private_data),
                 void *private_data);
+struct tevent_req *g_lock_dump_send(
+       TALLOC_CTX *mem_ctx,
+       struct tevent_context *ev,
+       struct g_lock_ctx *ctx,
+       TDB_DATA key,
+       void (*fn)(struct server_id exclusive,
+                  size_t num_shared,
+                  struct server_id *shared,
+                  const uint8_t *data,
+                  size_t datalen,
+                  void *private_data),
+       void *private_data);
+NTSTATUS g_lock_dump_recv(struct tevent_req *req);
 NTSTATUS g_lock_dump(struct g_lock_ctx *ctx,
                     TDB_DATA key,
                     void (*fn)(struct server_id exclusive,
index 65dc3e76f26f4897611b9693b4e6a0a63d35d1d1..d9843359dd1297902639fbe794dd1e79e96b21e8 100644 (file)
@@ -1057,6 +1057,7 @@ struct g_lock_dump_state {
                   void *private_data);
        void *private_data;
        NTSTATUS status;
+       enum dbwrap_req_state req_state;
 };
 
 static void g_lock_dump_fn(TDB_DATA key, TDB_DATA data,
@@ -1131,6 +1132,70 @@ NTSTATUS g_lock_dump(struct g_lock_ctx *ctx, TDB_DATA key,
        return NT_STATUS_OK;
 }
 
+static void g_lock_dump_done(struct tevent_req *subreq);
+
+struct tevent_req *g_lock_dump_send(
+       TALLOC_CTX *mem_ctx,
+       struct tevent_context *ev,
+       struct g_lock_ctx *ctx,
+       TDB_DATA key,
+       void (*fn)(struct server_id exclusive,
+                  size_t num_shared,
+                  struct server_id *shared,
+                  const uint8_t *data,
+                  size_t datalen,
+                  void *private_data),
+       void *private_data)
+{
+       struct tevent_req *req = NULL, *subreq = NULL;
+       struct g_lock_dump_state *state = NULL;
+
+       req = tevent_req_create(mem_ctx, &state, struct g_lock_dump_state);
+       if (req == NULL) {
+               return NULL;
+       }
+       state->mem_ctx = state;
+       state->key = key;
+       state->fn = fn;
+       state->private_data = private_data;
+
+       subreq = dbwrap_parse_record_send(
+               state,
+               ev,
+               ctx->db,
+               key,
+               g_lock_dump_fn,
+               state,
+               &state->req_state);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(subreq, g_lock_dump_done, req);
+       return req;
+}
+
+static void g_lock_dump_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct g_lock_dump_state *state = tevent_req_data(
+               req, struct g_lock_dump_state);
+       NTSTATUS status;
+
+       status = dbwrap_parse_record_recv(subreq);
+       TALLOC_FREE(subreq);
+       if (tevent_req_nterror(req, status) ||
+           tevent_req_nterror(req, state->status)) {
+               return;
+       }
+       tevent_req_done(req);
+}
+
+NTSTATUS g_lock_dump_recv(struct tevent_req *req)
+{
+       return tevent_req_simple_recv_ntstatus(req);
+}
+
 int g_lock_seqnum(struct g_lock_ctx *ctx)
 {
        return dbwrap_get_seqnum(ctx->db);