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" 37 #include <sys/types.h> 48 #ifdef DBUS_ENABLE_EMBEDDED_TESTS 70 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
71 _dbus_return_val_if_error_is_set (error,
FALSE);
73 va_start (var_args, first_arg_type);
83 #ifdef DBUS_ENABLE_EMBEDDED_TESTS 84 #include "dbus-test.h" 85 #include "dbus-message-factory.h" 89 static int validities_seen[DBUS_VALIDITY_LAST + _DBUS_NEGATIVE_VALIDITY_COUNT];
92 reset_validities_seen (
void)
98 validities_seen[i] = 0;
106 validities_seen[validity + _DBUS_NEGATIVE_VALIDITY_COUNT] += 1;
116 if ((i - _DBUS_NEGATIVE_VALIDITY_COUNT) == DBUS_VALIDITY_UNKNOWN ||
117 (i - _DBUS_NEGATIVE_VALIDITY_COUNT) == DBUS_INVALID_FOR_UNKNOWN_REASON)
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,
129 check_memleaks (
void)
133 if (_dbus_get_malloc_blocks_outstanding () != 0)
135 _dbus_warn (
"%d dbus_malloc blocks were not freed in %s",
136 _dbus_get_malloc_blocks_outstanding (), __FILE__);
142 struct DBusInitialFDs {
148 _dbus_check_fdleaks_enter (
void)
155 fds = malloc (
sizeof (DBusInitialFDs));
160 if ((d = opendir (
"/proc/self/fd")))
164 while ((de = readdir(d)))
170 if (de->d_name[0] ==
'.')
174 l = strtol (de->d_name, &e, 10);
185 if (fd >= FD_SETSIZE)
187 _dbus_verbose (
"FD %d unexpectedly large; cannot track whether " 188 "it is leaked\n", fd);
192 FD_SET (fd, &fds->set);
205 _dbus_check_fdleaks_leave (DBusInitialFDs *fds)
212 if ((d = opendir (
"/proc/self/fd")))
216 while ((de = readdir(d)))
222 if (de->d_name[0] ==
'.')
226 l = strtol (de->d_name, &e, 10);
237 if (fd >= FD_SETSIZE)
239 _dbus_verbose (
"FD %d unexpectedly large; cannot track whether " 240 "it is leaked\n", fd);
244 if (FD_ISSET (fd, &fds->set))
247 _dbus_warn (
"file descriptor %i leaked in %s.", fd, __FILE__);
271 _dbus_warn (
"loader corrupted on message that was expected to be valid; invalid reason %d",
279 _dbus_warn (
"didn't load message that was expected to be valid (message not popped)");
283 if (_dbus_string_get_length (&loader->
data) > 0)
285 _dbus_warn (
"had leftover bytes from expected-to-be-valid single message");
295 if (!check_message_handling (message))
320 _dbus_warn (
"loader not corrupted on message that was expected to be invalid");
326 if (expected_validity != DBUS_INVALID_FOR_UNKNOWN_REASON &&
329 _dbus_warn (
"expected message to be corrupted for reason %d and was corrupted for %d instead",
351 _dbus_warn (
"loader corrupted on message that was expected to be valid (but incomplete), corruption reason %d",
359 _dbus_warn (
"loaded message that was expected to be incomplete");
363 record_validity_seen (DBUS_VALID_BUT_INCOMPLETE);
380 return check_have_valid_message (loader);
381 else if (expected_validity == DBUS_VALID_BUT_INCOMPLETE)
382 return check_incomplete_message (loader);
383 else if (expected_validity == DBUS_VALIDITY_UNKNOWN)
395 return check_invalid_message (loader, expected_validity);
406 dbus_internal_do_not_use_load_message_file (
const DBusString *filename,
414 _dbus_verbose (
"Loading raw %s\n", _dbus_string_get_const_data (filename));
417 _dbus_warn (
"Could not load message file %s: %s",
418 _dbus_string_get_const_data (filename),
440 dbus_internal_do_not_use_try_message_file (
const DBusString *filename,
451 if (!dbus_internal_do_not_use_load_message_file (filename, &data))
454 retval = dbus_internal_do_not_use_try_message_data (&data, expected_validity);
460 if (_dbus_string_get_length (&data) > 0)
462 _dbus_string_get_length (&data));
464 _dbus_warn (
"Failed message loader test on %s",
465 _dbus_string_get_const_data (filename));
482 dbus_internal_do_not_use_try_message_data (
const DBusString *data,
503 len = _dbus_string_get_length (data);
504 for (i = 0; i < len; i++)
510 _dbus_string_get_byte (data, i)))
515 if (!check_loader_results (loader, expected_validity))
532 _dbus_string_get_length (buffer)))
537 if (!check_loader_results (loader, expected_validity))
549 len = _dbus_string_get_length (data);
550 for (i = 0; i < len; i += 2)
556 _dbus_string_get_byte (data, i)))
562 _dbus_string_get_byte (data, i+1)))
569 if (!check_loader_results (loader, expected_validity))
586 process_test_subdir (
const DBusString *test_base_dir,
589 DBusForeachMessageFileFunc
function,
621 _dbus_string_get_const_data (&test_directory),
627 printf (
"Testing %s:\n", subdir);
649 printf (
"SKIP: Could not load %s, message builder language no longer supported\n",
650 _dbus_string_get_const_data (&filename));
653 _dbus_verbose (
"Skipping non-.message file %s\n",
654 _dbus_string_get_const_data (&filename));
660 _dbus_string_get_const_data (&filename));
662 if (! (*
function) (&full_path,
663 expected_validity, user_data))
674 _dbus_warn (
"Could not get next file in %s: %s",
675 _dbus_string_get_const_data (&test_directory),
703 dbus_internal_do_not_use_foreach_message_file (
const char *test_data_dir,
704 DBusForeachMessageFileFunc func,
714 if (!process_test_subdir (&test_directory,
"valid-messages",
720 if (!process_test_subdir (&test_directory,
"invalid-messages",
721 DBUS_INVALID_FOR_UNKNOWN_REASON, func, user_data))
726 if (!process_test_subdir (&test_directory,
"incomplete-messages",
727 DBUS_VALID_BUT_INCOMPLETE, func, user_data))
742 #define GET_AND_CHECK(iter, typename, literal) \ 744 if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_##typename) \ 745 _dbus_assert_not_reached ("got wrong argument type from message iter"); \ 746 dbus_message_iter_get_basic (&iter, &v_##typename); \ 747 if (v_##typename != literal) \ 748 _dbus_assert_not_reached ("got wrong value from message iter"); \ 751 #define GET_AND_CHECK_STRCMP(iter, typename, literal) \ 753 if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_##typename) \ 754 _dbus_assert_not_reached ("got wrong argument type from message iter"); \ 755 dbus_message_iter_get_basic (&iter, &v_##typename); \ 756 if (strcmp (v_##typename, literal) != 0) \ 757 _dbus_assert_not_reached ("got wrong value from message iter"); \ 760 #define GET_AND_CHECK_AND_NEXT(iter, typename, literal) \ 762 GET_AND_CHECK(iter, typename, literal); \ 763 if (!dbus_message_iter_next (&iter)) \ 764 _dbus_assert_not_reached ("failed to move iter to next"); \ 767 #define GET_AND_CHECK_STRCMP_AND_NEXT(iter, typename, literal) \ 769 GET_AND_CHECK_STRCMP(iter, typename, literal); \ 770 if (!dbus_message_iter_next (&iter)) \ 771 _dbus_assert_not_reached ("failed to move iter to next"); \ 778 const char *v_STRING;
780 dbus_int16_t v_INT16;
781 dbus_uint16_t v_UINT16;
782 dbus_int32_t v_INT32;
783 dbus_uint32_t v_UINT32;
784 dbus_int64_t v_INT64;
785 dbus_uint64_t v_UINT64;
786 unsigned char v_BYTE;
789 const dbus_int32_t *our_int_array;
794 GET_AND_CHECK_STRCMP_AND_NEXT (iter, STRING,
"Test string");
795 GET_AND_CHECK_AND_NEXT (iter, INT32, -0x12345678);
796 GET_AND_CHECK_AND_NEXT (iter, UINT32, 0xedd1e);
797 GET_AND_CHECK_AND_NEXT (iter, DOUBLE, 3.14159);
807 GET_AND_CHECK_AND_NEXT (array, DOUBLE, 1.5);
808 GET_AND_CHECK (array, DOUBLE, 2.5);
816 GET_AND_CHECK_AND_NEXT (iter, BYTE, 0xF0);
833 GET_AND_CHECK (iter, BYTE, 0xF0);
845 dbus_int16_t our_int16;
846 dbus_uint16_t our_uint16;
847 dbus_int32_t our_int;
848 dbus_uint32_t our_uint;
853 unsigned char our_byte_1, our_byte_2;
854 const dbus_uint32_t *our_uint32_array = (
void*)0xdeadbeef;
855 int our_uint32_array_len;
856 dbus_int32_t *our_int32_array = (
void*)0xdeadbeef;
857 int our_int32_array_len;
858 dbus_int64_t our_int64;
859 dbus_uint64_t our_uint64;
860 dbus_int64_t *our_uint64_array = (
void*)0xdeadbeef;
861 int our_uint64_array_len;
862 const dbus_int64_t *our_int64_array = (
void*)0xdeadbeef;
863 int our_int64_array_len;
864 const double *our_double_array = (
void*)0xdeadbeef;
865 int our_double_array_len;
866 const unsigned char *our_byte_array = (
void*)0xdeadbeef;
867 int our_byte_array_len;
868 const dbus_bool_t *our_boolean_array = (
void*)0xdeadbeef;
869 int our_boolean_array_len;
870 char **our_string_array;
871 int our_string_array_len;
875 if (!dbus_message_iter_get_args (&iter, &error,
888 &our_uint32_array, &our_uint32_array_len,
890 &our_int32_array, &our_int32_array_len,
892 &our_uint64_array, &our_uint64_array_len,
894 &our_int64_array, &our_int64_array_len,
896 &our_double_array, &our_double_array_len,
898 &our_byte_array, &our_byte_array_len,
900 &our_boolean_array, &our_boolean_array_len,
902 &our_string_array, &our_string_array_len,
910 if (our_int16 != -0x123)
913 if (our_uint16 != 0x123)
916 if (our_int != -0x12345678)
919 if (our_uint != 0x12300042)
922 if (our_int64 != DBUS_INT64_CONSTANT (-0x123456789abcd))
924 if (our_uint64 != DBUS_UINT64_CONSTANT (0x123456789abcd))
931 if (strcmp (our_str,
"Test string") != 0)
937 if (our_byte_1 != 42)
940 if (our_byte_2 != 24)
943 if (our_uint32_array_len != 4 ||
944 our_uint32_array[0] != 0x12345678 ||
945 our_uint32_array[1] != 0x23456781 ||
946 our_uint32_array[2] != 0x34567812 ||
947 our_uint32_array[3] != 0x45678123)
950 if (our_int32_array_len != 4 ||
951 our_int32_array[0] != 0x12345678 ||
952 our_int32_array[1] != -0x23456781 ||
953 our_int32_array[2] != 0x34567812 ||
954 our_int32_array[3] != -0x45678123)
957 if (our_uint64_array_len != 4 ||
958 our_uint64_array[0] != 0x12345678 ||
959 our_uint64_array[1] != 0x23456781 ||
960 our_uint64_array[2] != 0x34567812 ||
961 our_uint64_array[3] != 0x45678123)
964 if (our_int64_array_len != 4 ||
965 our_int64_array[0] != 0x12345678 ||
966 our_int64_array[1] != -0x23456781 ||
967 our_int64_array[2] != 0x34567812 ||
968 our_int64_array[3] != -0x45678123)
971 if (our_double_array_len != 3)
980 v_DOUBLE = 9876.54321;
987 if (our_byte_array_len != 4)
990 if (our_byte_array[0] !=
'a' ||
991 our_byte_array[1] !=
'b' ||
992 our_byte_array[2] !=
'c' ||
993 our_byte_array[3] != 234)
996 if (our_boolean_array_len != 5)
999 if (our_boolean_array[0] !=
TRUE ||
1000 our_boolean_array[1] !=
FALSE ||
1001 our_boolean_array[2] !=
TRUE ||
1002 our_boolean_array[3] !=
TRUE ||
1003 our_boolean_array[4] !=
FALSE)
1006 if (our_string_array_len != 4)
1009 if (strcmp (our_string_array[0],
"Foo") != 0 ||
1010 strcmp (our_string_array[1],
"bar") != 0 ||
1011 strcmp (our_string_array[2],
"") != 0 ||
1012 strcmp (our_string_array[3],
"woo woo woo woo") != 0)
1022 verify_test_message_args_ignored (
DBusMessage *message)
1026 dbus_uint32_t our_uint;
1027 DBusInitialFDs *initial_fds;
1029 initial_fds = _dbus_check_fdleaks_enter ();
1033 if (!dbus_message_iter_get_args (&iter, &error,
1042 _dbus_verbose (
"arguments ignored.\n");
1047 if (!dbus_message_iter_get_args (&iter, &error,
1057 _dbus_verbose (
"arguments ignored.\n");
1060 _dbus_check_fdleaks_leave (initial_fds);
1064 verify_test_message_memleak (
DBusMessage *message)
1068 dbus_uint32_t our_uint1;
1069 dbus_uint32_t our_uint2;
1070 dbus_uint32_t our_uint3;
1071 char **our_string_array1;
1072 int our_string_array_len1;
1073 char **our_string_array2;
1074 int our_string_array_len2;
1075 #ifdef HAVE_UNIX_FD_PASSING 1079 DBusInitialFDs *initial_fds;
1081 initial_fds = _dbus_check_fdleaks_enter ();
1086 if (!dbus_message_iter_get_args (&iter, &error,
1089 &our_string_array1, &our_string_array_len1,
1090 #ifdef HAVE_UNIX_FD_PASSING
1094 DBUS_TYPE_UINT32, &our_uint3,
1097 _dbus_verbose (
"expected error: %s - %s\n", error.
name,
1101 #ifdef HAVE_UNIX_FD_PASSING 1107 _dbus_warn (
"error: parse with wrong signature: 'uashuu'.");
1113 if (!dbus_message_iter_get_args (&iter, &error,
1114 DBUS_TYPE_UINT32, &our_uint1,
1116 &our_string_array1, &our_string_array_len1,
1117 #ifdef HAVE_UNIX_FD_PASSING
1118 DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1120 DBUS_TYPE_UINT32, &our_uint2,
1122 &our_string_array2, &our_string_array_len2,
1123 #ifdef HAVE_UNIX_FD_PASSING
1124 DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1126 DBUS_TYPE_UINT32, &our_uint3,
1129 _dbus_verbose (
"expected error: %s - %s\n", error.
name,
1134 #ifdef HAVE_UNIX_FD_PASSING 1141 _dbus_warn (
"error: parse with wrong signature: 'uashuashu'.");
1147 if (!dbus_message_iter_get_args (&iter, &error,
1148 DBUS_TYPE_UINT32, &our_uint1,
1150 &our_string_array1, &our_string_array_len1,
1151 #ifdef HAVE_UNIX_FD_PASSING
1152 DBUS_TYPE_UNIX_FD, &our_unix_fd1,
1154 DBUS_TYPE_UINT32, &our_uint2,
1156 &our_string_array2, &our_string_array_len2,
1157 #ifdef HAVE_UNIX_FD_PASSING
1158 DBUS_TYPE_UNIX_FD, &our_unix_fd2,
1170 #ifdef HAVE_UNIX_FD_PASSING 1175 _dbus_check_fdleaks_leave (initial_fds);
1185 _dbus_message_test (
const char *test_data_dir)
1194 const dbus_uint32_t our_uint32_array[] =
1195 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1196 const dbus_int32_t our_int32_array[] =
1197 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1198 const dbus_uint32_t *v_ARRAY_UINT32 = our_uint32_array;
1199 const dbus_int32_t *v_ARRAY_INT32 = our_int32_array;
1200 const dbus_uint64_t our_uint64_array[] =
1201 { 0x12345678, 0x23456781, 0x34567812, 0x45678123 };
1202 const dbus_int64_t our_int64_array[] =
1203 { 0x12345678, -0x23456781, 0x34567812, -0x45678123 };
1204 const dbus_uint64_t *v_ARRAY_UINT64 = our_uint64_array;
1205 const dbus_int64_t *v_ARRAY_INT64 = our_int64_array;
1206 const char *our_string_array[] = {
"Foo",
"bar",
"",
"woo woo woo woo" };
1207 const char *our_string_array1[] = {
"foo",
"Bar",
"",
"Woo woo Woo woo" };
1208 const char **v_ARRAY_STRING = our_string_array;
1209 const char **v1_ARRAY_STRING = our_string_array1;
1210 const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };
1211 const double *v_ARRAY_DOUBLE = our_double_array;
1212 const unsigned char our_byte_array[] = {
'a',
'b',
'c', 234 };
1213 const unsigned char *v_ARRAY_BYTE = our_byte_array;
1215 const dbus_bool_t *v_ARRAY_BOOLEAN = our_boolean_array;
1218 const char *v_STRING;
1220 dbus_int16_t v_INT16;
1221 dbus_uint16_t v_UINT16;
1222 dbus_int32_t v_INT32;
1223 dbus_uint32_t v_UINT32;
1224 dbus_uint32_t v1_UINT32;
1225 dbus_int64_t v_INT64;
1226 dbus_uint64_t v_UINT64;
1227 unsigned char v_BYTE;
1228 unsigned char v2_BYTE;
1231 #ifdef HAVE_UNIX_FD_PASSING 1236 DBusInitialFDs *initial_fds;
1249 initial_fds = _dbus_check_fdleaks_enter ();
1252 "/org/freedesktop/TestPath",
1253 "Foo.TestInterface",
1259 "/org/freedesktop/TestPath") == 0);
1270 _dbus_string_get_length (&message->
header.
data));
1272 _dbus_string_get_length (&message->
body));
1279 _dbus_string_get_length (&message->
header.
data));
1281 _dbus_string_get_length (&message->
body));
1321 "org.Foo.Bar") == 0);
1377 "/org/freedesktop/TestPath",
1378 "Foo.TestInterface",
1385 v_INT32 = -0x12345678;
1386 v_UINT32 = 0x12300042;
1387 v_INT64 = DBUS_INT64_CONSTANT (-0x123456789abcd);
1388 v_UINT64 = DBUS_UINT64_CONSTANT (0x123456789abcd);
1389 v_STRING =
"Test string";
1394 #ifdef HAVE_UNIX_FD_PASSING 1403 DBUS_TYPE_UINT32, &v_UINT32,
1461 #ifdef HAVE_UNIX_FD_PASSING 1463 DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1471 _dbus_verbose (
"HEADER\n");
1473 _dbus_string_get_length (&message->
header.
data));
1474 _dbus_verbose (
"BODY\n");
1476 _dbus_string_get_length (&message->
body));
1478 _dbus_verbose (
"Signature expected \"%s\" actual \"%s\"\n",
1486 verify_test_message (message);
1495 _dbus_string_get_length (©->
header.
data));
1498 _dbus_string_get_length (©->
body));
1500 verify_test_message (copy);
1523 data = _dbus_string_get_const_data (&message->
header.
data);
1524 for (i = 0; i < _dbus_string_get_length (&message->
header.
data); i++)
1534 data = _dbus_string_get_const_data (&message->
body);
1535 for (i = 0; i < _dbus_string_get_length (&message->
body); i++)
1544 #ifdef HAVE_UNIX_FD_PASSING 1547 unsigned n_unix_fds;
1549 _dbus_message_loader_get_unix_fds(loader, &unix_fds, &n_unix_fds);
1554 _dbus_message_loader_return_unix_fds(loader, unix_fds, 1);
1581 verify_test_message (message_without_unix_fds);
1588 char *marshalled =
NULL;
1603 verify_test_message (message2);
1635 _dbus_check_fdleaks_leave (initial_fds);
1636 initial_fds = _dbus_check_fdleaks_enter ();
1639 for (i = strlen (basic_types) - 1; i > 0; i--)
1645 signature[0] = basic_types[i];
1646 s =
"SomeThingToSay";
1647 memset (&val,
'\0',
sizeof (val));
1650 "/de/ende/test",
"de.ende.Test",
"ArtistName");
1654 signature, &array_iter);
1655 for (some = 0; some < 3; some++)
1670 "/de/ende/test",
"de.ende.Test",
"ArtistName");
1678 NULL, &struct_iter);
1690 "/org/freedesktop/TestPath",
1691 "Foo.TestInterface",
1704 NULL, &struct_iter);
1719 "/org/freedesktop/TestPath",
1720 "Foo.TestInterface",
1725 DBUS_TYPE_UINT32, &v_UINT32,
1728 #ifdef HAVE_UNIX_FD_PASSING
1729 DBUS_TYPE_UNIX_FD, &v_UNIX_FD,
1731 DBUS_TYPE_UINT32, &v1_UINT32,
1734 #ifdef HAVE_UNIX_FD_PASSING
1735 DBUS_TYPE_UNIX_FD, &v1_UNIX_FD,
1744 #ifdef HAVE_UNIX_FD_PASSING 1750 #ifdef HAVE_UNIX_FD_PASSING 1757 verify_test_message_args_ignored (message);
1758 verify_test_message_memleak (message);
1764 DBusMessageDataIter diter;
1765 DBusMessageData mdata;
1768 reset_validities_seen ();
1771 _dbus_message_data_iter_init (&diter);
1773 while (_dbus_message_data_iter_get_and_next (&diter,
1776 if (!dbus_internal_do_not_use_try_message_data (&mdata.data,
1777 mdata.expected_validity))
1779 _dbus_warn (
"expected validity %d and did not get it",
1780 mdata.expected_validity);
1784 _dbus_message_data_free (&mdata);
1789 printf (
"%d sample messages tested\n", count);
1791 print_validities_seen (FALSE);
1792 print_validities_seen (
TRUE);
1796 _dbus_check_fdleaks_leave (initial_fds);
1799 if (test_data_dir ==
NULL)
1802 initial_fds = _dbus_check_fdleaks_enter ();
1804 if (!dbus_internal_do_not_use_foreach_message_file (test_data_dir,
1805 (DBusForeachMessageFileFunc)
1806 dbus_internal_do_not_use_try_message_file,
1810 _dbus_check_fdleaks_leave (initial_fds);
#define DBUS_TYPE_UINT16
Type code marking a 16-bit unsigned integer.
void dbus_message_lock(DBusMessage *message)
Locks a message.
const char * message
public error message field
#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().
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't appear in a type string...
void _dbus_directory_close(DBusDirIter *iter)
Closes a directory iteration.
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.
#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.
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's been set (or just initialized), then reinitializes the error as in dbus_error_i...
#define DBUS_TYPE_BYTE
Type code marking an 8-bit unsigned integer.
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...
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.
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's copied to the d...
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.
#define DBUS_TYPE_DOUBLE
Type code marking an 8-byte double in IEEE 754 format.
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.
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.
void _dbus_string_init_const(DBusString *str, const char *value)
Initializes a constant string.
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.
DBUS_PRIVATE_EXPORT DBusMessageLoader * _dbus_message_loader_new(void)
Creates a new message loader.
Object representing an exception.
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.
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.
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.
void _dbus_string_free(DBusString *str)
Frees a string created by _dbus_string_init().
#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
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.
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.
void dbus_free_string_array(char **str_array)
Frees a NULL-terminated array of strings.
#define DBUS_TYPE_BOOLEAN
Type code marking a boolean.
#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...
#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().
#define FALSE
Expands to "0".
DBUS_PRIVATE_EXPORT void _dbus_message_loader_get_buffer(DBusMessageLoader *loader, DBusString **buffer, int *max_to_read, dbus_bool_t *may_read_unix_fds)
Gets the buffer to use for reading data from the network.
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).
#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...
void dbus_message_set_serial(DBusMessage *message, dbus_uint32_t serial)
Sets the serial number of a message.