summaryrefslogtreecommitdiffstats
path: root/server/tools/sss_groupadd.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/tools/sss_groupadd.c')
-rw-r--r--server/tools/sss_groupadd.c82
1 files changed, 62 insertions, 20 deletions
diff --git a/server/tools/sss_groupadd.c b/server/tools/sss_groupadd.c
index acb26f3aa..ea7320161 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);