Merge lp:~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type into lp:ubuntu/raring/libnih

Proposed by Stéphane Graber
Status: Merged
Merged at revision: 1070
Proposed branch: lp:~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type
Merge into: lp:ubuntu/raring/libnih
Diff against target: 604 lines (+251/-199)
7 files modified
nih-dbus-tool/marshal.c (+36/-4)
nih-dbus-tool/tests/expected/test_method_object_function_no_input.c (+13/-11)
nih-dbus-tool/tests/expected/test_method_object_function_standard.c (+13/-11)
nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c (+12/-11)
nih-dbus-tool/tests/expected/test_method_reply_function_standard.c (+12/-11)
nih-dbus-tool/tests/test_marshal.c (+164/-150)
nih-dbus-tool/type.c (+1/-1)
To merge this branch: bzr merge lp:~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type
Reviewer Review Type Date Requested Status
James Hunt (community) Approve
Upstart Reviewers Pending
Stéphane Graber Pending
Review via email: mp+138582@code.launchpad.net

Description of the change

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.

To post a comment you must log in.
Revision history for this message
Stéphane Graber (stgraber) wrote :

Note that I based this change on the Ubuntu branch rather than the upstream libnih branch as my understanding is that the Ubuntu branch contains quite a few other changes that aren't upstream yet.

I'd however expect this delta to apply cleanly to lp:libnih considering how simple the change is.

Revision history for this message
Stéphane Graber (stgraber) wrote :

Moving back to work in progress, this fixed the first problem which was the assert, but it's then trying to loop through the list assuming it has at least one entry, which isn't always true anymore.

Revision history for this message
Stéphane Graber (stgraber) wrote :

^ And that's for the missing changes.

Basically the changes are now:
 - Drop the nih_assert when we get a char * const * variable.
 - Don't try to iterate through an array before first checking that it's non-NULL.
 - Update the tests.

The diff is fairly big on the tests side because of all the re-indent that was needed, for each of the tests, the only change that was done was adding the "if (variable) {" <insert loop here> "}".

I also had to do a few more changes in marshal.c than I'd have liked, that's because nih-dbus-tool wants to generate a properly indented file as output, so I had to move the loop to a new block so I can indent it if needed.

With that, all the nih tests pass and my upstart branch builds fine, passes its own tests and appears to run fine too.

Quick test with experimental upstart:
>> initctl --session emit bla test=abc
method call sender=:1.5 -> dest=com.ubuntu.Upstart serial=4 path=/com/ubuntu/Upstart; interface=com.ubuntu.Upstart0_6; member=EmitEvent
   string "bla"
   array [
      string "test=abc"
   ]
   boolean true

>> initctl --session emit bla
method call sender=:1.4 -> dest=com.ubuntu.Upstart serial=4 path=/com/ubuntu/Upstart; interface=com.ubuntu.Upstart0_6; member=EmitEvent
   string "bla"
   array [
   ]
   boolean true

1073. By Stéphane Graber

Remove duplicate comment

Revision history for this message
James Hunt (jamesodhunt) wrote :

