diff options
author | Simo Sorce <ssorce@redhat.com> | 2009-06-24 16:40:56 -0400 |
---|---|---|
committer | Simo Sorce <ssorce@redhat.com> | 2009-07-03 11:07:36 -0400 |
commit | 94ec51d8b53f636d41a879ed1d0d39127168cb21 (patch) | |
tree | e6984ad304bf81781de2b118dac189db4bb0a582 /server/tools/sss_userdel.c | |
parent | 6aca93fb4d5d39a100b900a8c297d08629407960 (diff) | |
download | sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.tar.gz sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.tar.bz2 sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.zip |
Rework transaction code to use tevent_req
This is part of a set of patches to rewrite sysdb to a hopefully better
API, that will also let use use tevent_req async style calls to manipulate
our cache.
Diffstat (limited to 'server/tools/sss_userdel.c')
-rw-r--r-- | server/tools/sss_userdel.c | 82 |
1 files changed, 65 insertions, 17 deletions
diff --git a/server/tools/sss_userdel.c b/server/tools/sss_userdel.c index 0222d00c..bb0673b0 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); |