From fa734ee402ee1f41281ac89c3a376b24ae7e9112 Mon Sep 17 00:00:00 2001 From: David Kupka Date: Wed, 7 Jan 2015 21:34:15 -0500 Subject: [PATCH] Retrieve string value from DBus property interface reply correctly. org.freedesktop.DBus.Properties.Get method always returns variant data type. The basic type inside it can't be accessed directly. --- src/getcert.c | 2 +- src/tdbusm.c | 38 ++++++++++++++++++++++++++++++++++++++ src/tdbusm.h | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/getcert.c b/src/getcert.c index 5ea5e538e5f3beb840f88e6dbe21957b155b873b..8b2cb8a937947ca3d932cc9405a82c90acefabb3 100644 --- a/src/getcert.c +++ b/src/getcert.c @@ -474,7 +474,7 @@ query_prop_s(enum cm_tdbus_type which, DBusMessage *rep; char *s; rep = query_prop(which, path, interface, prop, verbose); - if (cm_tdbusm_get_s(rep, parent, &s) != 0) { + if (cm_tdbusm_get_vs(rep, parent, &s) != 0) { s = ""; } dbus_message_unref(rep); diff --git a/src/tdbusm.c b/src/tdbusm.c index dd3e800d1a5f2fe9c2d7feff3e3938a6adb4c1ab..f7aaea82e20994a7382518153980e14fb0405453 100644 --- a/src/tdbusm.c +++ b/src/tdbusm.c @@ -175,6 +175,44 @@ cm_tdbusm_get_p(DBusMessage *msg, void *parent, char **p) } int +cm_tdbusm_get_vs(DBusMessage *msg, void *parent, char **s) +{ + DBusError err; + DBusMessageIter iter, sub_iter; + + *s = NULL; + dbus_error_init(&err); + + if (dbus_message_iter_init(msg, &iter) == FALSE) { + if (dbus_error_is_set(&err)) { + cm_log(3, "DBus error: %s", err.message); + dbus_error_free(&err); + } else { + cm_log(3, "Unknown DBus error."); + } + return -1; + } + + if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) { + dbus_message_iter_recurse(&iter, &sub_iter); + if (dbus_message_iter_get_arg_type(&sub_iter) == DBUS_TYPE_STRING) { + dbus_message_iter_get_basic(&sub_iter, s); + *s = *s ? talloc_strdup(parent, *s) : NULL; + return 0; + } + } + + if (dbus_error_is_set(&err)) { + cm_log(3, "Failed to extract data from DBus message: %s", err.message); + dbus_error_free(&err); + } else { + cm_log(3, "Failed to extract data from DBus message."); + } + *s = NULL; + return -1; +} + +int cm_tdbusm_get_s(DBusMessage *msg, void *parent, char **s) { DBusError err; diff --git a/src/tdbusm.h b/src/tdbusm.h index b926b4941985509696b965fc955b2f204ce856df..813fae2f4a4a72da512e7559b5ed437cab4766e1 100644 --- a/src/tdbusm.h +++ b/src/tdbusm.h @@ -22,6 +22,7 @@ int cm_tdbusm_get_b(DBusMessage *msg, void *parent, dbus_bool_t *b); int cm_tdbusm_get_n(DBusMessage *msg, void *parent, long *n); int cm_tdbusm_get_p(DBusMessage *msg, void *parent, char **p); int cm_tdbusm_get_s(DBusMessage *msg, void *parent, char **s); +int cm_tdbusm_get_vs(DBusMessage *msg, void *parent, char **s); int cm_tdbusm_get_bp(DBusMessage *msg, void *parent, dbus_bool_t *b, char **p); int cm_tdbusm_get_bs(DBusMessage *msg, void *parent, dbus_bool_t *b, char **s); int cm_tdbusm_get_sb(DBusMessage *msg, void *parent, char **s, dbus_bool_t *b); -- 2.1.0