Blame SOURCES/certmonger-dbus-string-properties.patch

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