LGTM.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'nih-dbus-tool/marshal.c'
2--- nih-dbus-tool/marshal.c 2010-02-04 22:30:23 +0000
3+++ nih-dbus-tool/marshal.c 2012-12-11 15:40:30 +0000
4@@ -364,6 +364,7 @@
5 nih_local TypeVar *element_len_var = NULL;
6 nih_local char * block = NULL;
7 nih_local char * vars_block = NULL;
8+ nih_local char * loop_block = NULL;
9
10 nih_assert (iter != NULL);
11 nih_assert (iter_name != NULL);
12@@ -448,7 +449,7 @@
13 nih_list_add (locals, &array_iter_var->entry);
14
15 if (dbus_type_is_fixed (element_type)) {
16- if (! nih_strcat_sprintf (&code, parent,
17+ if (! nih_strcat_sprintf (&loop_block, parent,
18 "for (size_t %s = 0; %s < %s; %s++) {\n",
19 loop_name, loop_name, len_name, loop_name)) {
20 nih_free (code);
21@@ -456,6 +457,12 @@
22 }
23 } else {
24 if (! nih_strcat_sprintf (&code, parent,
25+ "if (%s) {\n",
26+ name)) {
27+ nih_free (code);
28+ return NULL;
29+ }
30+ if (! nih_strcat_sprintf (&loop_block, parent,
31 "for (size_t %s = 0; %s[%s]; %s++) {\n",
32 loop_name, name, loop_name, loop_name)) {
33 nih_free (code);
34@@ -576,7 +583,7 @@
35 }
36
37
38- if (! nih_strcat_sprintf (&code, parent,
39+ if (! nih_strcat_sprintf (&loop_block, parent,
40 "%s"
41 "\n"
42 "%s"
43@@ -590,9 +597,34 @@
44 }
45
46 /* Close the container again */
47+ if (! nih_strcat_sprintf (&loop_block, parent,
48+ "}\n")) {
49+ nih_free (code);
50+ return NULL;
51+ }
52+
53+ if (dbus_type_is_fixed (element_type)) {
54+ if (! nih_strcat_sprintf (&code, parent,
55+ "%s\n", loop_block)) {
56+ nih_free (code);
57+ return NULL;
58+ }
59+ }
60+ else {
61+ if (! indent (&loop_block, NULL, 1)) {
62+ nih_free (code);
63+ return NULL;
64+ }
65+
66+ if (! nih_strcat_sprintf (&code, parent,
67+ "%s"
68+ "}\n\n", loop_block)) {
69+ nih_free (code);
70+ return NULL;
71+ }
72+ }
73+
74 if (! nih_strcat_sprintf (&code, parent,
75- "}\n"
76- "\n"
77 "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
78 "%s"
79 "}\n",
80
81=== modified file 'nih-dbus-tool/tests/expected/test_method_object_function_no_input.c'
82--- nih-dbus-tool/tests/expected/test_method_object_function_no_input.c 2010-02-04 22:30:23 +0000
83+++ nih-dbus-tool/tests/expected/test_method_object_function_no_input.c 2012-12-11 15:40:30 +0000
84@@ -88,17 +88,19 @@
85 goto enomem;
86 }
87
88- for (size_t output_i = 0; output[output_i]; output_i++) {
89- const char *output_element;
90-
91- output_element = output[output_i];
92-
93- /* Marshal a char * onto the message */
94- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
95- dbus_message_iter_abandon_container (&iter, &output_iter);
96- dbus_message_unref (reply);
97- reply = NULL;
98- goto enomem;
99+ if (output) {
100+ for (size_t output_i = 0; output[output_i]; output_i++) {
101+ const char *output_element;
102+
103+ output_element = output[output_i];
104+
105+ /* Marshal a char * onto the message */
106+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
107+ dbus_message_iter_abandon_container (&iter, &output_iter);
108+ dbus_message_unref (reply);
109+ reply = NULL;
110+ goto enomem;
111+ }
112 }
113 }
114
115
116=== modified file 'nih-dbus-tool/tests/expected/test_method_object_function_standard.c'
117--- nih-dbus-tool/tests/expected/test_method_object_function_standard.c 2010-02-04 22:30:23 +0000
118+++ nih-dbus-tool/tests/expected/test_method_object_function_standard.c 2012-12-11 15:40:30 +0000
119@@ -136,17 +136,19 @@
120 goto enomem;
121 }
122
123- for (size_t output_i = 0; output[output_i]; output_i++) {
124- const char *output_element;
125-
126- output_element = output[output_i];
127-
128- /* Marshal a char * onto the message */
129- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
130- dbus_message_iter_abandon_container (&iter, &output_iter);
131- dbus_message_unref (reply);
132- reply = NULL;
133- goto enomem;
134+ if (output) {
135+ for (size_t output_i = 0; output[output_i]; output_i++) {
136+ const char *output_element;
137+
138+ output_element = output[output_i];
139+
140+ /* Marshal a char * onto the message */
141+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
142+ dbus_message_iter_abandon_container (&iter, &output_iter);
143+ dbus_message_unref (reply);
144+ reply = NULL;
145+ goto enomem;
146+ }
147 }
148 }
149
150
151=== modified file 'nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c'
152--- nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c 2010-02-04 22:30:23 +0000
153+++ nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c 2012-12-11 15:40:30 +0000
154@@ -7,7 +7,6 @@
155 DBusMessageIter output_iter;
156
157 nih_assert (message != NULL);
158- nih_assert (output != NULL);
159
160 /* If the sender doesn't care about a reply, don't bother wasting
161 * effort constructing and sending one.
162@@ -28,16 +27,18 @@
163 return -1;
164 }
165
166- for (size_t output_i = 0; output[output_i]; output_i++) {
167- const char *output_element;
168-
169- output_element = output[output_i];
170-
171- /* Marshal a char * onto the message */
172- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
173- dbus_message_iter_abandon_container (&iter, &output_iter);
174- dbus_message_unref (reply);
175- return -1;
176+ if (output) {
177+ for (size_t output_i = 0; output[output_i]; output_i++) {
178+ const char *output_element;
179+
180+ output_element = output[output_i];
181+
182+ /* Marshal a char * onto the message */
183+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
184+ dbus_message_iter_abandon_container (&iter, &output_iter);
185+ dbus_message_unref (reply);
186+ return -1;
187+ }
188 }
189 }
190
191
192=== modified file 'nih-dbus-tool/tests/expected/test_method_reply_function_standard.c'
193--- nih-dbus-tool/tests/expected/test_method_reply_function_standard.c 2010-02-04 22:30:23 +0000
194+++ nih-dbus-tool/tests/expected/test_method_reply_function_standard.c 2012-12-11 15:40:30 +0000
195@@ -7,7 +7,6 @@
196 DBusMessageIter output_iter;
197
198 nih_assert (message != NULL);
199- nih_assert (output != NULL);
200
201 /* If the sender doesn't care about a reply, don't bother wasting
202 * effort constructing and sending one.
203@@ -28,16 +27,18 @@
204 return -1;
205 }
206
207- for (size_t output_i = 0; output[output_i]; output_i++) {
208- const char *output_element;
209-
210- output_element = output[output_i];
211-
212- /* Marshal a char * onto the message */
213- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
214- dbus_message_iter_abandon_container (&iter, &output_iter);
215- dbus_message_unref (reply);
216- return -1;
217+ if (output) {
218+ for (size_t output_i = 0; output[output_i]; output_i++) {
219+ const char *output_element;
220+
221+ output_element = output[output_i];
222+
223+ /* Marshal a char * onto the message */
224+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
225+ dbus_message_iter_abandon_container (&iter, &output_iter);
226+ dbus_message_unref (reply);
227+ return -1;
228+ }
229 }
230 }
231
232
233=== modified file 'nih-dbus-tool/tests/test_marshal.c'
234--- nih-dbus-tool/tests/test_marshal.c 2010-12-23 22:08:49 +0000
235+++ nih-dbus-tool/tests/test_marshal.c 2012-12-11 15:40:30 +0000
236@@ -1479,39 +1479,41 @@
237 "\treturn -1;\n"
238 "}\n"
239 "\n"
240- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
241- "\tDBusMessageIter value_element_iter;\n"
242- "\tconst int16_t * value_element;\n"
243- "\tsize_t value_element_len;\n"
244- "\n"
245- "\tvalue_element = value[value_i];\n"
246- "\tvalue_element_len = value_len[value_i];\n"
247- "\n"
248-
249- "\t/* Marshal an array onto the message */\n"
250- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
251- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
252- "\t\treturn -1;\n"
253- "\t}\n"
254- "\n"
255- "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
256- "\t\tint16_t value_element_element;\n"
257- "\n"
258- "\t\tvalue_element_element = value_element[value_element_i];\n"
259- "\n"
260- "\t\t/* Marshal a int16_t onto the message */\n"
261- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
262- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
263- "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
264- "\t\t\treturn -1;\n"
265- "\t\t}\n"
266- "\t}\n"
267- "\n"
268- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
269- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
270- "\t\treturn -1;\n"
271- "\t}\n"
272-
273+ "if (value) {\n"
274+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
275+ "\t\tDBusMessageIter value_element_iter;\n"
276+ "\t\tconst int16_t * value_element;\n"
277+ "\t\tsize_t value_element_len;\n"
278+ "\n"
279+ "\t\tvalue_element = value[value_i];\n"
280+ "\t\tvalue_element_len = value_len[value_i];\n"
281+ "\n"
282+
283+ "\t\t/* Marshal an array onto the message */\n"
284+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
285+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
286+ "\t\t\treturn -1;\n"
287+ "\t\t}\n"
288+ "\n"
289+ "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
290+ "\t\t\tint16_t value_element_element;\n"
291+ "\n"
292+ "\t\t\tvalue_element_element = value_element[value_element_i];\n"
293+ "\n"
294+ "\t\t\t/* Marshal a int16_t onto the message */\n"
295+ "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
296+ "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
297+ "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
298+ "\t\t\t\treturn -1;\n"
299+ "\t\t\t}\n"
300+ "\t\t}\n"
301+ "\n"
302+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
303+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
304+ "\t\t\treturn -1;\n"
305+ "\t\t}\n"
306+
307+ "\t}\n"
308 "}\n"
309 "\n"
310 "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
311@@ -1766,15 +1768,17 @@
312 "\treturn -1;\n"
313 "}\n"
314 "\n"
315- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
316- "\tconst char *value_element;\n"
317- "\n"
318- "\tvalue_element = value[value_i];\n"
319- "\n"
320- "\t/* Marshal a char * onto the message */\n"
321- "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
322- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
323- "\t\treturn -1;\n"
324+ "if (value) {\n"
325+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
326+ "\t\tconst char *value_element;\n"
327+ "\n"
328+ "\t\tvalue_element = value[value_i];\n"
329+ "\n"
330+ "\t\t/* Marshal a char * onto the message */\n"
331+ "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
332+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
333+ "\t\t\treturn -1;\n"
334+ "\t\t}\n"
335 "\t}\n"
336 "}\n"
337 "\n"
338@@ -1933,34 +1937,38 @@
339 "\treturn -1;\n"
340 "}\n"
341 "\n"
342- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
343- "\tDBusMessageIter value_element_iter;\n"
344- "\tchar * const * value_element;\n"
345- "\n"
346- "\tvalue_element = value[value_i];\n"
347- "\n"
348- "\t/* Marshal an array onto the message */\n"
349- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
350- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
351- "\t\treturn -1;\n"
352- "\t}\n"
353- "\n"
354- "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
355- "\t\tconst char *value_element_element;\n"
356- "\n"
357- "\t\tvalue_element_element = value_element[value_element_i];\n"
358- "\n"
359- "\t\t/* Marshal a char * onto the message */\n"
360- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
361- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
362- "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
363- "\t\t\treturn -1;\n"
364- "\t\t}\n"
365- "\t}\n"
366- "\n"
367- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
368- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
369- "\t\treturn -1;\n"
370+ "if (value) {\n"
371+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
372+ "\t\tDBusMessageIter value_element_iter;\n"
373+ "\t\tchar * const * value_element;\n"
374+ "\n"
375+ "\t\tvalue_element = value[value_i];\n"
376+ "\n"
377+ "\t\t/* Marshal an array onto the message */\n"
378+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
379+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
380+ "\t\t\treturn -1;\n"
381+ "\t\t}\n"
382+ "\n"
383+ "\t\tif (value_element) {\n"
384+ "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
385+ "\t\t\t\tconst char *value_element_element;\n"
386+ "\n"
387+ "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
388+ "\n"
389+ "\t\t\t\t/* Marshal a char * onto the message */\n"
390+ "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
391+ "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
392+ "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
393+ "\t\t\t\t\treturn -1;\n"
394+ "\t\t\t\t}\n"
395+ "\t\t\t}\n"
396+ "\t\t}\n"
397+ "\n"
398+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
399+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
400+ "\t\t\treturn -1;\n"
401+ "\t\t}\n"
402 "\t}\n"
403 "}\n"
404 "\n"
405@@ -2194,16 +2202,18 @@
406 "\treturn -1;\n"
407 "}\n"
408 "\n"
409- "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
410- "\tconst char *value_item2_element;\n"
411- "\n"
412- "\tvalue_item2_element = value_item2[value_item2_i];\n"
413- "\n"
414- "\t/* Marshal a char * onto the message */\n"
415- "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
416- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
417- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
418- "\t\treturn -1;\n"
419+ "if (value_item2) {\n"
420+ "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
421+ "\t\tconst char *value_item2_element;\n"
422+ "\n"
423+ "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
424+ "\n"
425+ "\t\t/* Marshal a char * onto the message */\n"
426+ "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
427+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
428+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
429+ "\t\t\treturn -1;\n"
430+ "\t\t}\n"
431 "\t}\n"
432 "}\n"
433 "\n"
434@@ -2642,41 +2652,43 @@
435 "\treturn -1;\n"
436 "}\n"
437 "\n"
438- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
439- "\tDBusMessageIter value_element_iter;\n"
440- "\tconst char * value_element_item0;\n"
441- "\tuint32_t value_element_item1;\n"
442- "\tconst MyStructArrayValueElement *value_element;\n"
443- "\n"
444- "\tvalue_element = value[value_i];\n"
445- "\n"
446- "\t/* Marshal a structure onto the message */\n"
447- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
448- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
449- "\t\treturn -1;\n"
450- "\t}\n"
451- "\n"
452- "\tvalue_element_item0 = value_element->item0;\n"
453- "\n"
454- "\t/* Marshal a char * onto the message */\n"
455- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
456- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
457- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
458- "\t\treturn -1;\n"
459- "\t}\n"
460- "\n"
461- "\tvalue_element_item1 = value_element->item1;\n"
462- "\n"
463- "\t/* Marshal a uint32_t onto the message */\n"
464- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
465- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
466- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
467- "\t\treturn -1;\n"
468- "\t}\n"
469- "\n"
470- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
471- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
472- "\t\treturn -1;\n"
473+ "if (value) {\n"
474+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
475+ "\t\tDBusMessageIter value_element_iter;\n"
476+ "\t\tconst char * value_element_item0;\n"
477+ "\t\tuint32_t value_element_item1;\n"
478+ "\t\tconst MyStructArrayValueElement *value_element;\n"
479+ "\n"
480+ "\t\tvalue_element = value[value_i];\n"
481+ "\n"
482+ "\t\t/* Marshal a structure onto the message */\n"
483+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
484+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
485+ "\t\t\treturn -1;\n"
486+ "\t\t}\n"
487+ "\n"
488+ "\t\tvalue_element_item0 = value_element->item0;\n"
489+ "\n"
490+ "\t\t/* Marshal a char * onto the message */\n"
491+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
492+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
493+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
494+ "\t\t\treturn -1;\n"
495+ "\t\t}\n"
496+ "\n"
497+ "\t\tvalue_element_item1 = value_element->item1;\n"
498+ "\n"
499+ "\t\t/* Marshal a uint32_t onto the message */\n"
500+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
501+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
502+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
503+ "\t\t\treturn -1;\n"
504+ "\t\t}\n"
505+ "\n"
506+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
507+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
508+ "\t\t\treturn -1;\n"
509+ "\t\t}\n"
510 "\t}\n"
511 "}\n"
512 "\n"
513@@ -2912,41 +2924,43 @@
514 "\treturn -1;\n"
515 "}\n"
516 "\n"
517- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
518- "\tDBusMessageIter value_element_iter;\n"
519- "\tconst char * value_element_item0;\n"
520- "\tuint32_t value_element_item1;\n"
521- "\tconst MyDictEntryArrayValueElement *value_element;\n"
522- "\n"
523- "\tvalue_element = value[value_i];\n"
524- "\n"
525- "\t/* Marshal a structure onto the message */\n"
526- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
527- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
528- "\t\treturn -1;\n"
529- "\t}\n"
530- "\n"
531- "\tvalue_element_item0 = value_element->item0;\n"
532- "\n"
533- "\t/* Marshal a char * onto the message */\n"
534- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
535- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
536- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
537- "\t\treturn -1;\n"
538- "\t}\n"
539- "\n"
540- "\tvalue_element_item1 = value_element->item1;\n"
541- "\n"
542- "\t/* Marshal a uint32_t onto the message */\n"
543- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
544- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
545- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
546- "\t\treturn -1;\n"
547- "\t}\n"
548- "\n"
549- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
550- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
551- "\t\treturn -1;\n"
552+ "if (value) {\n"
553+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
554+ "\t\tDBusMessageIter value_element_iter;\n"
555+ "\t\tconst char * value_element_item0;\n"
556+ "\t\tuint32_t value_element_item1;\n"
557+ "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
558+ "\n"
559+ "\t\tvalue_element = value[value_i];\n"
560+ "\n"
561+ "\t\t/* Marshal a structure onto the message */\n"
562+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
563+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
564+ "\t\t\treturn -1;\n"
565+ "\t\t}\n"
566+ "\n"
567+ "\t\tvalue_element_item0 = value_element->item0;\n"
568+ "\n"
569+ "\t\t/* Marshal a char * onto the message */\n"
570+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
571+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
572+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
573+ "\t\t\treturn -1;\n"
574+ "\t\t}\n"
575+ "\n"
576+ "\t\tvalue_element_item1 = value_element->item1;\n"
577+ "\n"
578+ "\t\t/* Marshal a uint32_t onto the message */\n"
579+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
580+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
581+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
582+ "\t\t\treturn -1;\n"
583+ "\t\t}\n"
584+ "\n"
585+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
586+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
587+ "\t\t\treturn -1;\n"
588+ "\t\t}\n"
589 "\t}\n"
590 "}\n"
591 "\n"
592
593=== modified file 'nih-dbus-tool/type.c'
594--- nih-dbus-tool/type.c 2010-12-23 22:08:49 +0000
595+++ nih-dbus-tool/type.c 2012-12-11 15:40:30 +0000
596@@ -1101,7 +1101,7 @@
597 nih_assert (block != NULL);
598 nih_assert (var != NULL);
599
600- if (! strchr (var->type, '*'))
601+ if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
602 return *block;
603
604 if (next && (! strcmp (next->type, "size_t"))) {

Subscribers

People subscribed via source and target branches