Merge lp:~stgraber/ubuntu/raring/libnih/libnih-dbus-as-type into lp:ubuntu/raring/libnih
- Raring (13.04)
- libnih-dbus-as-type
- Merge into raring
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 |
Related bugs: |
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 |
Commit message
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.
Stéphane Graber (stgraber) wrote : | # |
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.
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.
string "bla"
array [
string "test=abc"
]
boolean true
>> initctl --session emit bla
method call sender=:1.4 -> dest=com.
string "bla"
array [
]
boolean true
- 1073. By Stéphane Graber
-
Remove duplicate comment
Preview Diff
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"))) { |
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.