From: Volker Lendecke Date: Tue, 24 Mar 2020 08:54:26 +0000 (+0100) Subject: lib: Add g_lock_dump_send/recv X-Git-Tag: ldb-2.2.0~489 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3bf576bb2a8eaf1ede44b6327e2eb9272b73c5f9;p=thirdparty%2Fsamba.git lib: Add g_lock_dump_send/recv Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/include/g_lock.h b/source3/include/g_lock.h index e35ba4b2d31..5892f10fcd6 100644 --- a/source3/include/g_lock.h +++ b/source3/include/g_lock.h @@ -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, diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index 65dc3e76f26..d9843359dd1 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -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);