summaryrefslogtreecommitdiffstats
path: root/server/tools/sss_userdel.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/tools/sss_userdel.c')
-rw-r--r--server/tools/sss_userdel.c82
1 files changed, 65 insertions, 17 deletions
diff --git a/server/tools/sss_userdel.c b/server/tools/sss_userdel.c
index 0222d00cc..bb0673b0a 100644
--- a/server/tools/sss_userdel.c
+++ b/server/tools/sss_userdel.c
@@ -40,6 +40,7 @@
#endif
struct user_del_ctx {
+ struct tevent_context *ev;
struct sysdb_handle *handle;
sysdb_callback_t next_fn;
@@ -54,37 +55,81 @@ struct user_del_ctx {
bool done;
};
+static void userdel_req_done(struct tevent_req *req)
+{
+ struct user_del_ctx *data = tevent_req_callback_data(req,
+ struct user_del_ctx);
+
+ data->error = sysdb_transaction_commit_recv(req);
+ data->done = true;
+
+ talloc_zfree(data->handle);
+}
+
/* sysdb callback */
static void userdel_done(void *pvt, int error, struct ldb_result *ignore)
{
struct user_del_ctx *data = talloc_get_type(pvt, struct user_del_ctx);
+ struct tevent_req *req;
- data->done = true;
+ if (error != EOK) {
+ goto fail;
+ }
+
+ req = sysdb_transaction_commit_send(data, data->ev, data->handle);
+ if (!req) {
+ error = ENOMEM;
+ goto fail;
+ }
+ tevent_req_set_callback(req, userdel_req_done, data);
+
+ return;
- sysdb_transaction_done(data->handle, error);
+fail:
+ /* free transaction */
+ talloc_zfree(data->handle);
- if (error)
- data->error = error;
+ data->error = error;
+ data->done = true;
}
-/* sysdb_fn_t */
-static void user_del(struct sysdb_handle *handle, void *pvt)
+static void user_del_done(struct tevent_req *subreq);
+
+static void user_del(struct tevent_req *req)
{
- struct user_del_ctx *user_ctx;
+ struct user_del_ctx *data;
+ struct tevent_req *subreq;
int ret;
- user_ctx = talloc_get_type(pvt, struct user_del_ctx);
- user_ctx->handle = handle;
+ data = tevent_req_callback_data(req, struct user_del_ctx);
+
+ ret = sysdb_transaction_recv(req, data, &data->handle);
+ if (ret != EOK) {
+ return userdel_done(data, ret, NULL);
+ }
- ret = sysdb_delete_entry(handle,
- user_ctx->user_dn,
- userdel_done,
- user_ctx);
+ subreq = sysdb_delete_entry_send(data,
+ data->ev,
+ data->handle,
+ data->user_dn);
+ if (!subreq)
+ return userdel_done(data, ret, NULL);
- if(ret != EOK)
- userdel_done(user_ctx, ret, NULL);
+ tevent_req_set_callback(subreq, user_del_done, data);
}
+static void user_del_done(struct tevent_req *subreq)
+{
+ struct user_del_ctx *data = tevent_req_callback_data(subreq,
+ struct user_del_ctx);
+ int ret;
+
+ ret = sysdb_delete_entry_recv(subreq);
+
+ return userdel_done(data, ret, NULL);
+}
+
+
static int userdel_legacy(struct user_del_ctx *ctx)
{
int ret = EOK;
@@ -113,6 +158,7 @@ int main(int argc, const char **argv)
int ret = EXIT_SUCCESS;
struct user_del_ctx *user_ctx = NULL;
struct tools_ctx *ctx = NULL;
+ struct tevent_req *req;
struct sss_domain_info *dom;
struct passwd *pwd_info;
@@ -141,6 +187,7 @@ int main(int argc, const char **argv)
return ENOMEM;
}
user_ctx->ctx = ctx;
+ user_ctx->ev = ctx->ev;
/* parse user_ctx */
pc = poptGetContext(NULL, argc, argv, long_options, 0);
@@ -208,13 +255,14 @@ int main(int argc, const char **argv)
/* userdel */
- ret = sysdb_transaction(ctx, ctx->sysdb, user_del, user_ctx);
- if(ret != EOK) {
+ req = sysdb_transaction_send(ctx, ctx->ev, ctx->sysdb);
+ if (!req) {
DEBUG(1, ("Could not start transaction (%d)[%s]\n", ret, strerror(ret)));
ERROR("Transaction error. Could not remove user.\n");
ret = EXIT_FAILURE;
goto fini;
}
+ tevent_req_set_callback(req, user_del, user_ctx);
while (!user_ctx->done) {
tevent_loop_once(ctx->ev);