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_groupadd.c | |
parent | 6aca93fb4d5d39a100b900a8c297d08629407960 (diff) | |
download | sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.tar.gz sssd-94ec51d8b53f636d41a879ed1d0d39127168cb21.tar.xz 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_groupadd.c')
-rw-r--r-- | server/tools/sss_groupadd.c | 82 |
1 files changed, 62 insertions, 20 deletions
diff --git a/server/tools/sss_groupadd.c b/server/tools/sss_groupadd.c index acb26f3..ea73201 100644 --- a/server/tools/sss_groupadd.c +++ b/server/tools/sss_groupadd.c @@ -44,6 +44,7 @@ #endif struct group_add_ctx { + struct tevent_context *ev; struct sysdb_handle *handle; struct sss_domain_info *domain; @@ -56,36 +57,75 @@ struct group_add_ctx { bool done; }; -/* sysdb callback */ -static void add_group_done(void *pvt, int error, struct ldb_result *ignore) +static void add_group_req_done(struct tevent_req *req) { - struct group_add_ctx *data = talloc_get_type(pvt, struct group_add_ctx); + struct group_add_ctx *data = tevent_req_callback_data(req, + struct group_add_ctx); + data->error = sysdb_transaction_commit_recv(req); data->done = true; - sysdb_transaction_done(data->handle, error); + talloc_zfree(data->handle); +} + +static void add_group_terminate(struct group_add_ctx *data, int error) +{ + struct tevent_req *req; + + if (error != EOK) { + goto fail; + } - if (error) - data->error = error; + req = sysdb_transaction_commit_send(data, data->ev, data->handle); + if (!req) { + error = ENOMEM; + goto fail; + } + tevent_req_set_callback(req, add_group_req_done, data); + + return; + +fail: + /* free transaction */ + talloc_zfree(data->handle); + + data->error = error; + data->done = true; } -/* sysdb_fn_t */ -static void add_group(struct sysdb_handle *handle, void *pvt) +static void add_group_done(struct tevent_req *subreq); + +static void add_group(struct tevent_req *req) { - struct group_add_ctx *group_ctx; + struct group_add_ctx *data = tevent_req_callback_data(req, + struct group_add_ctx); + struct tevent_req *subreq; int ret; - group_ctx = talloc_get_type(pvt, struct group_add_ctx); - group_ctx->handle = handle; + ret = sysdb_transaction_recv(req, data, &data->handle); + if (ret != EOK) { + return add_group_terminate(data, ret); + } - ret = sysdb_add_group(handle, group_ctx->domain, - group_ctx->groupname, - group_ctx->gid, - add_group_done, - group_ctx); + subreq = sysdb_add_group_send(data, data->ev, data->handle, + data->domain, data->groupname, + data->gid, NULL); + if (!subreq) { + add_group_terminate(data, ENOMEM); + } + tevent_req_set_callback(subreq, add_group_done, data); +} - if(ret != EOK) - add_group_done(group_ctx, ret, NULL); +static void add_group_done(struct tevent_req *subreq) +{ + struct group_add_ctx *data = tevent_req_callback_data(subreq, + struct group_add_ctx); + int ret; + + ret = sysdb_add_group_recv(subreq); + talloc_zfree(subreq); + + return add_group_terminate(data, ret); } static int groupadd_legacy(struct group_add_ctx *ctx) @@ -130,6 +170,7 @@ int main(int argc, const char **argv) struct sss_domain_info *dom; poptContext pc = NULL; struct tools_ctx *ctx = NULL; + struct tevent_req *req; struct group_add_ctx *group_ctx = NULL; int ret = EXIT_SUCCESS; @@ -202,13 +243,14 @@ int main(int argc, const char **argv) } /* add_group */ - ret = sysdb_transaction(ctx, ctx->sysdb, add_group, group_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 add group.\n"); ret = EXIT_FAILURE; goto fini; } + tevent_req_set_callback(req, add_group, group_ctx); while (!group_ctx->done) { tevent_loop_once(ctx->ev); |