summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2016-06-29 14:03:38 +0200
committerLukas Slebodnik <lslebodn@redhat.com>2016-08-16 14:39:11 +0200
commit9b74009c1260e6f3b1031a6ae110bf1d957cba81 (patch)
tree6738f9314deb7d010612a2e464e41d923d3fcc41 /src/tools
parent439e08cdc5c83b3e5835cb0435983f1da2ffbaf1 (diff)
downloadsssd-9b74009c1260e6f3b1031a6ae110bf1d957cba81.tar.gz
sssd-9b74009c1260e6f3b1031a6ae110bf1d957cba81.tar.xz
sssd-9b74009c1260e6f3b1031a6ae110bf1d957cba81.zip
sssctl: use talloc with sifp
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>
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/sssctl/sssctl.h14
-rw-r--r--src/tools/sssctl/sssctl_domains.c62
-rw-r--r--src/tools/sssctl/sssctl_sifp.c46
3 files changed, 88 insertions, 34 deletions
diff --git a/src/tools/sssctl/sssctl.h b/src/tools/sssctl/sssctl.h
index 72930ee5c..d4e3359b0 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 17ad670f3..40962792b 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;
- }
-
- 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;
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
+ return ENOMEM;
}
- 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 e541c4b27..782a72d7c 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;
+}