From bb8653ba6ba4eddb7faeddd9ceb3349107f77fd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Wed, 29 Jun 2016 14:03:38 +0200
Subject: [PATCH 094/102] sssctl: use talloc with sifp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This way we completely move D-Bus memory management to talloc and
we reduce number of code lines needed to send and receive reply.
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
(cherry picked from commit 9b74009c1260e6f3b1031a6ae110bf1d957cba81)
---
src/tools/sssctl/sssctl.h | 14 +++++++++
src/tools/sssctl/sssctl_domains.c | 62 ++++++++++++++++++---------------------
src/tools/sssctl/sssctl_sifp.c | 46 +++++++++++++++++++++++++++++
3 files changed, 88 insertions(+), 34 deletions(-)
diff --git a/src/tools/sssctl/sssctl.h b/src/tools/sssctl/sssctl.h
index 72930ee5c3a1195e90c6e35768f715cbf6a1c4e1..d4e3359b0b160d12a0c2699f754989a24b2b336a 100644
--- a/src/tools/sssctl/sssctl.h
+++ b/src/tools/sssctl/sssctl.h
@@ -24,6 +24,7 @@
#include "lib/sifp/sss_sifp.h"
#include "lib/sifp/sss_sifp_dbus.h"
#include "tools/common/sss_tools.h"
+#include "sbus/sssd_dbus.h"
enum sssctl_prompt_result {
SSSCTL_PROMPT_YES,
@@ -56,6 +57,19 @@ void _sssctl_sifp_error(sss_sifp_ctx *sifp,
#define sssctl_sifp_error(sifp, error, message) \
_sssctl_sifp_error(sifp, error, _(message))
+sss_sifp_error _sssctl_sifp_send(TALLOC_CTX *mem_ctx,
+ sss_sifp_ctx *sifp,
+ DBusMessage **_reply,
+ const char *path,
+ const char *iface,
+ const char *method,
+ int first_arg_type,
+ ...);
+
+#define sssctl_sifp_send(mem_ctx, sifp, reply, path, iface, method, ...) \
+ _sssctl_sifp_send(mem_ctx, sifp, reply, path, iface, method, \
+ ##__VA_ARGS__, DBUS_TYPE_INVALID);
+
errno_t sssctl_domain_list(struct sss_cmdline *cmdline,
struct sss_tool_ctx *tool_ctx,
void *pvt);
diff --git a/src/tools/sssctl/sssctl_domains.c b/src/tools/sssctl/sssctl_domains.c
index 17ad670f39dfc045ba090210ffcfa77df713c306..40962792b84eabeb2c142f158184b17180a01669 100644
--- a/src/tools/sssctl/sssctl_domains.c
+++ b/src/tools/sssctl/sssctl_domains.c
@@ -74,47 +74,32 @@ errno_t sssctl_domain_list(struct sss_cmdline *cmdline,
}
static errno_t sssctl_domain_status_online(struct sss_tool_ctx *tool_ctx,
- const char *domain_path,
- bool force_start)
+ sss_sifp_ctx *sifp,
+ const char *domain_path)
{
- sss_sifp_ctx *sifp;
- sss_sifp_error sifp_error;
- DBusMessage *reply = NULL;
- DBusMessage *msg;
+ TALLOC_CTX *tmp_ctx;
+ sss_sifp_error error;
+ DBusMessage *reply;
bool is_online;
errno_t ret;
- if (!sssctl_start_sssd(force_start)) {
- ret = ERR_SSSD_NOT_RUNNING;
- goto done;
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
+ return ENOMEM;
}
- sifp_error = sssctl_sifp_init(tool_ctx, &sifp);
- if (sifp_error != SSS_SIFP_OK) {
- sssctl_sifp_error(sifp, sifp_error, "Unable to connect to the InfoPipe");
- ret = EFAULT;
- goto done;
- }
-
- msg = sbus_create_message(tool_ctx, SSS_SIFP_ADDRESS, domain_path,
- IFACE_IFP_DOMAINS_DOMAIN,
- IFACE_IFP_DOMAINS_DOMAIN_ISONLINE);
- if (msg == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create D-Bus message\n");
- ret = ENOMEM;
- goto done;
- }
-
- sifp_error = sss_sifp_send_message(sifp, msg, &reply);
- if (sifp_error != SSS_SIFP_OK) {
- sssctl_sifp_error(sifp, sifp_error, "Unable to get online status");
+ error = sssctl_sifp_send(tmp_ctx, sifp, &reply, domain_path,
+ IFACE_IFP_DOMAINS_DOMAIN,
+ IFACE_IFP_DOMAINS_DOMAIN_ISONLINE);
+ if (error != SSS_SIFP_OK) {
+ sssctl_sifp_error(sifp, error, "Unable to get online status");
ret = EIO;
goto done;
}
ret = sbus_parse_reply(reply, DBUS_TYPE_BOOLEAN, &is_online);
if (ret != EOK) {
- fprintf(stderr, _("Unable to get information from SSSD\n"));
goto done;
}
@@ -123,10 +108,7 @@ static errno_t sssctl_domain_status_online(struct sss_tool_ctx *tool_ctx,
ret = EOK;
done:
- if (reply != NULL) {
- dbus_message_unref(reply);
- }
-
+ talloc_free(tmp_ctx);
return ret;
}
@@ -144,6 +126,8 @@ errno_t sssctl_domain_status(struct sss_cmdline *cmdline,
void *pvt)
{
struct sssctl_domain_status_opts opts = {0};
+ sss_sifp_ctx *sifp;
+ sss_sifp_error error;
const char *path;
bool opt_set;
errno_t ret;
@@ -181,7 +165,17 @@ errno_t sssctl_domain_status(struct sss_cmdline *cmdline,
return ENOMEM;
}
- ret = sssctl_domain_status_online(tool_ctx, path, opts.force_start);
+ if (!sssctl_start_sssd(opts.force_start)) {
+ return ERR_SSSD_NOT_RUNNING;
+ }
+
+ error = sssctl_sifp_init(tool_ctx, &sifp);
+ if (error != SSS_SIFP_OK) {
+ sssctl_sifp_error(sifp, error, "Unable to connect to the InfoPipe");
+ return EFAULT;
+ }
+
+ ret = sssctl_domain_status_online(tool_ctx, sifp, path);
if (ret != EOK) {
fprintf(stderr, _("Unable to get online status\n"));
return ret;
diff --git a/src/tools/sssctl/sssctl_sifp.c b/src/tools/sssctl/sssctl_sifp.c
index e541c4b27ba38e50b209b0957c8b38f03afc891a..782a72d7ce8bbf1080c6d6ac988ffac2f432955f 100644
--- a/src/tools/sssctl/sssctl_sifp.c
+++ b/src/tools/sssctl/sssctl_sifp.c
@@ -116,3 +116,49 @@ void _sssctl_sifp_error(sss_sifp_ctx *sifp,
break;
}
}
+
+sss_sifp_error _sssctl_sifp_send(TALLOC_CTX *mem_ctx,
+ sss_sifp_ctx *sifp,
+ DBusMessage **_reply,
+ const char *path,
+ const char *iface,
+ const char *method,
+ int first_arg_type,
+ ...)
+{
+ sss_sifp_error error;
+ DBusMessage *msg;
+ dbus_bool_t bret;
+ errno_t ret;
+ va_list va;
+
+ msg = sss_sifp_create_message(path, iface, method);
+ if (msg == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create D-Bus message\n");
+ return SSS_SIFP_OUT_OF_MEMORY;
+ }
+
+ va_start(va, first_arg_type);
+ bret = dbus_message_append_args_valist(msg, first_arg_type, va);
+ va_end(va);
+ if (!bret) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build message\n");
+ error = SSS_SIFP_OUT_OF_MEMORY;
+ goto done;
+ }
+
+ error = sss_sifp_send_message(sifp, msg, _reply);
+ if (error != SSS_SIFP_OK) {
+ goto done;
+ }
+
+ ret = sbus_talloc_bound_message(mem_ctx, *_reply);
+ if (ret != EOK) {
+ error = SSS_SIFP_OUT_OF_MEMORY;
+ goto done;
+ }
+
+done:
+ dbus_message_unref(msg);
+ return error;
+}
--
2.4.11