D-Bus  1.11.6
dbus-message-util.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* dbus-message-util.c Would be in dbus-message.c, but only used by bus/tests
3  *
4  * Copyright (C) 2002, 2003, 2004, 2005 Red Hat Inc.
5  * Copyright (C) 2002, 2003 CodeFactory AB
6  *
7  * Licensed under the Academic Free License version 2.1
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 #include <config.h>
26 #include "dbus-internals.h"
27 #include "dbus-test.h"
28 #include "dbus-message-private.h"
29 #include "dbus-marshal-recursive.h"
30 #include "dbus-string.h"
31 #ifdef HAVE_UNIX_FD_PASSING
32 #include "dbus-sysdeps-unix.h"
33 #endif
34 
35 #ifdef __linux__
36 /* Necessary for the Linux-specific fd leak checking code only */
37 #include <sys/types.h>
38 #include <dirent.h>
39 #include <stdlib.h>
40 #include <errno.h>
41 #endif
42 
48 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
49 
61 static dbus_bool_t
62 dbus_message_iter_get_args (DBusMessageIter *iter,
63  DBusError *error,
64  int first_arg_type,
65  ...)
66 {
67  dbus_bool_t retval;
68  va_list var_args;
69 
70  _dbus_return_val_if_fail (iter != NULL, FALSE);
71  _dbus_return_val_if_error_is_set (error, FALSE);
72 
73  va_start (var_args, first_arg_type);
74  retval = _dbus_message_iter_get_args_valist (iter, error, first_arg_type, var_args);
75  va_end (var_args);
76 
77  return retval;
78 }
79 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
80 
83 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
84 #include "dbus-test.h"
85 #include "dbus-message-factory.h"
86 #include <stdio.h>
87 #include <stdlib.h>
88 
89 static int validities_seen[DBUS_VALIDITY_LAST + _DBUS_NEGATIVE_VALIDITY_COUNT];
90 
91 static void
92 reset_validities_seen (void)
93 {
94  int i;
95  i = 0;
96  while (i < _DBUS_N_ELEMENTS (validities_seen))
97  {
98  validities_seen[i] = 0;
99  ++i;
100  }
101 }
102 
103 static void
104 record_validity_seen (DBusValidity validity)
105 {
106  validities_seen[validity + _DBUS_NEGATIVE_VALIDITY_COUNT] += 1;
107 }
108 
109 static void
110 print_validities_seen (dbus_bool_t not_seen)
111 {
112  int i;
113  i = 0;
114  while (i < _DBUS_N_ELEMENTS (validities_seen))
115  {
116  if ((i - _DBUS_NEGATIVE_VALIDITY_COUNT) == DBUS_VALIDITY_UNKNOWN ||
117  (i - _DBUS_NEGATIVE_VALIDITY_COUNT) == DBUS_INVALID_FOR_UNKNOWN_REASON)
118  ;
119  else if ((not_seen && validities_seen[i] == 0) ||
120  (!not_seen && validities_seen[i] > 0))
121  printf ("validity %3d seen %d times\n",
122  i - _DBUS_NEGATIVE_VALIDITY_COUNT,
123  validities_seen[i]);
124  ++i;
125  }
126 }
127 
128 static void
129 check_memleaks (void)
130 {
131  dbus_shutdown ();
132 
133  if (_dbus_get_malloc_blocks_outstanding () != 0)
134  {
135  _dbus_warn ("%d dbus_malloc blocks were not freed in %s",
136  _dbus_get_malloc_blocks_outstanding (), __FILE__);
137  _dbus_assert_not_reached ("memleaks");
138  }
139 }
140 
141 #ifdef __linux__
142 struct DBusInitialFDs {
143  fd_set set;
144 };
145 #endif
146 
147 DBusInitialFDs *
148 _dbus_check_fdleaks_enter (void)
149 {
150 #ifdef __linux__
151  DIR *d;
152  DBusInitialFDs *fds;
153 
154  /* this is plain malloc so it won't interfere with leak checking */
155  fds = malloc (sizeof (DBusInitialFDs));
156  _dbus_assert (fds != NULL);
157 
158  /* This works on Linux only */
159 
160  if ((d = opendir ("/proc/self/fd")))
161  {
162  struct dirent *de;
163 
164  while ((de = readdir(d)))
165  {
166  long l;
167  char *e = NULL;
168  int fd;
169 
170  if (de->d_name[0] == '.')
171  continue;
172 
173  errno = 0;
174  l = strtol (de->d_name, &e, 10);
175  _dbus_assert (errno == 0 && e && !*e);
176 
177  fd = (int) l;
178 
179  if (fd < 3)
180  continue;
181 
182  if (fd == dirfd (d))
183  continue;
184 
185  FD_SET (fd, &fds->set);
186  }
187 
188  closedir (d);
189  }
190 
191  return fds;
192 #else
193  return NULL;
194 #endif
195 }
196 
197 void
198 _dbus_check_fdleaks_leave (DBusInitialFDs *fds)
199 {
200 #ifdef __linux__
201  DIR *d;
202 
203  /* This works on Linux only */
204 
205  if ((d = opendir ("/proc/self/fd")))
206  {
207  struct dirent *de;
208 
209  while ((de = readdir(d)))
210  {
211  long l;
212  char *e = NULL;
213  int fd;
214 
215  if (de->d_name[0] == '.')
216  continue;
217 
218  errno = 0;
219  l = strtol (de->d_name, &e, 10);
220  _dbus_assert (errno == 0 && e && !*e);
221 
222  fd = (int) l;
223 
224  if (fd < 3)
225  continue;
226 
227  if (fd == dirfd (d))
228  continue;
229 
230  if (FD_ISSET (fd, &fds->set))
231  continue;
232 
233  _dbus_warn ("file descriptor %i leaked in %s.", fd, __FILE__);
234  _dbus_assert_not_reached ("fdleaks");
235  }
236 
237  closedir (d);
238  }
239 
240  free (fds);
241 #else
242  _dbus_assert (fds == NULL);
243 #endif
244 }
245 
246 static dbus_bool_t
247 check_have_valid_message (DBusMessageLoader *loader)
248 {
249  DBusMessage *message;
250  dbus_bool_t retval;
251 
252  message = NULL;
253  retval = FALSE;
254 
256  {
257  _dbus_warn ("loader corrupted on message that was expected to be valid; invalid reason %d",
258  loader->corruption_reason);
259  goto failed;
260  }
261 
262  message = _dbus_message_loader_pop_message (loader);
263  if (message == NULL)
264  {
265  _dbus_warn ("didn't load message that was expected to be valid (message not popped)");
266  goto failed;
267  }
268 
269  if (_dbus_string_get_length (&loader->data) > 0)
270  {
271  _dbus_warn ("had leftover bytes from expected-to-be-valid single message");
272  goto failed;
273  }
274 
275 #if 0
276  /* FIXME */
277  /* Verify that we're able to properly deal with the message.
278  * For example, this would detect improper handling of messages
279  * in nonstandard byte order.
280  */
281  if (!check_message_handling (message))
282  goto failed;
283 #endif
284 
285  record_validity_seen (DBUS_VALID);
286 
287  retval = TRUE;
288 
289  failed:
290  if (message)
291  dbus_message_unref (message);
292 
293  return retval;
294 }
295 
296 static dbus_bool_t
297 check_invalid_message (DBusMessageLoader *loader,
298  DBusValidity expected_validity)
299 {
300  dbus_bool_t retval;
301 
302  retval = FALSE;
303 
305  {
306  _dbus_warn ("loader not corrupted on message that was expected to be invalid");
307  goto failed;
308  }
309 
310  record_validity_seen (loader->corruption_reason);
311 
312  if (expected_validity != DBUS_INVALID_FOR_UNKNOWN_REASON &&
313  loader->corruption_reason != expected_validity)
314  {
315  _dbus_warn ("expected message to be corrupted for reason %d and was corrupted for %d instead",
316  expected_validity, loader->corruption_reason);
317  goto failed;
318  }
319 
320  retval = TRUE;
321 
322  failed:
323  return retval;
324 }
325 
326 static dbus_bool_t
327 check_incomplete_message (DBusMessageLoader *loader)
328 {
329  DBusMessage *message;
330  dbus_bool_t retval;
331 
332  message = NULL;
333  retval = FALSE;
334 
336  {
337  _dbus_warn ("loader corrupted on message that was expected to be valid (but incomplete), corruption reason %d",
338  loader->corruption_reason);
339  goto failed;
340  }
341 
342  message = _dbus_message_loader_pop_message (loader);
343  if (message != NULL)
344  {
345  _dbus_warn ("loaded message that was expected to be incomplete");
346  goto failed;
347  }
348 
349  record_validity_seen (DBUS_VALID_BUT_INCOMPLETE);
350  retval = TRUE;
351 
352  failed:
353  if (message)
354  dbus_message_unref (message);
355  return retval;
356 }
357 
358 static dbus_bool_t
359 check_loader_results (DBusMessageLoader *loader,
360  DBusValidity expected_validity)
361 {
363  _dbus_assert_not_reached ("no memory to queue messages");
364 
365  if (expected_validity == DBUS_VALID)
366  return check_have_valid_message (loader);
367  else if (expected_validity == DBUS_VALID_BUT_INCOMPLETE)
368  return check_incomplete_message (loader);
369  else if (expected_validity == DBUS_VALIDITY_UNKNOWN)
370  {
371  /* here we just know we didn't segfault and that was the
372  * only test. Also, we record that we got coverage
373  * for the validity reason.
374  */
376  record_validity_seen (loader->corruption_reason);
377 
378  return TRUE;
379  }
380  else
381  return check_invalid_message (loader, expected_validity);
382 }
383 
392 dbus_internal_do_not_use_load_message_file (const DBusString *filename,
393  DBusString *data)
394 {
395  dbus_bool_t retval;
396  DBusError error = DBUS_ERROR_INIT;
397 
398  retval = FALSE;
399 
400  _dbus_verbose ("Loading raw %s\n", _dbus_string_get_const_data (filename));
401  if (!_dbus_file_get_contents (data, filename, &error))
402  {
403  _dbus_warn ("Could not load message file %s: %s",
404  _dbus_string_get_const_data (filename),
405  error.message);
406  dbus_error_free (&error);
407  goto failed;
408  }
409 
410  retval = TRUE;
411 
412  failed:
413 
414  return retval;
415 }
416 
426 dbus_internal_do_not_use_try_message_file (const DBusString *filename,
427  DBusValidity expected_validity)
428 {
429  DBusString data;
430  dbus_bool_t retval;
431 
432  retval = FALSE;
433 
434  if (!_dbus_string_init (&data))
435  _dbus_assert_not_reached ("could not allocate string");
436 
437  if (!dbus_internal_do_not_use_load_message_file (filename, &data))
438  goto failed;
439 
440  retval = dbus_internal_do_not_use_try_message_data (&data, expected_validity);
441 
442  failed:
443 
444  if (!retval)
445  {
446  if (_dbus_string_get_length (&data) > 0)
448  _dbus_string_get_length (&data));
449 
450  _dbus_warn ("Failed message loader test on %s",
451  _dbus_string_get_const_data (filename));
452  }
453 
454  _dbus_string_free (&data);
455 
456  return retval;
457 }
458 
468 dbus_internal_do_not_use_try_message_data (const DBusString *data,
469  DBusValidity expected_validity)
470 {
471  DBusMessageLoader *loader;
472  dbus_bool_t retval;
473  int len;
474  int i;
475 
476  loader = NULL;
477  retval = FALSE;
478 
479  /* Write the data one byte at a time */
480 
481  loader = _dbus_message_loader_new ();
482 
483  /* check some trivial loader functions */
484  _dbus_message_loader_ref (loader);
486 
487  len = _dbus_string_get_length (data);
488  for (i = 0; i < len; i++)
489  {
490  DBusString *buffer;
491 
492  _dbus_message_loader_get_buffer (loader, &buffer);
493  _dbus_string_append_byte (buffer,
494  _dbus_string_get_byte (data, i));
495  _dbus_message_loader_return_buffer (loader, buffer);
496  }
497 
498  if (!check_loader_results (loader, expected_validity))
499  goto failed;
500 
502  loader = NULL;
503 
504  /* Write the data all at once */
505 
506  loader = _dbus_message_loader_new ();
507 
508  {
509  DBusString *buffer;
510 
511  _dbus_message_loader_get_buffer (loader, &buffer);
512  _dbus_string_copy (data, 0, buffer,
513  _dbus_string_get_length (buffer));
514  _dbus_message_loader_return_buffer (loader, buffer);
515  }
516 
517  if (!check_loader_results (loader, expected_validity))
518  goto failed;
519 
521  loader = NULL;
522 
523  /* Write the data 2 bytes at a time */
524 
525  loader = _dbus_message_loader_new ();
526 
527  len = _dbus_string_get_length (data);
528  for (i = 0; i < len; i += 2)
529  {
530  DBusString *buffer;
531 
532  _dbus_message_loader_get_buffer (loader, &buffer);
533  _dbus_string_append_byte (buffer,
534  _dbus_string_get_byte (data, i));
535  if ((i+1) < len)
536  _dbus_string_append_byte (buffer,
537  _dbus_string_get_byte (data, i+1));
538  _dbus_message_loader_return_buffer (loader, buffer);
539  }
540 
541  if (!check_loader_results (loader, expected_validity))
542  goto failed;
543 
545  loader = NULL;
546 
547  retval = TRUE;
548 
549  failed:
550 
551  if (loader)
553 
554  return retval;
555 }
556 
557 static dbus_bool_t
558 process_test_subdir (const DBusString *test_base_dir,
559  const char *subdir,
560  DBusValidity expected_validity,
561  DBusForeachMessageFileFunc function,
562  void *user_data)
563 {
564  DBusString test_directory;
565  DBusString filename;
566  DBusDirIter *dir;
567  dbus_bool_t retval;
568  DBusError error = DBUS_ERROR_INIT;
569 
570  retval = FALSE;
571  dir = NULL;
572 
573  if (!_dbus_string_init (&test_directory))
574  _dbus_assert_not_reached ("didn't allocate test_directory");
575 
576  _dbus_string_init_const (&filename, subdir);
577 
578  if (!_dbus_string_copy (test_base_dir, 0,
579  &test_directory, 0))
580  _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory");
581 
582  if (!_dbus_concat_dir_and_file (&test_directory, &filename))
583  _dbus_assert_not_reached ("couldn't allocate full path");
584 
585  _dbus_string_free (&filename);
586  if (!_dbus_string_init (&filename))
587  _dbus_assert_not_reached ("didn't allocate filename string");
588 
589  dir = _dbus_directory_open (&test_directory, &error);
590  if (dir == NULL)
591  {
592  _dbus_warn ("Could not open %s: %s",
593  _dbus_string_get_const_data (&test_directory),
594  error.message);
595  dbus_error_free (&error);
596  goto failed;
597  }
598 
599  printf ("Testing %s:\n", subdir);
600 
601  next:
602  while (_dbus_directory_get_next_file (dir, &filename, &error))
603  {
604  DBusString full_path;
605 
606  if (!_dbus_string_init (&full_path))
607  _dbus_assert_not_reached ("couldn't init string");
608 
609  if (!_dbus_string_copy (&test_directory, 0, &full_path, 0))
610  _dbus_assert_not_reached ("couldn't copy dir to full_path");
611 
612  if (!_dbus_concat_dir_and_file (&full_path, &filename))
613  _dbus_assert_not_reached ("couldn't concat file to dir");
614 
615  if (_dbus_string_ends_with_c_str (&filename, ".message-raw"))
616  ;
617  else
618  {
619  if (_dbus_string_ends_with_c_str (&filename, ".message"))
620  {
621  printf ("SKIP: Could not load %s, message builder language no longer supported\n",
622  _dbus_string_get_const_data (&filename));
623  }
624 
625  _dbus_verbose ("Skipping non-.message file %s\n",
626  _dbus_string_get_const_data (&filename));
627  _dbus_string_free (&full_path);
628  goto next;
629  }
630 
631  printf (" %s\n",
632  _dbus_string_get_const_data (&filename));
633 
634  if (! (*function) (&full_path,
635  expected_validity, user_data))
636  {
637  _dbus_string_free (&full_path);
638  goto failed;
639  }
640  else
641  _dbus_string_free (&full_path);
642  }
643 
644  if (dbus_error_is_set (&error))
645  {
646  _dbus_warn ("Could not get next file in %s: %s",
647  _dbus_string_get_const_data (&test_directory),
648  error.message);
649  dbus_error_free (&error);
650  goto failed;
651  }
652 
653  retval = TRUE;
654 
655  failed:
656 
657  if (dir)
658  _dbus_directory_close (dir);
659  _dbus_string_free (&test_directory);
660  _dbus_string_free (&filename);
661 
662  return retval;
663 }
664 
675 dbus_internal_do_not_use_foreach_message_file (const char *test_data_dir,
676  DBusForeachMessageFileFunc func,
677  void *user_data)
678 {
679  DBusString test_directory;
680  dbus_bool_t retval;
681 
682  retval = FALSE;
683 
684  _dbus_string_init_const (&test_directory, test_data_dir);
685 
686  if (!process_test_subdir (&test_directory, "valid-messages",
687  DBUS_VALID, func, user_data))
688  goto failed;
689 
690  check_memleaks ();
691 
692  if (!process_test_subdir (&test_directory, "invalid-messages",
693  DBUS_INVALID_FOR_UNKNOWN_REASON, func, user_data))
694  goto failed;
695 
696  check_memleaks ();
697 
698  if (!process_test_subdir (&test_directory, "incomplete-messages",
699  DBUS_VALID_BUT_INCOMPLETE, func, user_data))
700  goto failed;
701 
702  check_memleaks ();
703 
704  retval = TRUE;
705 
706  failed:
707 
708  _dbus_string_free (&test_directory);
709 
710  return retval;
711 }
712 
713 #if 0
714 #define GET_AND_CHECK(iter, typename, literal) \
715  do { \
716  if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_##typename) \
717  _dbus_assert_not_reached ("got wrong argument type from message iter"); \
718  dbus_message_iter_get_basic (&iter, &v_##typename); \
719  if (v_##typename != literal) \
720  _dbus_assert_not_reached ("got wrong value from message iter"); \
721  } while (0)
722 
723 #define GET_AND_CHECK_STRCMP(iter, typename, literal) \
724  do { \
725  if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_##typename) \
726  _dbus_assert_not_reached ("got wrong argument type from message iter"); \
727  dbus_message_iter_get_basic (&iter, &v_##typename); \
728  if (strcmp (v_##typename, literal) != 0) \
729  _dbus_assert_not_reached ("got wrong value from message iter"); \
730  } while (0)
731 
732 #define GET_AND_CHECK_AND_NEXT(iter, typename, literal) \
733  do { \
734  GET_AND_CHECK(iter, typename, literal); \
735  if (!dbus_message_iter_next (&iter)) \
736  _dbus_assert_not_reached ("failed to move iter to next"); \
737  } while (0)
738 
739 #define GET_AND_CHECK_STRCMP_AND_NEXT(iter, typename, literal) \
740  do { \
741  GET_AND_CHECK_STRCMP(iter, typename, literal); \
742  if (!dbus_message_iter_next (&iter)) \
743  _dbus_assert_not_reached ("failed to move iter to next"); \
744  } while (0)
745 
746 static void
747 message_iter_test (DBusMessage *message)
748 {
749  DBusMessageIter iter, array, array2;
750  const char *v_STRING;
751  double v_DOUBLE;
752  dbus_int16_t v_INT16;
753  dbus_uint16_t v_UINT16;
754  dbus_int32_t v_INT32;
755  dbus_uint32_t v_UINT32;
756  dbus_int64_t v_INT64;
757  dbus_uint64_t v_UINT64;
758  unsigned char v_BYTE;
759  dbus_bool_t v_BOOLEAN;
760 
761  const dbus_int32_t *our_int_array;
762  int len;
763 
764  dbus_message_iter_init (message, &iter);
765 
766  GET_AND_CHECK_STRCMP_AND_NEXT (iter, STRING, "Test string");
767  GET_AND_CHECK_AND_NEXT (iter, INT32, -0x12345678);
768  GET_AND_CHECK_AND_NEXT (iter, UINT32, 0xedd1e);
769  GET_AND_CHECK_AND_NEXT (iter, DOUBLE, 3.14159);
770 
772  _dbus_assert_not_reached ("Argument type not an array");
773 
775  _dbus_assert_not_reached ("Array type not double");
776 
777  dbus_message_iter_recurse (&iter, &array);
778 
779  GET_AND_CHECK_AND_NEXT (array, DOUBLE, 1.5);
780  GET_AND_CHECK (array, DOUBLE, 2.5);
781 
782  if (dbus_message_iter_next (&array))
783  _dbus_assert_not_reached ("Didn't reach end of array");
784 
785  if (!dbus_message_iter_next (&iter))
786  _dbus_assert_not_reached ("Reached end of arguments");
787 
788  GET_AND_CHECK_AND_NEXT (iter, BYTE, 0xF0);
789 
791  _dbus_assert_not_reached ("no array");
792 
794  _dbus_assert_not_reached ("Array type not int32");
795 
796  /* Empty array */
797  dbus_message_iter_recurse (&iter, &array);
798 
799  if (dbus_message_iter_next (&array))
800  _dbus_assert_not_reached ("Didn't reach end of array");
801 
802  if (!dbus_message_iter_next (&iter))
803  _dbus_assert_not_reached ("Reached end of arguments");
804 
805  GET_AND_CHECK (iter, BYTE, 0xF0);
806 
807  if (dbus_message_iter_next (&iter))
808  _dbus_assert_not_reached ("Didn't reach end of arguments");
809 }
810 #endif
811 
812 static void
813 verify_test_message (DBusMessage *message)
814 {
815  DBusMessageIter iter;
816  DBusError error = DBUS_ERROR_INIT;
817  dbus_int16_t our_int16;
818  dbus_uint16_t our_uint16;
819  dbus_int32_t our_int;
820  dbus_uint32_t our_uint;
821  const char *our_str;
822  double our_double;
823  double v_DOUBLE;
824  dbus_bool_t our_bool;
825  unsigned char our_byte_1, our_byte_2;
826  const dbus_uint32_t *our_uint32_array = (void*)0xdeadbeef;
827  int our_uint32_array_len;
828  dbus_int32_t *our_int32_array = (void*)0xdeadbeef;
829  int our_int32_array_len;
830  dbus_int64_t our_int64;
831  dbus_uint64_t our_uint64;
832  dbus_int64_t *our_uint64_array = (void*)0xdeadbeef;
833  int our_uint64_array_len;
834  const dbus_int64_t *our_int64_array = (void*)0xdeadbeef;
835  int our_int64_array_len;
836  const double *our_double_array = (void*)0xdeadbeef;
837  int our_double_array_len;
838  const unsigned char *our_byte_array = (void*)0xdeadbeef;
839  int our_byte_array_len;
840  const dbus_bool_t *our_boolean_array = (void*)0xdeadbeef;
841  int our_boolean_array_len;
842  char **our_string_array;
843  int our_string_array_len;
844 
845  dbus_message_iter_init (message, &iter);
846 
847  if (!dbus_message_iter_get_args (&iter, &error,
848  DBUS_TYPE_INT16, &our_int16,
849  DBUS_TYPE_UINT16, &our_uint16,
850  DBUS_TYPE_INT32, &our_int,
851  DBUS_TYPE_UINT32, &our_uint,
852  DBUS_TYPE_INT64, &our_int64,
853  DBUS_TYPE_UINT64, &our_uint64,
854  DBUS_TYPE_STRING, &our_str,
855  DBUS_TYPE_DOUBLE, &our_double,
856  DBUS_TYPE_BOOLEAN, &our_bool,
857  DBUS_TYPE_BYTE, &our_byte_1,
858  DBUS_TYPE_BYTE, &our_byte_2,
860  &our_uint32_array, &our_uint32_array_len,
862  &our_int32_array, &our_int32_array_len,
864  &our_uint64_array, &our_uint64_array_len,
866  &our_int64_array, &our_int64_array_len,
868  &our_double_array, &our_double_array_len,
870  &our_byte_array, &our_byte_array_len,
872  &our_boolean_array, &our_boolean_array_len,
874  &our_string_array, &our_string_array_len,
875  0))
876  {
877  _dbus_warn ("error: %s - %s", error.name,
878  (error.message != NULL) ? error.message : "no message");
879  _dbus_assert_not_reached ("Could not get arguments");
880  }
881 
882  if (our_int16 != -0x123)
883  _dbus_assert_not_reached ("16-bit integers differ!");
884 
885  if (our_uint16 != 0x123)
886  _dbus_assert_not_reached ("16-bit uints differ!");
887 
888  if (our_int != -0x12345678)
889  _dbus_assert_not_reached ("integers differ!");
890 
891  if (our_uint != 0x12300042)
892  _dbus_assert_not_reached ("uints differ!");
893 
894  if (our_int64 != DBUS_INT64_CONSTANT (-0x123456789abcd))
895  _dbus_assert_not_reached ("64-bit integers differ!");
896  if (our_uint64 != DBUS_UINT64_CONSTANT (0x123456789abcd))
897  _dbus_assert_not_reached ("64-bit unsigned integers differ!");
898 
899  v_DOUBLE = 3.14159;
900  if (! _DBUS_DOUBLES_BITWISE_EQUAL (our_double, v_DOUBLE))
901  _dbus_assert_not_reached ("doubles differ!");
902 
903  if (strcmp (our_str, "Test string") != 0)
904  _dbus_assert_not_reached ("strings differ!");
905 
906  if (!our_bool)
907  _dbus_assert_not_reached ("booleans differ");
908 
909  if (our_byte_1 != 42)
910  _dbus_assert_not_reached ("bytes differ!");
911 
912  if (our_byte_2 != 24)
913  _dbus_assert_not_reached ("bytes differ!");
914 
915  if (our_uint32_array_len != 4 ||
916  our_uint32_array[0] != 0x12345678 ||
917  our_uint32_array[1] != 0x23456781 ||
918  our_uint32_array[2] != 0x34567812 ||
919  our_uint32_array[3] != 0x45678123)
920  _dbus_assert_not_reached ("uint array differs");
921 
922  if (our_int32_array_len != 4 ||
923  our_int32_array[0] != 0x12345678 ||
924  our_int32_array[1] != -0x23456781 ||
925  our_int32_array[2] != 0x34567812 ||
926  our_int32_array[3] != -0x45678123)
927  _dbus_assert_not_reached ("int array differs");
928 
929  if (our_uint64_array_len != 4 ||
930  our_uint64_array[0] != 0x12345678 ||
931  our_uint64_array[1] != 0x23456781 ||
932  our_uint64_array[2] != 0x34567812 ||
933  our_uint64_array[3] != 0x45678123)
934  _dbus_assert_not_reached ("uint64 array differs");
935 
936  if (our_int64_array_len != 4 ||
937  our_int64_array[0] != 0x12345678 ||
938  our_int64_array[1] != -0x23456781 ||
939  our_int64_array[2] != 0x34567812 ||
940  our_int64_array[3] != -0x45678123)
941  _dbus_assert_not_reached ("int64 array differs");
942 
943  if (our_double_array_len != 3)
944  _dbus_assert_not_reached ("double array had wrong length");
945 
946  /* On all IEEE machines (i.e. everything sane) exact equality
947  * should be preserved over the wire
948  */
949  v_DOUBLE = 0.1234;
950  if (! _DBUS_DOUBLES_BITWISE_EQUAL (our_double_array[0], v_DOUBLE))
951  _dbus_assert_not_reached ("double array had wrong values");
952  v_DOUBLE = 9876.54321;
953  if (! _DBUS_DOUBLES_BITWISE_EQUAL (our_double_array[1], v_DOUBLE))
954  _dbus_assert_not_reached ("double array had wrong values");
955  v_DOUBLE = -300.0;
956  if (! _DBUS_DOUBLES_BITWISE_EQUAL (our_double_array[2], v_DOUBLE))
957  _dbus_assert_not_reached ("double array had wrong values");
958 
959  if (our_byte_array_len != 4)
960  _dbus_assert_not_reached ("byte array had wrong length");
961 
962  if (our_byte_array[0] != 'a' ||
963  our_byte_array[1] != 'b' ||
964  our_byte_array[2] != 'c' ||
965  our_byte_array[3] != 234)
966  _dbus_assert_not_reached ("byte array had wrong values");
967 
968  if (our_boolean_array_len != 5)
969  _dbus_assert_not_reached ("bool array had wrong length");
970 
971  if (our_boolean_array[0] != TRUE ||
972  our_boolean_array[1] != FALSE ||
973  our_boolean_array[2] != TRUE ||
974  our_boolean_array[3] != TRUE ||
975  our_boolean_array[4] != FALSE)
976  _dbus_assert_not_reached ("bool array had wrong values");
977 
978  if (our_string_array_len != 4)
979  _dbus_assert_not_reached ("string array was wrong length");
980 
981  if (strcmp (our_string_array[0], "Foo") != 0 ||
982  strcmp (our_string_array[1], "bar") != 0 ||
983  strcmp (our_string_array[2], "") != 0 ||
984  strcmp (our_string_array[3], "woo woo woo woo") != 0)
985  _dbus_assert_not_reached ("string array had wrong values");
986 
987  dbus_free_string_array (our_string_array);
988 
989  if (dbus_message_iter_next (&iter))
990  _dbus_assert_not_reached ("Didn't reach end of arguments");
991 }
992 
993 static void
994 verify_test_message_args_ignored (DBusMessage *message)
995 {
996  DBusMessageIter iter;
997  DBusError error = DBUS_ERROR_INIT;
998  dbus_uint32_t our_uint;
999  DBusInitialFDs *initial_fds;
1000 
1001  initial_fds = _dbus_check_fdleaks_enter ();
1002 
1003  /* parse with empty signature: "" */
1004  dbus_message_iter_init (message, &iter);
1005  if (!dbus_message_iter_get_args (&iter, &error,
1007  {
1008  _dbus_warn ("error: %s - %s", error.name,
1009  (error.message != NULL) ? error.message : "no message");
1010  }
1011  else
1012  {
1013  _dbus_assert (!dbus_error_is_set (&error));
1014  _dbus_verbose ("arguments ignored.\n");
1015  }
1016 
1017  /* parse with shorter signature: "u" */
1018  dbus_message_iter_init (message, &iter);
1019  if (!dbus_message_iter_get_args (&iter, &error,
1020  DBUS_TYPE_UINT32, &our_uint,
1022  {
1023  _dbus_warn ("error: %s - %s", error.name,
1024  (error.message != NULL) ? error.message : "no message");
1025  }
1026  else
1027  {
1028  _dbus_assert (!dbus_error_is_set (&error));
1029  _dbus_verbose ("arguments ignored.\n");
1030  }
1031 
1032  _dbus_check_fdleaks_leave (initial_fds);
1033 }
1034 
1035 static void
1036 verify_test_message_memleak (DBusMessage *message)
1037 {
1038  DBusMessageIter iter;
1039  DBusError error = DBUS_ERROR_INIT;
1040  dbus_uint32_t our_uint1;
1041  dbus_uint32_t our_uint2;
1042  dbus_uint32_t our_uint3;
1043  char **our_string_array1;
1044  int our_string_array_len1;
1045  char **our_string_array2;
1046  int our_string_array_len2;
1047 #ifdef HAVE_UNIX_FD_PASSING
1048  int our_unix_fd1;
1049  int our_unix_fd2;
1050 #endif
1051  DBusInitialFDs *initial_fds;
1052 
1053  initial_fds = _dbus_check_fdleaks_enter ();
1054 
1055  /* parse with wrong signature: "uashuu" */
1056  dbus_error_free (&error);
1057  dbus_message_iter_init (message, &iter);
1058  if (!dbus_message_iter_get_args (&iter, &error,
1059  DBUS_TYPE_UINT32, &our_uint1,
1061  &our_string_array1, &our_string_array_len1,
1062 #ifdef HAVE_UNIX_FD_PASSING
1063  DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1064 #endif
1065  DBUS_TYPE_UINT32, &our_uint2,
1066  DBUS_TYPE_UINT32, &our_uint3,
1068  {
1069  _dbus_verbose ("expected error: %s - %s\n", error.name,
1070  (error.message != NULL) ? error.message : "no message");
1071  /* ensure array of string and unix fd not leaked */
1072  _dbus_assert (our_string_array1 == NULL);
1073 #ifdef HAVE_UNIX_FD_PASSING
1074  _dbus_assert (our_unix_fd1 == -1);
1075 #endif
1076  }
1077  else
1078  {
1079  _dbus_warn ("error: parse with wrong signature: 'uashuu'.");
1080  }
1081 
1082  /* parse with wrong signature: "uashuashu" */
1083  dbus_message_iter_init (message, &iter);
1084  dbus_error_free (&error);
1085  if (!dbus_message_iter_get_args (&iter, &error,
1086  DBUS_TYPE_UINT32, &our_uint1,
1088  &our_string_array1, &our_string_array_len1,
1089 #ifdef HAVE_UNIX_FD_PASSING
1090  DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1091 #endif
1092  DBUS_TYPE_UINT32, &our_uint2,
1094  &our_string_array2, &our_string_array_len2,
1095 #ifdef HAVE_UNIX_FD_PASSING
1096  DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1097 #endif
1098  DBUS_TYPE_UINT32, &our_uint3,
1100  {
1101  _dbus_verbose ("expected error: %s - %s\n", error.name,
1102  (error.message != NULL) ? error.message : "no message");
1103  /* ensure array of string and unix fd not leaked */
1104  _dbus_assert (our_string_array1 == NULL);
1105  _dbus_assert (our_string_array2 == NULL);
1106 #ifdef HAVE_UNIX_FD_PASSING
1107  _dbus_assert (our_unix_fd1 == -1);
1108  _dbus_assert (our_unix_fd2 == -1);
1109 #endif
1110  }
1111  else
1112  {
1113  _dbus_warn ("error: parse with wrong signature: 'uashuashu'.");
1114  }
1115 
1116  /* parse with correct signature: "uashuash" */
1117  dbus_message_iter_init (message, &iter);
1118  dbus_error_free (&error);
1119  if (!dbus_message_iter_get_args (&iter, &error,
1120  DBUS_TYPE_UINT32, &our_uint1,
1122  &our_string_array1, &our_string_array_len1,
1123 #ifdef HAVE_UNIX_FD_PASSING
1124  DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1125 #endif
1126  DBUS_TYPE_UINT32, &our_uint2,
1128  &our_string_array2, &our_string_array_len2,
1129 #ifdef HAVE_UNIX_FD_PASSING
1130  DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1131 #endif
1133  {
1134  _dbus_warn ("error: %s - %s", error.name,
1135  (error.message != NULL) ? error.message : "no message");
1136  _dbus_assert_not_reached ("Could not get arguments");
1137  }
1138  else
1139  {
1140  dbus_free_string_array (our_string_array1);
1141  dbus_free_string_array (our_string_array2);
1142 #ifdef HAVE_UNIX_FD_PASSING
1143  _dbus_close (our_unix_fd1, &error);
1144  _dbus_close (our_unix_fd2, &error);
1145 #endif
1146  }
1147  _dbus_check_fdleaks_leave (initial_fds);
1148 }
1149 
1157 _dbus_message_test (const char *test_data_dir)
1158 {
1159  DBusMessage *message, *message_without_unix_fds;
1160  DBusMessageLoader *loader;
1161  int i;
1162  const char *data;
1163  DBusMessage *copy;
1164  const char *name1;
1165  const char *name2;
1166  const dbus_uint32_t our_uint32_array[] =
1167  { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1168  const dbus_int32_t our_int32_array[] =
1169  { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1170  const dbus_uint32_t *v_ARRAY_UINT32 = our_uint32_array;
1171  const dbus_int32_t *v_ARRAY_INT32 = our_int32_array;
1172  const dbus_uint64_t our_uint64_array[] =
1173  { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1174  const dbus_int64_t our_int64_array[] =
1175  { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1176  const dbus_uint64_t *v_ARRAY_UINT64 = our_uint64_array;
1177  const dbus_int64_t *v_ARRAY_INT64 = our_int64_array;
1178  const char *our_string_array[] = { "Foo", "bar", "", "woo woo woo woo" };
1179  const char *our_string_array1[] = { "foo", "Bar", "", "Woo woo Woo woo" };
1180  const char **v_ARRAY_STRING = our_string_array;
1181  const char **v1_ARRAY_STRING = our_string_array1;
1182  const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };
1183  const double *v_ARRAY_DOUBLE = our_double_array;
1184  const unsigned char our_byte_array[] = { 'a', 'b', 'c', 234 };
1185  const unsigned char *v_ARRAY_BYTE = our_byte_array;
1186  const dbus_bool_t our_boolean_array[] = { TRUE, FALSE, TRUE, TRUE, FALSE };
1187  const dbus_bool_t *v_ARRAY_BOOLEAN = our_boolean_array;
1188  char sig[64];
1189  const char *s;
1190  const char *v_STRING;
1191  double v_DOUBLE;
1192  dbus_int16_t v_INT16;
1193  dbus_uint16_t v_UINT16;
1194  dbus_int32_t v_INT32;
1195  dbus_uint32_t v_UINT32;
1196  dbus_uint32_t v1_UINT32;
1197  dbus_int64_t v_INT64;
1198  dbus_uint64_t v_UINT64;
1199  unsigned char v_BYTE;
1200  unsigned char v2_BYTE;
1201  dbus_bool_t v_BOOLEAN;
1202  DBusMessageIter iter, array_iter, struct_iter;
1203 #ifdef HAVE_UNIX_FD_PASSING
1204  int v_UNIX_FD;
1205  int v1_UNIX_FD;
1206 #endif
1207  char **decomposed;
1208  DBusInitialFDs *initial_fds;
1209  dbus_bool_t ok;
1210  char basic_types[] = DBUS_TYPE_BYTE_AS_STRING \
1220 
1221  initial_fds = _dbus_check_fdleaks_enter ();
1222 
1223  message = dbus_message_new_method_call ("org.freedesktop.DBus.TestService",
1224  "/org/freedesktop/TestPath",
1225  "Foo.TestInterface",
1226  "TestMethod");
1227  _dbus_assert (dbus_message_has_destination (message, "org.freedesktop.DBus.TestService"));
1228  _dbus_assert (dbus_message_is_method_call (message, "Foo.TestInterface",
1229  "TestMethod"));
1230  _dbus_assert (strcmp (dbus_message_get_path (message),
1231  "/org/freedesktop/TestPath") == 0);
1232  dbus_message_set_serial (message, 1234);
1233 
1234  /* string length including nul byte not a multiple of 4 */
1235  if (!dbus_message_set_sender (message, "org.foo.bar1"))
1236  _dbus_assert_not_reached ("out of memory");
1237 
1238  _dbus_assert (dbus_message_has_sender (message, "org.foo.bar1"));
1239  dbus_message_set_reply_serial (message, 5678);
1240 
1242  _dbus_string_get_length (&message->header.data));
1243  _dbus_verbose_bytes_of_string (&message->body, 0,
1244  _dbus_string_get_length (&message->body));
1245 
1246  if (!dbus_message_set_sender (message, NULL))
1247  _dbus_assert_not_reached ("out of memory");
1248 
1249 
1251  _dbus_string_get_length (&message->header.data));
1252  _dbus_verbose_bytes_of_string (&message->body, 0,
1253  _dbus_string_get_length (&message->body));
1254 
1255 
1256  _dbus_assert (!dbus_message_has_sender (message, "org.foo.bar1"));
1257  _dbus_assert (dbus_message_get_serial (message) == 1234);
1258  _dbus_assert (dbus_message_get_reply_serial (message) == 5678);
1259  _dbus_assert (dbus_message_has_destination (message, "org.freedesktop.DBus.TestService"));
1260 
1261  _dbus_assert (dbus_message_get_no_reply (message) == FALSE);
1262  dbus_message_set_no_reply (message, TRUE);
1264  dbus_message_set_no_reply (message, FALSE);
1265  _dbus_assert (dbus_message_get_no_reply (message) == FALSE);
1266 
1267  /* Set/get some header fields */
1268 
1269  if (!dbus_message_set_path (message, "/foo"))
1270  _dbus_assert_not_reached ("out of memory");
1271  _dbus_assert (strcmp (dbus_message_get_path (message),
1272  "/foo") == 0);
1273 
1274  if (!dbus_message_set_interface (message, "org.Foo"))
1275  _dbus_assert_not_reached ("out of memory");
1276  _dbus_assert (strcmp (dbus_message_get_interface (message),
1277  "org.Foo") == 0);
1278 
1279  if (!dbus_message_set_member (message, "Bar"))
1280  _dbus_assert_not_reached ("out of memory");
1281  _dbus_assert (strcmp (dbus_message_get_member (message),
1282  "Bar") == 0);
1283 
1284  /* Set/get them with longer values */
1285  if (!dbus_message_set_path (message, "/foo/bar"))
1286  _dbus_assert_not_reached ("out of memory");
1287  _dbus_assert (strcmp (dbus_message_get_path (message),
1288  "/foo/bar") == 0);
1289 
1290  if (!dbus_message_set_interface (message, "org.Foo.Bar"))
1291  _dbus_assert_not_reached ("out of memory");
1292  _dbus_assert (strcmp (dbus_message_get_interface (message),
1293  "org.Foo.Bar") == 0);
1294 
1295  if (!dbus_message_set_member (message, "BarFoo"))
1296  _dbus_assert_not_reached ("out of memory");
1297  _dbus_assert (strcmp (dbus_message_get_member (message),
1298  "BarFoo") == 0);
1299 
1300  /* Realloc shorter again */
1301 
1302  if (!dbus_message_set_path (message, "/foo"))
1303  _dbus_assert_not_reached ("out of memory");
1304  _dbus_assert (strcmp (dbus_message_get_path (message),
1305  "/foo") == 0);
1306 
1307  if (!dbus_message_set_interface (message, "org.Foo"))
1308  _dbus_assert_not_reached ("out of memory");
1309  _dbus_assert (strcmp (dbus_message_get_interface (message),
1310  "org.Foo") == 0);
1311 
1312  if (!dbus_message_set_member (message, "Bar"))
1313  _dbus_assert_not_reached ("out of memory");
1314  _dbus_assert (strcmp (dbus_message_get_member (message),
1315  "Bar") == 0);
1316 
1317  /* Path decomposing */
1318  dbus_message_set_path (message, NULL);
1319  dbus_message_get_path_decomposed (message, &decomposed);
1320  _dbus_assert (decomposed == NULL);
1321  dbus_free_string_array (decomposed);
1322 
1323  dbus_message_set_path (message, "/");
1324  dbus_message_get_path_decomposed (message, &decomposed);
1325  _dbus_assert (decomposed != NULL);
1326  _dbus_assert (decomposed[0] == NULL);
1327  dbus_free_string_array (decomposed);
1328 
1329  dbus_message_set_path (message, "/a/b");
1330  dbus_message_get_path_decomposed (message, &decomposed);
1331  _dbus_assert (decomposed != NULL);
1332  _dbus_assert (strcmp (decomposed[0], "a") == 0);
1333  _dbus_assert (strcmp (decomposed[1], "b") == 0);
1334  _dbus_assert (decomposed[2] == NULL);
1335  dbus_free_string_array (decomposed);
1336 
1337  dbus_message_set_path (message, "/spam/eggs");
1338  dbus_message_get_path_decomposed (message, &decomposed);
1339  _dbus_assert (decomposed != NULL);
1340  _dbus_assert (strcmp (decomposed[0], "spam") == 0);
1341  _dbus_assert (strcmp (decomposed[1], "eggs") == 0);
1342  _dbus_assert (decomposed[2] == NULL);
1343  dbus_free_string_array (decomposed);
1344 
1345  dbus_message_unref (message);
1346 
1347  /* Test the vararg functions */
1348  message = dbus_message_new_method_call ("org.freedesktop.DBus.TestService",
1349  "/org/freedesktop/TestPath",
1350  "Foo.TestInterface",
1351  "TestMethod");
1352  dbus_message_set_serial (message, 1);
1353  dbus_message_set_reply_serial (message, 5678);
1354 
1355  v_INT16 = -0x123;
1356  v_UINT16 = 0x123;
1357  v_INT32 = -0x12345678;
1358  v_UINT32 = 0x12300042;
1359  v_INT64 = DBUS_INT64_CONSTANT (-0x123456789abcd);
1360  v_UINT64 = DBUS_UINT64_CONSTANT (0x123456789abcd);
1361  v_STRING = "Test string";
1362  v_DOUBLE = 3.14159;
1363  v_BOOLEAN = TRUE;
1364  v_BYTE = 42;
1365  v2_BYTE = 24;
1366 #ifdef HAVE_UNIX_FD_PASSING
1367  v_UNIX_FD = 1;
1368  v1_UNIX_FD = 2;
1369 #endif
1370 
1371  dbus_message_append_args (message,
1372  DBUS_TYPE_INT16, &v_INT16,
1373  DBUS_TYPE_UINT16, &v_UINT16,
1374  DBUS_TYPE_INT32, &v_INT32,
1375  DBUS_TYPE_UINT32, &v_UINT32,
1376  DBUS_TYPE_INT64, &v_INT64,
1377  DBUS_TYPE_UINT64, &v_UINT64,
1378  DBUS_TYPE_STRING, &v_STRING,
1379  DBUS_TYPE_DOUBLE, &v_DOUBLE,
1380  DBUS_TYPE_BOOLEAN, &v_BOOLEAN,
1381  DBUS_TYPE_BYTE, &v_BYTE,
1382  DBUS_TYPE_BYTE, &v2_BYTE,
1383  DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &v_ARRAY_UINT32,
1384  _DBUS_N_ELEMENTS (our_uint32_array),
1385  DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &v_ARRAY_INT32,
1386  _DBUS_N_ELEMENTS (our_int32_array),
1387  DBUS_TYPE_ARRAY, DBUS_TYPE_UINT64, &v_ARRAY_UINT64,
1388  _DBUS_N_ELEMENTS (our_uint64_array),
1389  DBUS_TYPE_ARRAY, DBUS_TYPE_INT64, &v_ARRAY_INT64,
1390  _DBUS_N_ELEMENTS (our_int64_array),
1391  DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &v_ARRAY_DOUBLE,
1392  _DBUS_N_ELEMENTS (our_double_array),
1393  DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &v_ARRAY_BYTE,
1394  _DBUS_N_ELEMENTS (our_byte_array),
1395  DBUS_TYPE_ARRAY, DBUS_TYPE_BOOLEAN, &v_ARRAY_BOOLEAN,
1396  _DBUS_N_ELEMENTS (our_boolean_array),
1397  DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &v_ARRAY_STRING,
1398  _DBUS_N_ELEMENTS (our_string_array),
1399 
1401 
1402  i = 0;
1403  sig[i++] = DBUS_TYPE_INT16;
1404  sig[i++] = DBUS_TYPE_UINT16;
1405  sig[i++] = DBUS_TYPE_INT32;
1406  sig[i++] = DBUS_TYPE_UINT32;
1407  sig[i++] = DBUS_TYPE_INT64;
1408  sig[i++] = DBUS_TYPE_UINT64;
1409  sig[i++] = DBUS_TYPE_STRING;
1410  sig[i++] = DBUS_TYPE_DOUBLE;
1411  sig[i++] = DBUS_TYPE_BOOLEAN;
1412  sig[i++] = DBUS_TYPE_BYTE;
1413  sig[i++] = DBUS_TYPE_BYTE;
1414  sig[i++] = DBUS_TYPE_ARRAY;
1415  sig[i++] = DBUS_TYPE_UINT32;
1416  sig[i++] = DBUS_TYPE_ARRAY;
1417  sig[i++] = DBUS_TYPE_INT32;
1418  sig[i++] = DBUS_TYPE_ARRAY;
1419  sig[i++] = DBUS_TYPE_UINT64;
1420  sig[i++] = DBUS_TYPE_ARRAY;
1421  sig[i++] = DBUS_TYPE_INT64;
1422  sig[i++] = DBUS_TYPE_ARRAY;
1423  sig[i++] = DBUS_TYPE_DOUBLE;
1424  sig[i++] = DBUS_TYPE_ARRAY;
1425  sig[i++] = DBUS_TYPE_BYTE;
1426  sig[i++] = DBUS_TYPE_ARRAY;
1427  sig[i++] = DBUS_TYPE_BOOLEAN;
1428  sig[i++] = DBUS_TYPE_ARRAY;
1429  sig[i++] = DBUS_TYPE_STRING;
1430 
1431  message_without_unix_fds = dbus_message_copy(message);
1432  _dbus_assert(message_without_unix_fds);
1433 #ifdef HAVE_UNIX_FD_PASSING
1434  dbus_message_append_args (message,
1435  DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1437  sig[i++] = DBUS_TYPE_UNIX_FD;
1438 #endif
1439  sig[i++] = DBUS_TYPE_INVALID;
1440 
1441  _dbus_assert (i < (int) _DBUS_N_ELEMENTS (sig));
1442 
1443  _dbus_verbose ("HEADER\n");
1445  _dbus_string_get_length (&message->header.data));
1446  _dbus_verbose ("BODY\n");
1447  _dbus_verbose_bytes_of_string (&message->body, 0,
1448  _dbus_string_get_length (&message->body));
1449 
1450  _dbus_verbose ("Signature expected \"%s\" actual \"%s\"\n",
1451  sig, dbus_message_get_signature (message));
1452 
1453  s = dbus_message_get_signature (message);
1454 
1455  _dbus_assert (dbus_message_has_signature (message, sig));
1456  _dbus_assert (strcmp (s, sig) == 0);
1457 
1458  verify_test_message (message);
1459 
1460  copy = dbus_message_copy (message);
1461 
1464  _dbus_assert (message->header.padding == copy->header.padding);
1465 
1466  _dbus_assert (_dbus_string_get_length (&message->header.data) ==
1467  _dbus_string_get_length (&copy->header.data));
1468 
1469  _dbus_assert (_dbus_string_get_length (&message->body) ==
1470  _dbus_string_get_length (&copy->body));
1471 
1472  verify_test_message (copy);
1473 
1474  name1 = dbus_message_get_interface (message);
1475  name2 = dbus_message_get_interface (copy);
1476 
1477  _dbus_assert (strcmp (name1, name2) == 0);
1478 
1479  name1 = dbus_message_get_member (message);
1480  name2 = dbus_message_get_member (copy);
1481 
1482  _dbus_assert (strcmp (name1, name2) == 0);
1483 
1484  dbus_message_unref (copy);
1485 
1486  /* Message loader test */
1487  dbus_message_lock (message);
1488  loader = _dbus_message_loader_new ();
1489 
1490  /* check ref/unref */
1491  _dbus_message_loader_ref (loader);
1492  _dbus_message_loader_unref (loader);
1493 
1494  /* Write the header data one byte at a time */
1495  data = _dbus_string_get_const_data (&message->header.data);
1496  for (i = 0; i < _dbus_string_get_length (&message->header.data); i++)
1497  {
1498  DBusString *buffer;
1499 
1500  _dbus_message_loader_get_buffer (loader, &buffer);
1501  _dbus_string_append_byte (buffer, data[i]);
1502  _dbus_message_loader_return_buffer (loader, buffer);
1503  }
1504 
1505  /* Write the body data one byte at a time */
1506  data = _dbus_string_get_const_data (&message->body);
1507  for (i = 0; i < _dbus_string_get_length (&message->body); i++)
1508  {
1509  DBusString *buffer;
1510 
1511  _dbus_message_loader_get_buffer (loader, &buffer);
1512  _dbus_string_append_byte (buffer, data[i]);
1513  _dbus_message_loader_return_buffer (loader, buffer);
1514  }
1515 
1516 #ifdef HAVE_UNIX_FD_PASSING
1517  {
1518  int *unix_fds;
1519  unsigned n_unix_fds;
1520  /* Write unix fd */
1521  _dbus_message_loader_get_unix_fds(loader, &unix_fds, &n_unix_fds);
1522  _dbus_assert(n_unix_fds > 0);
1523  _dbus_assert(message->n_unix_fds == 1);
1524  unix_fds[0] = _dbus_dup(message->unix_fds[0], NULL);
1525  _dbus_assert(unix_fds[0] >= 0);
1526  _dbus_message_loader_return_unix_fds(loader, unix_fds, 1);
1527  }
1528 #endif
1529 
1530  dbus_message_unref (message);
1531 
1532  /* Now pop back the message */
1534  _dbus_assert_not_reached ("no memory to queue messages");
1535 
1537  _dbus_assert_not_reached ("message loader corrupted");
1538 
1539  message = _dbus_message_loader_pop_message (loader);
1540  if (!message)
1541  _dbus_assert_not_reached ("received a NULL message");
1542 
1543  if (dbus_message_get_reply_serial (message) != 5678)
1544  _dbus_assert_not_reached ("reply serial fields differ");
1545 
1546  dbus_message_unref (message);
1547 
1548  /* ovveride the serial, since it was reset by dbus_message_copy() */
1549  dbus_message_set_serial(message_without_unix_fds, 8901);
1550 
1551  dbus_message_lock (message_without_unix_fds);
1552 
1553  verify_test_message (message_without_unix_fds);
1554 
1555  {
1556  /* Marshal and demarshal the message. */
1557 
1558  DBusMessage *message2;
1559  DBusError error = DBUS_ERROR_INIT;
1560  char *marshalled = NULL;
1561  int len = 0;
1562  char garbage_header[DBUS_MINIMUM_HEADER_SIZE] = "xxx";
1563 
1564  if (!dbus_message_marshal (message_without_unix_fds, &marshalled, &len))
1565  _dbus_assert_not_reached ("failed to marshal message");
1566 
1567  _dbus_assert (len != 0);
1568  _dbus_assert (marshalled != NULL);
1569 
1570  _dbus_assert (dbus_message_demarshal_bytes_needed (marshalled, len) == len);
1571  message2 = dbus_message_demarshal (marshalled, len, &error);
1572 
1573  _dbus_assert (message2 != NULL);
1574  _dbus_assert (!dbus_error_is_set (&error));
1575  verify_test_message (message2);
1576 
1577  dbus_message_unref (message2);
1578  dbus_free (marshalled);
1579 
1580  /* Demarshal invalid message. */
1581 
1582  message2 = dbus_message_demarshal ("invalid", 7, &error);
1583  _dbus_assert (message2 == NULL);
1584  _dbus_assert (dbus_error_is_set (&error));
1585  dbus_error_free (&error);
1586 
1587  /* Demarshal invalid (empty) message. */
1588 
1589  message2 = dbus_message_demarshal ("", 0, &error);
1590  _dbus_assert (message2 == NULL);
1591  _dbus_assert (dbus_error_is_set (&error));
1592  dbus_error_free (&error);
1593 
1594  /* Bytes needed to demarshal empty message: 0 (more) */
1595 
1597 
1598  /* Bytes needed to demarshal invalid message: -1 (error). */
1599 
1601  }
1602 
1603  dbus_message_unref (message_without_unix_fds);
1604  _dbus_message_loader_unref (loader);
1605 
1606  check_memleaks ();
1607  _dbus_check_fdleaks_leave (initial_fds);
1608  initial_fds = _dbus_check_fdleaks_enter ();
1609 
1610  /* Test enumeration of array elements */
1611  for (i = strlen (basic_types) - 1; i > 0; i--)
1612  {
1613  DBusBasicValue val;
1614  int some;
1615  char* signature = _dbus_strdup ("?");
1616 
1617  signature[0] = basic_types[i];
1618  s = "SomeThingToSay";
1619  memset (&val, '\0', sizeof (val));
1620 
1621  message = dbus_message_new_method_call ("de.ende.test",
1622  "/de/ende/test", "de.ende.Test", "ArtistName");
1623  _dbus_assert (message != NULL);
1624  dbus_message_iter_init_append (message, &iter);
1626  signature, &array_iter);
1627  for (some = 0; some < 3; some++)
1628  {
1629  if (basic_types[i] == DBUS_TYPE_STRING)
1631  else
1632  dbus_message_iter_append_basic (&array_iter, basic_types[i], &val);
1633  }
1634  dbus_message_iter_close_container (&iter, &array_iter);
1635  dbus_message_iter_init (message, &iter);
1637  dbus_message_unref (message);
1638  dbus_free (signature);
1639  }
1640  /* Array of structs */
1641  message = dbus_message_new_method_call ("de.ende.test",
1642  "/de/ende/test", "de.ende.Test", "ArtistName");
1643  _dbus_assert (message != NULL);
1644  dbus_message_iter_init_append (message, &iter);
1648  DBUS_STRUCT_END_CHAR_AS_STRING, &array_iter);
1650  NULL, &struct_iter);
1651  s = "SpamAndEggs";
1653  dbus_message_iter_close_container (&array_iter, &struct_iter);
1654  dbus_message_iter_close_container (&iter, &array_iter);
1655  dbus_message_iter_init (message, &iter);
1657  dbus_message_unref (message);
1658  check_memleaks ();
1659 
1660  /* Check that we can abandon a container */
1661  message = dbus_message_new_method_call ("org.freedesktop.DBus.TestService",
1662  "/org/freedesktop/TestPath",
1663  "Foo.TestInterface",
1664  "Method");
1665 
1666  dbus_message_iter_init_append (message, &iter);
1667 
1673  &array_iter);
1674  _dbus_assert (ok);
1676  NULL, &struct_iter);
1677  _dbus_assert (ok);
1678  s = "peaches";
1679  ok = dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &s);
1680  _dbus_assert (ok);
1681 
1682  /* uh-oh, error, try and unwind */
1683 
1684  dbus_message_iter_abandon_container (&array_iter, &struct_iter);
1685  dbus_message_iter_abandon_container (&array_iter, &iter);
1686 
1687  dbus_message_unref (message);
1688 
1689  /* Check we should not leak array of string or unix fd, fd.o#21259 */
1690  message = dbus_message_new_method_call ("org.freedesktop.DBus.TestService",
1691  "/org/freedesktop/TestPath",
1692  "Foo.TestInterface",
1693  "Method");
1694 
1695  /* signature "uashuash" */
1696  dbus_message_append_args (message,
1697  DBUS_TYPE_UINT32, &v_UINT32,
1698  DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &v_ARRAY_STRING,
1699  _DBUS_N_ELEMENTS (our_string_array),
1700 #ifdef HAVE_UNIX_FD_PASSING
1701  DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1702 #endif
1703  DBUS_TYPE_UINT32, &v1_UINT32,
1704  DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &v1_ARRAY_STRING,
1705  _DBUS_N_ELEMENTS (our_string_array1),
1706 #ifdef HAVE_UNIX_FD_PASSING
1707  DBUS_TYPE_UNIX_FD, &v1_UNIX_FD,
1708 #endif
1709 
1711 
1712  i = 0;
1713  sig[i++] = DBUS_TYPE_UINT32;
1714  sig[i++] = DBUS_TYPE_ARRAY;
1715  sig[i++] = DBUS_TYPE_STRING;
1716 #ifdef HAVE_UNIX_FD_PASSING
1717  sig[i++] = DBUS_TYPE_UNIX_FD;
1718 #endif
1719  sig[i++] = DBUS_TYPE_UINT32;
1720  sig[i++] = DBUS_TYPE_ARRAY;
1721  sig[i++] = DBUS_TYPE_STRING;
1722 #ifdef HAVE_UNIX_FD_PASSING
1723  sig[i++] = DBUS_TYPE_UNIX_FD;
1724 #endif
1725  sig[i++] = DBUS_TYPE_INVALID;
1726 
1727  _dbus_assert (i < (int) _DBUS_N_ELEMENTS (sig));
1728 
1729  verify_test_message_args_ignored (message);
1730  verify_test_message_memleak (message);
1731 
1732  dbus_message_unref (message);
1733 
1734  /* Load all the sample messages from the message factory */
1735  {
1736  DBusMessageDataIter diter;
1737  DBusMessageData mdata;
1738  int count;
1739 
1740  reset_validities_seen ();
1741 
1742  count = 0;
1743  _dbus_message_data_iter_init (&diter);
1744 
1745  while (_dbus_message_data_iter_get_and_next (&diter,
1746  &mdata))
1747  {
1748  if (!dbus_internal_do_not_use_try_message_data (&mdata.data,
1749  mdata.expected_validity))
1750  {
1751  _dbus_warn ("expected validity %d and did not get it",
1752  mdata.expected_validity);
1753  _dbus_assert_not_reached ("message data failed");
1754  }
1755 
1756  _dbus_message_data_free (&mdata);
1757 
1758  count += 1;
1759  }
1760 
1761  printf ("%d sample messages tested\n", count);
1762 
1763  print_validities_seen (FALSE);
1764  print_validities_seen (TRUE);
1765  }
1766 
1767  check_memleaks ();
1768  _dbus_check_fdleaks_leave (initial_fds);
1769 
1770  /* Now load every message in test_data_dir if we have one */
1771  if (test_data_dir == NULL)
1772  return TRUE;
1773 
1774  initial_fds = _dbus_check_fdleaks_enter ();
1775 
1776  if (!dbus_internal_do_not_use_foreach_message_file (test_data_dir,
1777  (DBusForeachMessageFileFunc)
1778  dbus_internal_do_not_use_try_message_file,
1779  NULL))
1780  _dbus_assert_not_reached ("foreach_message_file test failed");
1781 
1782  _dbus_check_fdleaks_leave (initial_fds);
1783 
1784  return TRUE;
1785 }
1786 
1787 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
#define DBUS_TYPE_UINT16
Type code marking a 16-bit unsigned integer.
Definition: dbus-protocol.h:78
void dbus_message_lock(DBusMessage *message)
Locks a message.
Definition: dbus-message.c:407
const char * message
public error message field
Definition: dbus-errors.h:51
#define NULL
A null pointer, defined appropriately for C or C++.
dbus_bool_t dbus_message_is_method_call(DBusMessage *message, const char *iface, const char *method)
Checks whether the message is a method call with the given interface and member fields.
void dbus_message_set_no_reply(DBusMessage *message, dbus_bool_t no_reply)
Sets a flag indicating that the message does not want a reply; if this flag is set, the other end of the connection may (but is not required to) optimize by not sending method return or error replies.
int dbus_message_iter_get_arg_type(DBusMessageIter *iter)
Returns the argument type of the argument that the message iterator points to.
DBUS_PRIVATE_EXPORT void _dbus_message_loader_return_buffer(DBusMessageLoader *loader, DBusString *buffer)
Returns a buffer obtained from _dbus_message_loader_get_buffer(), indicating to the loader how many b...
void dbus_free(void *memory)
Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().
Definition: dbus-memory.c:701
DBUS_PRIVATE_EXPORT void _dbus_message_loader_return_unix_fds(DBusMessageLoader *loader, int *fds, unsigned n_fds)
Returns a buffer obtained from _dbus_message_loader_get_unix_fds().
dbus_uint32_t dbus_message_get_serial(DBusMessage *message)
Returns the serial of a message or 0 if none has been specified.
#define DBUS_STRUCT_BEGIN_CHAR_AS_STRING
DBUS_STRUCT_BEGIN_CHAR as a string literal instead of a int literal
void dbus_message_iter_recurse(DBusMessageIter *iter, DBusMessageIter *sub)
Recurses into a container value when reading values from a message, initializing a sub-iterator to us...
DBUS_PRIVATE_EXPORT DBusMessage * _dbus_message_loader_pop_message(DBusMessageLoader *loader)
Pops a loaded message (passing ownership of the message to the caller).
dbus_bool_t dbus_message_set_interface(DBusMessage *message, const char *iface)
Sets the interface this message is being sent to (for DBUS_MESSAGE_TYPE_METHOD_CALL) or the interface...
dbus_bool_t dbus_message_iter_close_container(DBusMessageIter *iter, DBusMessageIter *sub)
Closes a container-typed value appended to the message; may write out more information to the message...
#define DBUS_TYPE_STRUCT
STRUCT and DICT_ENTRY are sort of special since their codes can&#39;t appear in a type string...
void _dbus_directory_close(DBusDirIter *iter)
Closes a directory iteration.
dbus_uint32_t padding
bytes of alignment in header
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_message_iter_get_args_valist(DBusMessageIter *iter, DBusError *error, int first_arg_type, va_list var_args)
Implementation of the varargs arg-getting functions.
Definition: dbus-message.c:819
#define DBUS_TYPE_STRING
Type code marking a UTF-8 encoded, nul-terminated Unicode string.
DBusString body
Body network data.
#define _dbus_assert(condition)
Aborts with an error message if the condition is false.
dbus_bool_t _dbus_directory_get_next_file(DBusDirIter *iter, DBusString *filename, DBusError *error)
Get next file in the directory.
#define DBUS_ERROR_INIT
Expands to a suitable initializer for a DBusError on the stack.
Definition: dbus-errors.h:62
const char * dbus_message_get_signature(DBusMessage *message)
Gets the type signature of the message, i.e.
void dbus_message_iter_init_append(DBusMessage *message, DBusMessageIter *iter)
Initializes a DBusMessageIter for appending arguments to the end of a message.
void dbus_error_free(DBusError *error)
Frees an error that&#39;s been set (or just initialized), then reinitializes the error as in dbus_error_i...
Definition: dbus-errors.c:211
#define DBUS_TYPE_BYTE
Type code marking an 8-bit unsigned integer.
Definition: dbus-protocol.h:66
dbus_bool_t _dbus_file_get_contents(DBusString *str, const DBusString *filename, DBusError *error)
Appends the contents of the given file to the string, returning error code.
DBUS_PRIVATE_EXPORT void _dbus_message_loader_unref(DBusMessageLoader *loader)
Decrements the reference count of the loader and finalizes the loader when the count reaches zero...
DBusString data
Header network data, stored separately from body so we can independently realloc it.
dbus_bool_t _dbus_concat_dir_and_file(DBusString *dir, const DBusString *next_component)
Appends the given filename to the given directory.
const char * dbus_message_get_path(DBusMessage *message)
Gets the object path this message is being sent to (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitt...
DBusDirIter * _dbus_directory_open(const DBusString *filename, DBusError *error)
Open a directory to iterate over.
dbus_bool_t _dbus_string_init(DBusString *str)
Initializes a string.
Definition: dbus-string.c:175
int _dbus_dup(int fd, DBusError *error)
Duplicates a file descriptor.
dbus_bool_t _dbus_string_copy(const DBusString *source, int start, DBusString *dest, int insert_at)
Like _dbus_string_move(), but does not delete the section of the source string that&#39;s copied to the d...
Definition: dbus-string.c:1283
DBusValidity
This is primarily used in unit testing, so we can verify that each invalid message is invalid for the...
DBusMessageIter struct; contains no public fields.
Definition: dbus-message.h:51
#define DBUS_TYPE_DOUBLE
Type code marking an 8-byte double in IEEE 754 format.
Definition: dbus-protocol.h:98
dbus_bool_t dbus_message_iter_init(DBusMessage *message, DBusMessageIter *iter)
Initializes a DBusMessageIter for reading the arguments of the message passed in. ...
dbus_bool_t _dbus_string_ends_with_c_str(const DBusString *a, const char *c_str)
Returns whether a string ends with the given suffix.
#define DBUS_TYPE_ARRAY
Type code marking a D-Bus array type.
#define DBUS_TYPE_INT64
Type code marking a 64-bit signed integer.
Definition: dbus-protocol.h:90
Internals of directory iterator.
const char * dbus_message_get_member(DBusMessage *message)
Gets the interface member being invoked (DBUS_MESSAGE_TYPE_METHOD_CALL) or emitted (DBUS_MESSAGE_TYPE...
Internals of DBusMessage.
#define DBUS_MINIMUM_HEADER_SIZE
The smallest header size that can occur.
dbus_uint32_t dbus_bool_t
A boolean, valid values are TRUE and FALSE.
Definition: dbus-types.h:35
void _dbus_string_init_const(DBusString *str, const char *value)
Initializes a constant string.
Definition: dbus-string.c:190
DBusHeader header
Header network data and associated cache.
dbus_bool_t dbus_message_set_sender(DBusMessage *message, const char *sender)
Sets the message sender.
DBusString data
Buffered data.
DBUS_PRIVATE_EXPORT DBusMessageLoader * _dbus_message_loader_ref(DBusMessageLoader *loader)
Increments the reference count of the loader.
dbus_bool_t dbus_message_get_path_decomposed(DBusMessage *message, char ***path)
Gets the object path this message is being sent to (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitt...
void _dbus_warn(const char *format,...)
Prints a warning message to stderr.
dbus_bool_t dbus_message_set_path(DBusMessage *message, const char *object_path)
Sets the object path this message is being sent to (for DBUS_MESSAGE_TYPE_METHOD_CALL) or the one a s...
#define DBUS_TYPE_INT32
Type code marking a 32-bit signed integer.
Definition: dbus-protocol.h:82
DBUS_PRIVATE_EXPORT DBusMessageLoader * _dbus_message_loader_new(void)
Creates a new message loader.
Object representing an exception.
Definition: dbus-errors.h:48
int dbus_message_iter_get_element_count(DBusMessageIter *iter)
Returns the number of elements in the array-typed value pointed to by the iterator.
dbus_bool_t dbus_message_append_args(DBusMessage *message, int first_arg_type,...)
Appends fields to a message given a variable argument list.
#define DBUS_TYPE_UINT64
Type code marking a 64-bit unsigned integer.
Definition: dbus-protocol.h:94
dbus_uint32_t dbus_message_get_reply_serial(DBusMessage *message)
Returns the serial that the message is a reply to or 0 if none.
dbus_bool_t dbus_message_has_signature(DBusMessage *message, const char *signature)
Checks whether the message has the given signature; see dbus_message_get_signature() for more details...
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_message_loader_get_is_corrupted(DBusMessageLoader *loader)
Checks whether the loader is confused due to bad data.
#define _DBUS_N_ELEMENTS(array)
Computes the number of elements in a fixed-size array using sizeof().
#define DBUS_TYPE_UINT32
Type code marking a 32-bit unsigned integer.
Definition: dbus-protocol.h:86
the data is valid
DBusMessage * dbus_message_new_method_call(const char *destination, const char *path, const char *iface, const char *method)
Constructs a new message to invoke a method on a remote object.
dbus_bool_t dbus_message_has_destination(DBusMessage *message, const char *name)
Checks whether the message was sent to the given name.
dbus_bool_t _dbus_string_append_byte(DBusString *str, unsigned char byte)
Appends a single byte to the string, returning FALSE if not enough memory.
Definition: dbus-string.c:1157
void _dbus_string_free(DBusString *str)
Frees a string created by _dbus_string_init().
Definition: dbus-string.c:259
#define TRUE
Expands to "1".
dbus_bool_t dbus_message_marshal(DBusMessage *msg, char **marshalled_data_p, int *len_p)
Turn a DBusMessage into the marshalled form as described in the D-Bus specification.
#define _dbus_assert_not_reached(explanation)
Aborts with an error message if called.
DBusMessage * dbus_message_copy(const DBusMessage *message)
Creates a new message that is an exact replica of the message specified, except that its refcount is ...
int dbus_message_iter_get_element_type(DBusMessageIter *iter)
Returns the element type of the array that the message iterator points to.
const char * name
public error name field
Definition: dbus-errors.h:50
DBusMessage * dbus_message_demarshal(const char *str, int len, DBusError *error)
Demarshal a D-Bus message from the format described in the D-Bus specification.
#define DBUS_TYPE_UNIX_FD
Type code marking a unix file descriptor.
const char * dbus_message_get_interface(DBusMessage *message)
Gets the interface this message is being sent to (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted...
#define DBUS_TYPE_INVALID
Type code that is never equal to a legitimate type code.
Definition: dbus-protocol.h:60
dbus_bool_t dbus_message_set_reply_serial(DBusMessage *message, dbus_uint32_t reply_serial)
Sets the reply serial of a message (the serial of the message this is a reply to).
dbus_bool_t dbus_message_has_sender(DBusMessage *message, const char *name)
Checks whether the message has the given unique name as its sender.
dbus_bool_t dbus_message_iter_next(DBusMessageIter *iter)
Moves the iterator to the next field, if any.
dbus_bool_t dbus_message_get_no_reply(DBusMessage *message)
Returns TRUE if the message does not expect a reply.
#define DBUS_TYPE_INT16
Type code marking a 16-bit signed integer.
Definition: dbus-protocol.h:74
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_message_loader_get_unix_fds(DBusMessageLoader *loader, int **fds, unsigned *max_n_fds)
Gets the buffer to use for reading unix fds from the network.
void dbus_free_string_array(char **str_array)
Frees a NULL-terminated array of strings.
Definition: dbus-memory.c:749
#define DBUS_TYPE_BOOLEAN
Type code marking a boolean.
Definition: dbus-protocol.h:70
DBUS_PRIVATE_EXPORT void _dbus_message_loader_get_buffer(DBusMessageLoader *loader, DBusString **buffer)
Gets the buffer to use for reading data from the network.
#define DBUS_STRUCT_END_CHAR_AS_STRING
DBUS_STRUCT_END_CHAR a string literal instead of a int literal
dbus_bool_t dbus_message_iter_open_container(DBusMessageIter *iter, int type, const char *contained_signature, DBusMessageIter *sub)
Appends a container-typed value to the message; you are required to append the contents of the contai...
A simple value union that lets you access bytes as if they were various types; useful when dealing wi...
Definition: dbus-types.h:137
#define DBUS_TYPE_STRING_AS_STRING
DBUS_TYPE_STRING as a string literal instead of a int literal
dbus_bool_t dbus_message_iter_append_basic(DBusMessageIter *iter, int type, const void *value)
Appends a basic-typed value to the message.
dbus_bool_t _dbus_close(int fd, DBusError *error)
Closes a file descriptor.
void dbus_shutdown(void)
Frees all memory allocated internally by libdbus and reverses the effects of dbus_threads_init().
Definition: dbus-memory.c:897
#define FALSE
Expands to "0".
int dbus_message_demarshal_bytes_needed(const char *buf, int len)
Returns the number of bytes required to be in the buffer to demarshal a D-Bus message.
void dbus_message_iter_abandon_container(DBusMessageIter *iter, DBusMessageIter *sub)
Abandons creation of a contained-typed value and frees resources created by dbus_message_iter_open_co...
DBUS_PRIVATE_EXPORT void _dbus_verbose_bytes_of_string(const DBusString *str, int start, int len)
Dump the given part of the string to verbose log.
DBUS_PRIVATE_EXPORT dbus_bool_t _dbus_message_loader_queue_messages(DBusMessageLoader *loader)
Converts buffered data into messages, if we have enough data.
char * _dbus_strdup(const char *str)
Duplicates a string.
DBusValidity corruption_reason
why we were corrupted
dbus_bool_t dbus_message_set_member(DBusMessage *message, const char *member)
Sets the interface member being invoked (DBUS_MESSAGE_TYPE_METHOD_CALL) or emitted (DBUS_MESSAGE_TYPE...
void dbus_message_unref(DBusMessage *message)
Decrements the reference count of a DBusMessage, freeing the message if the count reaches 0...
Implementation details of DBusMessageLoader.
dbus_bool_t dbus_error_is_set(const DBusError *error)
Checks whether an error occurred (the error is set).
Definition: dbus-errors.c:329
#define _DBUS_DOUBLES_BITWISE_EQUAL(a, b)
On x86 there is an 80-bit FPU, and if you do "a == b" it may have a or b in an 80-bit register...
Definition: dbus-sysdeps.h:608
void dbus_message_set_serial(DBusMessage *message, dbus_uint32_t serial)
Sets the serial number of a message.
Definition: dbus-message.c:277