File libnih-dbus-codegen-empty-lists.patch of Package libnih

Author: Stéphane Graber <stgraber@ubuntu.com>, Steve Langasek <steve.langasek@canonical.com>
Description: Update dbus code generator to allow for empty lists for type 'as'
 This drops the != NULL check for NULL terminated arrays and moves the
 iteration loop inside an 'if' statement.

Index: libnih-1.0.3/nih-dbus-tool/marshal.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
+++ libnih-1.0.3/nih-dbus-tool/marshal.c
@@ -364,6 +364,7 @@
 	nih_local TypeVar *element_len_var = NULL;
 	nih_local char *   block = NULL;
 	nih_local char *   vars_block = NULL;
+	nih_local char *   loop_block = NULL;
 
 	nih_assert (iter != NULL);
 	nih_assert (iter_name != NULL);
@@ -448,7 +449,7 @@
 	nih_list_add (locals, &array_iter_var->entry);
 
 	if (dbus_type_is_fixed (element_type)) {
-		if (! nih_strcat_sprintf (&code, parent,
+		if (! nih_strcat_sprintf (&loop_block, parent,
 					  "for (size_t %s = 0; %s < %s; %s++) {\n",
 					  loop_name, loop_name, len_name, loop_name)) {
 			nih_free (code);
@@ -456,6 +457,12 @@
 		}
 	} else {
 		if (! nih_strcat_sprintf (&code, parent,
+					  "if (%s) {\n",
+					  name)) {
+			nih_free (code);
+			return NULL;
+		}
+		if (! nih_strcat_sprintf (&loop_block, parent,
 					  "for (size_t %s = 0; %s[%s]; %s++) {\n",
 					  loop_name, name, loop_name, loop_name)) {
 			nih_free (code);
@@ -576,7 +583,7 @@
 	}
 
 
-	if (! nih_strcat_sprintf (&code, parent,
+	if (! nih_strcat_sprintf (&loop_block, parent,
 			   "%s"
 			   "\n"
 			   "%s"
@@ -590,9 +597,34 @@
 	}
 
 	/* Close the container again */
+	if (! nih_strcat_sprintf (&loop_block, parent,
+				  "}\n")) {
+		nih_free (code);
+		return NULL;
+	}
+
+	if (dbus_type_is_fixed (element_type)) {
+		if (! nih_strcat_sprintf (&code, parent,
+				 "%s\n", loop_block)) {
+			nih_free (code);
+			return NULL;
+		}
+	}
+	else {
+		if (! indent (&loop_block, NULL, 1)) {
+			nih_free (code);
+			return NULL;
+		}
+
+		if (! nih_strcat_sprintf (&code, parent,
+				 "%s"
+				 "}\n\n", loop_block)) {
+			nih_free (code);
+			return NULL;
+		}
+	}
+
 	if (! nih_strcat_sprintf (&code, parent,
-				  "}\n"
-				  "\n"
 				  "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
 				  "%s"
 				  "}\n",
Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
@@ -88,17 +88,19 @@
 			goto enomem;
 		}
 
-		for (size_t output_i = 0; output[output_i]; output_i++) {
-			const char *output_element;
+		if (output) {
+			for (size_t output_i = 0; output[output_i]; output_i++) {
+				const char *output_element;
 
-			output_element = output[output_i];
+				output_element = output[output_i];
 
-			/* Marshal a char * onto the message */
-			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-				dbus_message_iter_abandon_container (&iter, &output_iter);
-				dbus_message_unref (reply);
-				reply = NULL;
-				goto enomem;
+				/* Marshal a char * onto the message */
+				if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+					dbus_message_iter_abandon_container (&iter, &output_iter);
+					dbus_message_unref (reply);
+					reply = NULL;
+					goto enomem;
+				}
 			}
 		}
 
Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
@@ -136,17 +136,19 @@
 			goto enomem;
 		}
 
-		for (size_t output_i = 0; output[output_i]; output_i++) {
-			const char *output_element;
+		if (output) {
+			for (size_t output_i = 0; output[output_i]; output_i++) {
+				const char *output_element;
 
-			output_element = output[output_i];
+				output_element = output[output_i];
 
-			/* Marshal a char * onto the message */
-			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-				dbus_message_iter_abandon_container (&iter, &output_iter);
-				dbus_message_unref (reply);
-				reply = NULL;
-				goto enomem;
+				/* Marshal a char * onto the message */
+				if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+					dbus_message_iter_abandon_container (&iter, &output_iter);
+					dbus_message_unref (reply);
+					reply = NULL;
+					goto enomem;
+				}
 			}
 		}
 
Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
@@ -7,7 +7,6 @@
 	DBusMessageIter output_iter;
 
 	nih_assert (message != NULL);
-	nih_assert (output != NULL);
 
 	/* If the sender doesn't care about a reply, don't bother wasting
 	 * effort constructing and sending one.
@@ -28,16 +27,18 @@
 		return -1;
 	}
 
-	for (size_t output_i = 0; output[output_i]; output_i++) {
-		const char *output_element;
-
-		output_element = output[output_i];
-
-		/* Marshal a char * onto the message */
-		if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-			dbus_message_iter_abandon_container (&iter, &output_iter);
-			dbus_message_unref (reply);
-			return -1;
+	if (output) {
+		for (size_t output_i = 0; output[output_i]; output_i++) {
+			const char *output_element;
+
+			output_element = output[output_i];
+
+			/* Marshal a char * onto the message */
+			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+				dbus_message_iter_abandon_container (&iter, &output_iter);
+				dbus_message_unref (reply);
+				return -1;
+			}
 		}
 	}
 
Index: libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
@@ -7,7 +7,6 @@
 	DBusMessageIter output_iter;
 
 	nih_assert (message != NULL);
-	nih_assert (output != NULL);
 
 	/* If the sender doesn't care about a reply, don't bother wasting
 	 * effort constructing and sending one.
@@ -28,16 +27,18 @@
 		return -1;
 	}
 
-	for (size_t output_i = 0; output[output_i]; output_i++) {
-		const char *output_element;
-
-		output_element = output[output_i];
-
-		/* Marshal a char * onto the message */
-		if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-			dbus_message_iter_abandon_container (&iter, &output_iter);
-			dbus_message_unref (reply);
-			return -1;
+	if (output) {
+		for (size_t output_i = 0; output[output_i]; output_i++) {
+			const char *output_element;
+
+			output_element = output[output_i];
+
+			/* Marshal a char * onto the message */
+			if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
+				dbus_message_iter_abandon_container (&iter, &output_iter);
+				dbus_message_unref (reply);
+				return -1;
+			}
 		}
 	}
 
Index: libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
@@ -14185,6 +14185,57 @@
 	}
 
 
+	/* Check that we can pass a NULL pointer for the array.
+	 */
+	TEST_FEATURE ("with NULL array pointer");
+	TEST_ALLOC_FAIL {
+		dbus_error_init (&dbus_error);
+		dbus_bus_add_match (client_conn, "type='signal'", &dbus_error);
+		assert (! dbus_error_is_set (&dbus_error));
+		dbus_error_free (&dbus_error);
+
+		ret = my_test_emit_new_str_array (server_conn,
+						  "/com/netsplit/Nih/Test",
+						  NULL);
+
+		if (test_alloc_failed) {
+			TEST_LT (ret, 0);
+
+			dbus_error_init (&dbus_error);
+			dbus_bus_remove_match (client_conn, "type='signal'",
+					       &dbus_error);
+			assert (! dbus_error_is_set (&dbus_error));
+			dbus_error_free (&dbus_error);
+
+			continue;
+		}
+
+		dbus_connection_flush (server_conn);
+
+		TEST_DBUS_MESSAGE (client_conn, signal);
+		TEST_TRUE (dbus_message_is_signal (
+				   signal, "com.netsplit.Nih.Test", "NewStrArray"));
+		TEST_EQ_STR (dbus_message_get_signature (signal),
+			     (DBUS_TYPE_ARRAY_AS_STRING
+			      DBUS_TYPE_STRING_AS_STRING));
+
+		dbus_message_iter_init (signal, &iter);
+
+		dbus_message_iter_recurse (&iter, &subiter);
+
+		TEST_EQ (dbus_message_iter_get_arg_type (&subiter),
+			 DBUS_TYPE_INVALID);
+
+		dbus_message_unref (signal);
+
+		dbus_error_init (&dbus_error);
+		dbus_bus_remove_match (client_conn, "type='signal'",
+				       &dbus_error);
+		assert (! dbus_error_is_set (&dbus_error));
+		dbus_error_free (&dbus_error);
+	}
+
+
 	/* Check that we can give an empty array consisting of just the
 	 * NULL pointer.
 	 */
Index: libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
+++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
@@ -1479,39 +1479,41 @@
 				   "\treturn -1;\n"
 				   "}\n"
 				   "\n"
-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-				   "\tDBusMessageIter value_element_iter;\n"
-				   "\tconst int16_t * value_element;\n"
-				   "\tsize_t          value_element_len;\n"
+				   "if (value) {\n"
+				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
+				   "\t\tDBusMessageIter value_element_iter;\n"
+				   "\t\tconst int16_t * value_element;\n"
+				   "\t\tsize_t          value_element_len;\n"
 				   "\n"
-				   "\tvalue_element = value[value_i];\n"
-				   "\tvalue_element_len = value_len[value_i];\n"
+				   "\t\tvalue_element = value[value_i];\n"
+				   "\t\tvalue_element_len = value_len[value_i];\n"
 				   "\n"
 
-				   "\t/* Marshal an array onto the message */\n"
-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal an array onto the message */\n"
+				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
-				   "\t\tint16_t value_element_element;\n"
+				   "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
+				   "\t\t\tint16_t value_element_element;\n"
 				   "\n"
-				   "\t\tvalue_element_element = value_element[value_element_i];\n"
+				   "\t\t\tvalue_element_element = value_element[value_element_i];\n"
 				   "\n"
-				   "\t\t/* Marshal a int16_t onto the message */\n"
-				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
-				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\t/* Marshal a int16_t onto the message */\n"
+				   "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
+				   "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\t\treturn -1;\n"
+				   "\t\t\t}\n"
+				   "\t\t}\n"
+				   "\n"
+				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
 				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
 				   "\t\t\treturn -1;\n"
 				   "\t\t}\n"
-				   "\t}\n"
-				   "\n"
-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
 
+				   "\t}\n"
 				   "}\n"
 				   "\n"
 				   "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
@@ -1766,15 +1768,17 @@
 				   "\treturn -1;\n"
 				   "}\n"
 				   "\n"
-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-				   "\tconst char *value_element;\n"
+				   "if (value) {\n"
+				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
+				   "\t\tconst char *value_element;\n"
 				   "\n"
-				   "\tvalue_element = value[value_i];\n"
+				   "\t\tvalue_element = value[value_i];\n"
 				   "\n"
-				   "\t/* Marshal a char * onto the message */\n"
-				   "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
+				   "\t\t/* Marshal a char * onto the message */\n"
+				   "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\t}\n"
 				   "}\n"
 				   "\n"
@@ -1933,35 +1937,39 @@
 				   "\treturn -1;\n"
 				   "}\n"
 				   "\n"
-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-				   "\tDBusMessageIter value_element_iter;\n"
-				   "\tchar * const *  value_element;\n"
+				   "if (value) {\n"
+				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
+				   "\t\tDBusMessageIter value_element_iter;\n"
+				   "\t\tchar * const *  value_element;\n"
 				   "\n"
-				   "\tvalue_element = value[value_i];\n"
+				   "\t\tvalue_element = value[value_i];\n"
 				   "\n"
-				   "\t/* Marshal an array onto the message */\n"
-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
-				   "\n"
-				   "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
-				   "\t\tconst char *value_element_element;\n"
+				   "\t\t/* Marshal an array onto the message */\n"
+				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\t\tvalue_element_element = value_element[value_element_i];\n"
+				   "\t\tif (value_element) {\n"
+				   "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
+				   "\t\t\t\tconst char *value_element_element;\n"
+				   "\n"
+				   "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
+				   "\n"
+				   "\t\t\t\t/* Marshal a char * onto the message */\n"
+				   "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
+				   "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\t\t\treturn -1;\n"
+				   "\t\t\t\t}\n"
+				   "\t\t\t}\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\t\t/* Marshal a char * onto the message */\n"
-				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
-				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
 				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
 				   "\t\t\treturn -1;\n"
 				   "\t\t}\n"
 				   "\t}\n"
-				   "\n"
-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
 				   "}\n"
 				   "\n"
 				   "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
@@ -2194,16 +2202,18 @@
 				   "\treturn -1;\n"
 				   "}\n"
 				   "\n"
-				   "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
-				   "\tconst char *value_item2_element;\n"
+				   "if (value_item2) {\n"
+				   "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
+				   "\t\tconst char *value_item2_element;\n"
 				   "\n"
-				   "\tvalue_item2_element = value_item2[value_item2_i];\n"
+				   "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
 				   "\n"
-				   "\t/* Marshal a char * onto the message */\n"
-				   "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
+				   "\t\t/* Marshal a char * onto the message */\n"
+				   "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\t}\n"
 				   "}\n"
 				   "\n"
@@ -2642,41 +2652,43 @@
 				   "\treturn -1;\n"
 				   "}\n"
 				   "\n"
-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-				   "\tDBusMessageIter                  value_element_iter;\n"
-				   "\tconst char *                     value_element_item0;\n"
-				   "\tuint32_t                         value_element_item1;\n"
-				   "\tconst MyStructArrayValueElement *value_element;\n"
+				   "if (value) {\n"
+				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
+				   "\t\tDBusMessageIter                  value_element_iter;\n"
+				   "\t\tconst char *                     value_element_item0;\n"
+				   "\t\tuint32_t                         value_element_item1;\n"
+				   "\t\tconst MyStructArrayValueElement *value_element;\n"
 				   "\n"
-				   "\tvalue_element = value[value_i];\n"
+				   "\t\tvalue_element = value[value_i];\n"
 				   "\n"
-				   "\t/* Marshal a structure onto the message */\n"
-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal a structure onto the message */\n"
+				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tvalue_element_item0 = value_element->item0;\n"
+				   "\t\tvalue_element_item0 = value_element->item0;\n"
 				   "\n"
-				   "\t/* Marshal a char * onto the message */\n"
-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal a char * onto the message */\n"
+				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tvalue_element_item1 = value_element->item1;\n"
+				   "\t\tvalue_element_item1 = value_element->item1;\n"
 				   "\n"
-				   "\t/* Marshal a uint32_t onto the message */\n"
-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal a uint32_t onto the message */\n"
+				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
+				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\t}\n"
 				   "}\n"
 				   "\n"
@@ -2912,41 +2924,43 @@
 				   "\treturn -1;\n"
 				   "}\n"
 				   "\n"
-				   "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-				   "\tDBusMessageIter                     value_element_iter;\n"
-				   "\tconst char *                        value_element_item0;\n"
-				   "\tuint32_t                            value_element_item1;\n"
-				   "\tconst MyDictEntryArrayValueElement *value_element;\n"
+				   "if (value) {\n"
+				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
+				   "\t\tDBusMessageIter                     value_element_iter;\n"
+				   "\t\tconst char *                        value_element_item0;\n"
+				   "\t\tuint32_t                            value_element_item1;\n"
+				   "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
 				   "\n"
-				   "\tvalue_element = value[value_i];\n"
+				   "\t\tvalue_element = value[value_i];\n"
 				   "\n"
-				   "\t/* Marshal a structure onto the message */\n"
-				   "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal a structure onto the message */\n"
+				   "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tvalue_element_item0 = value_element->item0;\n"
+				   "\t\tvalue_element_item0 = value_element->item0;\n"
 				   "\n"
-				   "\t/* Marshal a char * onto the message */\n"
-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal a char * onto the message */\n"
+				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tvalue_element_item1 = value_element->item1;\n"
+				   "\t\tvalue_element_item1 = value_element->item1;\n"
 				   "\n"
-				   "\t/* Marshal a uint32_t onto the message */\n"
-				   "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
-				   "\t}\n"
+				   "\t\t/* Marshal a uint32_t onto the message */\n"
+				   "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\n"
-				   "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-				   "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-				   "\t\treturn -1;\n"
+				   "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
+				   "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
+				   "\t\t\treturn -1;\n"
+				   "\t\t}\n"
 				   "\t}\n"
 				   "}\n"
 				   "\n"
Index: libnih-1.0.3/nih-dbus-tool/type.c
===================================================================
--- libnih-1.0.3.orig/nih-dbus-tool/type.c
+++ libnih-1.0.3/nih-dbus-tool/type.c
@@ -1101,7 +1101,7 @@
 	nih_assert (block != NULL);
 	nih_assert (var != NULL);
 
-	if (! strchr (var->type, '*'))
+	if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
 		return *block;
 
 	if (next && (! strcmp (next->type, "size_t"))) {
openSUSE Build Service is sponsored by