From 1c098965a698d4a6a82352e5570470724a33ca05 Mon Sep 17 00:00:00 2001 From: David Kupka Date: Jan 08 2015 16:03:55 +0000 Subject: 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. --- diff --git a/src/getcert.c b/src/getcert.c index 54dcfdd..4b63c06 100644 --- a/src/getcert.c +++ b/src/getcert.c @@ -543,7 +543,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 dd3e800..f7aaea8 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 b926b49..813fae2 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);