Stéphane Graber has proposed merging 
lp:~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type into lp:ubuntu/libnih.

Requested reviews:
  Stéphane Graber (stgraber)
  Upstart Reviewers (upstart-reviewers)
  James Hunt (jamesodhunt)

For more details, see:
https://code.launchpad.net/~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type/+merge/138582

This change updates the dbus code generator for the outgoing 'as' type.

'as' is a null terminated string array, that ends up as 'char * const *'
as generated by nih-dbus-tool.

As it's NULL terminated, the current nih_assert (var != NULL); will trigger
whenever the function is passed an empty array.


This has become a problem in upstart where we now have a new EventEmitted
signal which has an "env" property that's the list of environment variables.
An empty event environment would trigger the assert causing upstart to fail.

The change I made is simply to detect variables of type 'char * const *' and
skip the code adding the nih_assert. I updated the two existing tests to match
that change.


Please note that I have no experience with libnih development at all and very
limited experience as one of its users, so this change may very well be wrong.
However in the limited test scenario that's my upstart branch, the change
appears to work as expected.
-- 
https://code.launchpad.net/~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type/+merge/138582
Your team Upstart Reviewers is requested to review the proposed merge of 
lp:~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type into lp:ubuntu/libnih.
=== modified file 'nih-dbus-tool/marshal.c'
--- nih-dbus-tool/marshal.c	2010-02-04 22:30:23 +0000
+++ nih-dbus-tool/marshal.c	2012-12-07 00:02:22 +0000
@@ -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,35 @@
 	}
 
 	/* 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;
+		}
+	}
+
+	/* Close the container again */
 	if (! nih_strcat_sprintf (&code, parent,
-				  "}\n"
-				  "\n"
 				  "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
 				  "%s"
 				  "}\n",

=== modified file 'nih-dbus-tool/tests/expected/test_method_object_function_no_input.c'
--- nih-dbus-tool/tests/expected/test_method_object_function_no_input.c	2010-02-04 22:30:23 +0000
+++ nih-dbus-tool/tests/expected/test_method_object_function_no_input.c	2012-12-07 00:02:22 +0000
@@ -88,17 +88,19 @@
 			goto enomem;
 		}
 
-		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);
-				reply = NULL;
-				goto enomem;
+		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);
+					reply = NULL;
+					goto enomem;
+				}
 			}
 		}
 

=== modified file 'nih-dbus-tool/tests/expected/test_method_object_function_standard.c'
--- nih-dbus-tool/tests/expected/test_method_object_function_standard.c	2010-02-04 22:30:23 +0000
+++ nih-dbus-tool/tests/expected/test_method_object_function_standard.c	2012-12-07 00:02:22 +0000
@@ -136,17 +136,19 @@
 			goto enomem;
 		}
 
-		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);
-				reply = NULL;
-				goto enomem;
+		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);
+					reply = NULL;
+					goto enomem;
+				}
 			}
 		}
 

=== modified file 'nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c'
--- nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c	2010-02-04 22:30:23 +0000
+++ nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c	2012-12-07 00:02:22 +0000
@@ -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;
+			}
 		}
 	}
 

=== modified file 'nih-dbus-tool/tests/expected/test_method_reply_function_standard.c'
--- nih-dbus-tool/tests/expected/test_method_reply_function_standard.c	2010-02-04 22:30:23 +0000
+++ nih-dbus-tool/tests/expected/test_method_reply_function_standard.c	2012-12-07 00:02:22 +0000
@@ -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;
+			}
 		}
 	}
 

=== modified file 'nih-dbus-tool/tests/test_marshal.c'
--- nih-dbus-tool/tests/test_marshal.c	2010-12-23 22:08:49 +0000
+++ nih-dbus-tool/tests/test_marshal.c	2012-12-07 00:02:22 +0000
@@ -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"
-				   "\n"
-				   "\tvalue_element = value[value_i];\n"
-				   "\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"
-				   "\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"
-				   "\n"
-				   "\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\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"
-
+				   "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"
+				   "\t\tvalue_element = value[value_i];\n"
+				   "\t\tvalue_element_len = value_len[value_i];\n"
+				   "\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"
+				   "\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\t\tvalue_element_element = value_element[value_element_i];\n"
+				   "\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"
 				   "\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"
-				   "\n"
-				   "\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"
+				   "if (value) {\n"
+				   "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
+				   "\t\tconst char *value_element;\n"
+				   "\n"
+				   "\t\tvalue_element = value[value_i];\n"
+				   "\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,34 +1937,38 @@
 				   "\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"
-				   "\n"
-				   "\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"
-				   "\n"
-				   "\t\tvalue_element_element = value_element[value_element_i];\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\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"
+				   "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"
+				   "\t\tvalue_element = value[value_i];\n"
+				   "\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\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\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"
@@ -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"
-				   "\n"
-				   "\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"
+				   "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"
+				   "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
+				   "\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"
-				   "\n"
-				   "\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"
-				   "\n"
-				   "\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"
-				   "\n"
-				   "\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"
-				   "\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"
+				   "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"
+				   "\t\tvalue_element = value[value_i];\n"
+				   "\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"
+				   "\t\tvalue_element_item0 = value_element->item0;\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_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"
+				   "\t\tvalue_element_item1 = value_element->item1;\n"
+				   "\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"
+				   "\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"
-				   "\n"
-				   "\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"
-				   "\n"
-				   "\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"
-				   "\n"
-				   "\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"
-				   "\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"
+				   "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"
+				   "\t\tvalue_element = value[value_i];\n"
+				   "\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"
+				   "\t\tvalue_element_item0 = value_element->item0;\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_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"
+				   "\t\tvalue_element_item1 = value_element->item1;\n"
+				   "\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"
+				   "\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"

=== modified file 'nih-dbus-tool/type.c'
--- nih-dbus-tool/type.c	2010-12-23 22:08:49 +0000
+++ nih-dbus-tool/type.c	2012-12-07 00:02:22 +0000
@@ -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"))) {

-- 
upstart-devel mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to