26 #include "dbus-internals.h"
27 #include "dbus-marshal-recursive.h"
28 #include "dbus-marshal-validate.h"
29 #include "dbus-marshal-byteswap.h"
30 #include "dbus-marshal-header.h"
31 #include "dbus-signature.h"
32 #include "dbus-message-private.h"
33 #include "dbus-object-tree.h"
34 #include "dbus-memory.h"
35 #include "dbus-list.h"
36 #include "dbus-threads-internal.h"
37 #ifdef HAVE_UNIX_FD_PASSING
38 #include "dbus-sysdeps.h"
39 #include "dbus-sysdeps-unix.h"
44 #define _DBUS_TYPE_IS_STRINGLIKE(type) \
45 (type == DBUS_TYPE_STRING || type == DBUS_TYPE_SIGNATURE || \
46 type == DBUS_TYPE_OBJECT_PATH)
48 static void dbus_message_finalize (
DBusMessage *message);
60 #ifdef DBUS_BUILD_TESTS
62 _dbus_enable_message_cache (
void)
64 static int enabled = -1;
79 _dbus_warn (
"DBUS_MESSAGE_CACHE should be 0 or 1 if set, not '%s'",
88 # define _dbus_enable_message_cache() (TRUE)
91 #ifndef _dbus_message_trace_ref
98 static int enabled = -1;
100 _dbus_trace_ref (
"DBusMessage", message, old_refcount, new_refcount, why,
101 "DBUS_MESSAGE_TRACE", &enabled);
114 DBUS_MESSAGE_ITER_TYPE_READER = 3,
115 DBUS_MESSAGE_ITER_TYPE_WRITER = 7
153 *type_str_p = &_dbus_empty_signature_str;
172 if (byte_order == DBUS_COMPILER_BYTE_ORDER)
175 _dbus_verbose (
"Swapping message into compiler byte order\n");
177 get_const_signature (&message->
header, &type_str, &type_pos);
181 DBUS_COMPILER_BYTE_ORDER,
186 DBUS_COMPILER_BYTE_ORDER);
195 #define ensure_byte_order(message) _dbus_message_byteswap (message)
215 *body = &message->
body;
233 #ifdef HAVE_UNIX_FD_PASSING
234 *fds = message->unix_fds;
235 *n_fds = message->n_unix_fds;
255 dbus_uint32_t serial)
257 _dbus_return_if_fail (message !=
NULL);
258 _dbus_return_if_fail (!message->
locked);
292 _dbus_string_get_length (&message->
header.
data) +
293 _dbus_string_get_length (&message->
body);
295 #ifdef HAVE_UNIX_FD_PASSING
296 message->unix_fd_counter_delta = message->n_unix_fds;
300 _dbus_verbose (
"message has size %ld\n",
309 #ifdef HAVE_UNIX_FD_PASSING
365 #ifdef HAVE_UNIX_FD_PASSING
389 _dbus_string_get_length (&message->
body));
441 const char *signature)
443 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
444 _dbus_return_val_if_fail (!message->
locked,
FALSE);
445 _dbus_return_val_if_fail (signature ==
NULL ||
446 _dbus_check_is_valid_signature (signature));
448 _dbus_return_val_if_fail (_dbus_string_get_length (&message->
body) == 0 ||
451 return set_or_delete_string_field (message,
505 #define MAX_MESSAGE_SIZE_TO_CACHE 10 * _DBUS_ONE_KILOBYTE
508 #define MAX_MESSAGE_CACHE_SIZE 5
512 static int message_cache_count = 0;
516 dbus_message_cache_shutdown (
void *data)
525 if (message_cache[i])
526 dbus_message_finalize (message_cache[i]);
531 message_cache_count = 0;
532 message_cache_shutdown_registered =
FALSE;
545 dbus_message_get_cached (
void)
556 if (message_cache_count == 0)
571 if (message_cache[i])
573 message = message_cache[i];
574 message_cache[i] =
NULL;
575 message_cache_count -= 1;
593 #ifdef HAVE_UNIX_FD_PASSING
595 close_unix_fds(
int *fds,
unsigned *n_fds)
605 for (i = 0; i < *n_fds; i++)
621 free_counter (
void *element,
628 #ifdef HAVE_UNIX_FD_PASSING
642 dbus_message_cache_or_finalize (
DBusMessage *message)
655 free_counter, message);
658 #ifdef HAVE_UNIX_FD_PASSING
659 close_unix_fds(message->unix_fds, &message->n_unix_fds);
666 if (!message_cache_shutdown_registered)
676 message_cache[i] =
NULL;
680 message_cache_shutdown_registered =
TRUE;
685 if (!_dbus_enable_message_cache ())
688 if ((_dbus_string_get_length (&message->
header.
data) +
689 _dbus_string_get_length (&message->
body)) >
698 while (message_cache[i] !=
NULL)
704 message_cache[i] = message;
705 message_cache_count += 1;
707 #ifndef DBUS_DISABLE_CHECKS
717 dbus_message_finalize (message);
720 #ifndef DBUS_DISABLE_CHECKS
734 if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER)
744 else if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER)
762 _dbus_warn_check_failed (
"dbus message iterator invalid because the message has been modified (or perhaps the iterator is just uninitialized)\n");
791 int spec_type, msg_type, i;
798 spec_type = first_arg_type;
805 if (msg_type != spec_type)
808 "Argument %d is specified to be of type \"%s\", but "
809 "is actually of type \"%s\"\n", i,
818 #ifdef HAVE_UNIX_FD_PASSING
822 pfd = va_arg (var_args,
int*);
830 "Message refers to file descriptor at index %i,"
831 "but has only %i descriptors attached.\n",
843 "Platform does not support file desciptor passing.\n");
861 int spec_element_type;
866 spec_element_type = va_arg (var_args,
int);
869 if (spec_element_type != element_type)
872 "Argument %d is specified to be an array of \"%s\", but "
873 "is actually an array of \"%s\"\n",
885 n_elements_p = va_arg (var_args,
int*);
893 (
void *) ptr, n_elements_p);
895 else if (_DBUS_TYPE_IS_STRINGLIKE (spec_element_type))
901 str_array_p = va_arg (var_args,
char***);
902 n_elements_p = va_arg (var_args,
int*);
917 str_array =
dbus_new0 (
char*, n_elements + 1);
918 if (str_array ==
NULL)
920 _DBUS_SET_OOM (error);
928 while (i < n_elements)
935 if (str_array[i] ==
NULL)
938 _DBUS_SET_OOM (error);
952 *str_array_p = str_array;
953 *n_elements_p = n_elements;
955 #ifndef DBUS_DISABLE_CHECKS
958 _dbus_warn (
"you can't read arrays of container types (struct, variant, array) with %s for now\n",
959 _DBUS_FUNCTION_NAME);
964 #ifndef DBUS_DISABLE_CHECKS
967 _dbus_warn (
"you can only read arrays and basic types with %s for now\n",
968 _DBUS_FUNCTION_NAME);
973 spec_type = va_arg (var_args,
int);
977 "Message has only %d arguments, but more were expected", i);
1052 _dbus_return_val_if_fail (message !=
NULL, 0);
1067 dbus_uint32_t reply_serial)
1069 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1070 _dbus_return_val_if_fail (!message->
locked,
FALSE);
1071 _dbus_return_val_if_fail (reply_serial != 0,
FALSE);
1088 dbus_uint32_t v_UINT32;
1090 _dbus_return_val_if_fail (message !=
NULL, 0);
1110 free_counter, message);
1116 #ifdef HAVE_UNIX_FD_PASSING
1117 close_unix_fds(message->unix_fds, &message->n_unix_fds);
1127 dbus_message_new_empty_header (
void)
1132 message = dbus_message_get_cached ();
1134 if (message !=
NULL)
1142 if (message ==
NULL)
1144 #ifndef DBUS_DISABLE_CHECKS
1148 #ifdef HAVE_UNIX_FD_PASSING
1149 message->unix_fds =
NULL;
1150 message->n_unix_fds_allocated = 0;
1156 _dbus_message_trace_ref (message, 0, 1,
"new_empty_header");
1159 #ifndef DBUS_DISABLE_CHECKS
1166 #ifdef HAVE_UNIX_FD_PASSING
1167 message->n_unix_fds = 0;
1168 message->n_unix_fds_allocated = 0;
1169 message->unix_fd_counter_delta = 0;
1218 message = dbus_message_new_empty_header ();
1219 if (message ==
NULL)
1223 DBUS_COMPILER_BYTE_ORDER,
1258 const char *interface,
1263 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1264 _dbus_return_val_if_fail (method !=
NULL,
NULL);
1265 _dbus_return_val_if_fail (destination ==
NULL ||
1266 _dbus_check_is_valid_bus_name (destination),
NULL);
1267 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1268 _dbus_return_val_if_fail (interface ==
NULL ||
1269 _dbus_check_is_valid_interface (interface),
NULL);
1270 _dbus_return_val_if_fail (_dbus_check_is_valid_member (method),
NULL);
1272 message = dbus_message_new_empty_header ();
1273 if (message ==
NULL)
1277 DBUS_COMPILER_BYTE_ORDER,
1279 destination, path, interface, method,
NULL))
1301 _dbus_return_val_if_fail (method_call !=
NULL,
NULL);
1307 message = dbus_message_new_empty_header ();
1308 if (message ==
NULL)
1312 DBUS_COMPILER_BYTE_ORDER,
1348 const char *interface,
1353 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1354 _dbus_return_val_if_fail (interface !=
NULL,
NULL);
1355 _dbus_return_val_if_fail (name !=
NULL,
NULL);
1356 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1357 _dbus_return_val_if_fail (_dbus_check_is_valid_interface (interface),
NULL);
1358 _dbus_return_val_if_fail (_dbus_check_is_valid_member (name),
NULL);
1360 message = dbus_message_new_empty_header ();
1361 if (message ==
NULL)
1365 DBUS_COMPILER_BYTE_ORDER,
1367 NULL, path, interface, name,
NULL))
1394 const char *error_name,
1395 const char *error_message)
1401 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1402 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1403 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1411 message = dbus_message_new_empty_header ();
1412 if (message ==
NULL)
1416 DBUS_COMPILER_BYTE_ORDER,
1433 if (error_message !=
NULL)
1466 const char *error_name,
1467 const char *error_format,
1474 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1475 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1476 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1481 va_start (args, error_format);
1485 _dbus_string_get_const_data (&str));
1514 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1523 #ifndef DBUS_DISABLE_CHECKS
1534 _dbus_string_get_length (&message->
body)))
1545 #ifdef HAVE_UNIX_FD_PASSING
1546 retval->unix_fds =
dbus_new(
int, message->n_unix_fds);
1547 if (retval->unix_fds ==
NULL && message->n_unix_fds > 0)
1550 retval->n_unix_fds_allocated = message->n_unix_fds;
1552 for (retval->n_unix_fds = 0;
1553 retval->n_unix_fds < message->n_unix_fds;
1554 retval->n_unix_fds++)
1556 retval->unix_fds[retval->n_unix_fds] =
_dbus_dup(message->unix_fds[retval->n_unix_fds],
NULL);
1558 if (retval->unix_fds[retval->n_unix_fds] < 0)
1564 _dbus_message_trace_ref (retval, 0, 1,
"copy");
1571 #ifdef HAVE_UNIX_FD_PASSING
1572 close_unix_fds(retval->unix_fds, &retval->n_unix_fds);
1592 dbus_int32_t old_refcount;
1594 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1600 _dbus_message_trace_ref (message, old_refcount, old_refcount + 1,
"ref");
1615 dbus_int32_t old_refcount;
1617 _dbus_return_if_fail (message !=
NULL);
1619 _dbus_return_if_fail (!message->
in_cache);
1625 _dbus_message_trace_ref (message, old_refcount, old_refcount - 1,
"unref");
1627 if (old_refcount == 1)
1630 dbus_message_cache_or_finalize (message);
1722 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1724 va_start (var_args, first_arg_type);
1754 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1756 type = first_arg_type;
1778 element_type = va_arg (var_args,
int);
1780 buf[0] = element_type;
1795 n_elements = va_arg (var_args,
int);
1805 else if (_DBUS_TYPE_IS_STRINGLIKE (element_type))
1807 const char ***value_p;
1812 value_p = va_arg (var_args,
const char***);
1813 n_elements = va_arg (var_args,
int);
1818 while (i < n_elements)
1831 _dbus_warn (
"arrays of %s can't be appended with %s for now\n",
1833 _DBUS_FUNCTION_NAME);
1840 #ifndef DBUS_DISABLE_CHECKS
1843 _dbus_warn (
"type %s isn't supported yet in %s\n",
1849 type = va_arg (var_args,
int);
1911 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1912 _dbus_return_val_if_error_is_set (error,
FALSE);
1914 va_start (var_args, first_arg_type);
1939 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1940 _dbus_return_val_if_error_is_set (error,
FALSE);
1947 _dbus_message_iter_init_common (
DBusMessage *message,
1994 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1995 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
1997 get_const_signature (&message->
header, &type_str, &type_pos);
1999 _dbus_message_iter_init_common (message, real,
2000 DBUS_MESSAGE_ITER_TYPE_READER);
2022 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2023 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2041 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2042 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2067 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2124 _dbus_return_if_fail (_dbus_message_iter_check (real));
2125 _dbus_return_if_fail (sub !=
NULL);
2151 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
NULL);
2159 _dbus_string_get_const_data (sig) + start,
2221 _dbus_return_if_fail (_dbus_message_iter_check (real));
2222 _dbus_return_if_fail (value !=
NULL);
2226 #ifdef HAVE_UNIX_FD_PASSING
2234 *((
int*) value) = -1;
2240 *((
int*) value) = -1;
2273 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2319 #ifndef DBUS_DISABLE_CHECKS
2322 _dbus_return_if_fail (_dbus_message_iter_check (real));
2323 _dbus_return_if_fail (value !=
NULL);
2349 _dbus_return_if_fail (message !=
NULL);
2350 _dbus_return_if_fail (iter !=
NULL);
2352 _dbus_message_iter_init_common (message, real,
2353 DBUS_MESSAGE_ITER_TYPE_WRITER);
2362 _dbus_string_get_length (&message->
body));
2378 int current_sig_pos;
2395 ¤t_sig, ¤t_sig_pos))
2402 current_len = _dbus_string_get_byte (current_sig, current_sig_pos);
2403 current_sig_pos += 1;
2431 str, _dbus_string_get_length (str));
2448 const char *v_STRING;
2465 v_STRING = _dbus_string_get_const_data (str);
2508 #ifndef DBUS_DISABLE_CHECKS
2512 if (!_dbus_message_iter_check (iter))
2525 #ifdef HAVE_UNIX_FD_PASSING
2535 if (m->n_unix_fds + n > m->n_unix_fds_allocated)
2541 k = (m->n_unix_fds + n) * 2;
2552 m->n_unix_fds_allocated = k;
2555 return m->unix_fds + m->n_unix_fds;
2586 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2587 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2589 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2591 #ifndef DBUS_DISABLE_CHECKS
2594 const char *
const *string_p;
2599 _dbus_return_val_if_fail (_dbus_check_is_valid_utf8 (*string_p),
FALSE);
2604 _dbus_return_val_if_fail (_dbus_check_is_valid_path (*string_p),
FALSE);
2609 _dbus_return_val_if_fail (_dbus_check_is_valid_signature (*string_p),
FALSE);
2614 _dbus_return_val_if_fail (*bool_p == 0 || *bool_p == 1,
FALSE);
2624 if (!_dbus_message_iter_open_signature (real))
2629 #ifdef HAVE_UNIX_FD_PASSING
2634 if (!(fds = expand_fd_array(real->
message, 1)))
2641 u = real->
message->n_unix_fds;
2649 real->
message->n_unix_fds += 1;
2672 if (!_dbus_message_iter_close_signature (real))
2722 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2723 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2726 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2727 _dbus_return_val_if_fail (n_elements >= 0,
FALSE);
2728 _dbus_return_val_if_fail (n_elements <=
2732 #ifndef DBUS_DISABLE_CHECKS
2738 for (i = 0; i < n_elements; i++)
2740 _dbus_return_val_if_fail ((*bools)[i] == 0 || (*bools)[i] == 1,
FALSE);
2774 const char *contained_signature,
2781 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2782 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2784 _dbus_return_val_if_fail (sub !=
NULL,
FALSE);
2786 contained_signature ==
NULL) ||
2788 contained_signature ==
NULL) ||
2790 contained_signature !=
NULL) ||
2799 (contained_signature ==
NULL ||
2800 _dbus_check_is_valid_signature (contained_signature)),
2803 if (!_dbus_message_iter_open_signature (real))
2808 if (contained_signature !=
NULL)
2848 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2849 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2850 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub),
FALSE);
2851 _dbus_return_val_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2856 if (!_dbus_message_iter_close_signature (real))
2878 #ifndef DBUS_DISABLE_CHECKS
2881 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
2882 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
2883 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
2884 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
2887 _dbus_message_iter_abandon_signature (real);
2910 _dbus_return_if_fail (message !=
NULL);
2911 _dbus_return_if_fail (!message->
locked);
2928 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2952 _dbus_return_if_fail (message !=
NULL);
2953 _dbus_return_if_fail (!message->
locked);
2970 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2991 const char *object_path)
2993 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2994 _dbus_return_val_if_fail (!message->
locked,
FALSE);
2995 _dbus_return_val_if_fail (object_path ==
NULL ||
2996 _dbus_check_is_valid_path (object_path),
2999 return set_or_delete_string_field (message,
3023 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3046 const char *msg_path;
3049 if (msg_path ==
NULL)
3060 if (strcmp (msg_path, path) == 0)
3092 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3093 _dbus_return_val_if_fail (path !=
NULL,
FALSE);
3122 const char *interface)
3124 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3125 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3126 _dbus_return_val_if_fail (interface ==
NULL ||
3127 _dbus_check_is_valid_interface (interface),
3130 return set_or_delete_string_field (message,
3154 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3173 const char *interface)
3175 const char *msg_interface;
3178 if (msg_interface ==
NULL)
3180 if (interface ==
NULL)
3186 if (interface ==
NULL)
3189 if (strcmp (msg_interface, interface) == 0)
3212 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3213 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3214 _dbus_return_val_if_fail (member ==
NULL ||
3215 _dbus_check_is_valid_member (member),
3218 return set_or_delete_string_field (message,
3240 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3261 const char *msg_member;
3264 if (msg_member ==
NULL)
3275 if (strcmp (msg_member, member) == 0)
3295 const char *error_name)
3297 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3298 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3299 _dbus_return_val_if_fail (error_name ==
NULL ||
3300 _dbus_check_is_valid_error_name (error_name),
3303 return set_or_delete_string_field (message,
3324 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3349 const char *destination)
3351 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3352 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3353 _dbus_return_val_if_fail (destination ==
NULL ||
3354 _dbus_check_is_valid_bus_name (destination),
3357 return set_or_delete_string_field (message,
3377 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3405 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3406 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3407 _dbus_return_val_if_fail (sender ==
NULL ||
3408 _dbus_check_is_valid_bus_name (sender),
3411 return set_or_delete_string_field (message,
3437 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3471 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3473 get_const_signature (&message->
header, &type_str, &type_pos);
3475 return _dbus_string_get_const_data_len (type_str, type_pos, 0);
3479 _dbus_message_has_type_interface_member (
DBusMessage *message,
3481 const char *interface,
3499 if (n && strcmp (n, member) == 0)
3503 if (n ==
NULL || strcmp (n, interface) == 0)
3526 const char *interface,
3529 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3530 _dbus_return_val_if_fail (interface !=
NULL,
FALSE);
3531 _dbus_return_val_if_fail (method !=
NULL,
FALSE);
3536 return _dbus_message_has_type_interface_member (message,
3554 const char *interface,
3555 const char *signal_name)
3557 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3558 _dbus_return_val_if_fail (interface !=
NULL,
FALSE);
3559 _dbus_return_val_if_fail (signal_name !=
NULL,
FALSE);
3564 return _dbus_message_has_type_interface_member (message,
3566 interface, signal_name);
3581 const char *error_name)
3585 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3586 _dbus_return_val_if_fail (error_name !=
NULL,
FALSE);
3596 if (n && strcmp (n, error_name) == 0)
3618 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3619 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3626 if (s && strcmp (s, name) == 0)
3653 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3654 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3661 if (s && strcmp (s, name) == 0)
3678 const char *signature)
3682 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3683 _dbus_return_val_if_fail (signature !=
NULL,
FALSE);
3690 if (s && strcmp (s, signature) == 0)
3724 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3725 _dbus_return_val_if_error_is_set (error,
FALSE);
3736 str ?
"%s" :
NULL, str);
3750 #ifdef HAVE_UNIX_FD_PASSING
3753 return message->n_unix_fds > 0;
3777 #define INITIAL_LOADER_DATA_LEN 32
3818 #ifdef HAVE_UNIX_FD_PASSING
3819 loader->unix_fds =
NULL;
3820 loader->n_unix_fds = loader->n_unix_fds_allocated = 0;
3821 loader->unix_fds_outstanding =
FALSE;
3853 #ifdef HAVE_UNIX_FD_PASSING
3854 close_unix_fds(loader->unix_fds, &loader->n_unix_fds);
3890 *buffer = &loader->
data;
3929 unsigned *max_n_fds)
3931 #ifdef HAVE_UNIX_FD_PASSING
3950 loader->unix_fds = a;
3954 *fds = loader->unix_fds + loader->n_unix_fds;
3955 *max_n_fds = loader->n_unix_fds_allocated - loader->n_unix_fds;
3957 loader->unix_fds_outstanding =
TRUE;
3980 #ifdef HAVE_UNIX_FD_PASSING
3982 _dbus_assert(loader->unix_fds + loader->n_unix_fds == fds);
3983 _dbus_assert(loader->n_unix_fds + n_fds <= loader->n_unix_fds_allocated);
3985 loader->n_unix_fds += n_fds;
3986 loader->unix_fds_outstanding =
FALSE;
3988 if (n_fds && loader->unix_fds_change)
3989 loader->unix_fds_change (loader->unix_fds_change_data);
4025 int fields_array_len,
4034 dbus_uint32_t n_unix_fds = 0;
4036 mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED;
4046 _dbus_assert ((header_len + body_len) <= _dbus_string_get_length (&loader->
data));
4056 _dbus_string_get_length (&loader->
data)))
4058 _dbus_verbose (
"Failed to load header for new message code %d\n", validity);
4077 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
4079 get_const_signature (&message->
header, &type_str, &type_pos);
4093 _dbus_verbose (
"Failed to validate message body code %d\n", validity);
4108 #ifdef HAVE_UNIX_FD_PASSING
4110 if (n_unix_fds > loader->n_unix_fds)
4112 _dbus_verbose(
"Message contains references to more unix fds than were sent %u != %u\n",
4113 n_unix_fds, loader->n_unix_fds);
4126 message->unix_fds =
_dbus_memdup(loader->unix_fds, n_unix_fds *
sizeof(message->unix_fds[0]));
4127 if (message->unix_fds ==
NULL)
4129 _dbus_verbose (
"Failed to allocate file descriptor array\n");
4134 message->n_unix_fds_allocated = message->n_unix_fds = n_unix_fds;
4135 loader->n_unix_fds -= n_unix_fds;
4136 memmove (loader->unix_fds, loader->unix_fds + n_unix_fds, loader->n_unix_fds * sizeof (loader->unix_fds[0]));
4138 if (loader->unix_fds_change)
4139 loader->unix_fds_change (loader->unix_fds_change_data);
4142 message->unix_fds =
NULL;
4148 _dbus_verbose (
"Hmm, message claims to come with file descriptors "
4149 "but that's not supported on our platform, disconnecting.\n");
4162 _dbus_verbose (
"Failed to append new message to loader queue\n");
4169 (header_len + body_len));
4173 _dbus_verbose (
"Failed to move body into new message\n");
4186 _dbus_verbose (
"Loaded message %p\n", message);
4233 int byte_order, fields_array_len, header_len, body_len;
4242 _dbus_string_get_length (&loader->
data)))
4248 message = dbus_message_new_empty_header ();
4249 if (message ==
NULL)
4252 if (!load_message (loader, message,
4253 byte_order, fields_array_len,
4254 header_len, body_len))
4268 _dbus_verbose (
"Initial peek at header says we don't have a whole message yet, or data broken with invalid code %d\n",
4383 _dbus_verbose (
"clamping requested max message size %ld to %d\n",
4414 _dbus_verbose (
"clamping requested max message unix_fds %ld to %d\n",
4444 #ifdef HAVE_UNIX_FD_PASSING
4445 return loader->n_unix_fds;
4461 void (* callback) (
void *),
4464 #ifdef HAVE_UNIX_FD_PASSING
4465 loader->unix_fds_change = callback;
4466 loader->unix_fds_change_data = data;
4506 _dbus_return_if_fail (*slot_p >= 0);
4534 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
4535 _dbus_return_val_if_fail (slot >= 0,
FALSE);
4539 slot, data, free_data_func,
4540 &old_free_func, &old_data);
4546 (* old_free_func) (old_data);
4566 _dbus_return_val_if_fail (message !=
NULL,
NULL);
4591 if (strcmp (type_str,
"method_call") == 0)
4593 if (strcmp (type_str,
"method_return") == 0)
4595 else if (strcmp (type_str,
"signal") == 0)
4597 else if (strcmp (type_str,
"error") == 0)
4622 return "method_call";
4624 return "method_return";
4648 char **marshalled_data_p,
4654 _dbus_return_val_if_fail (msg !=
NULL,
FALSE);
4655 _dbus_return_val_if_fail (marshalled_data_p !=
NULL,
FALSE);
4656 _dbus_return_val_if_fail (len_p !=
NULL,
FALSE);
4662 was_locked = msg->
locked;
4670 *len_p = _dbus_string_get_length (&tmp);
4675 *len_p = _dbus_string_get_length (&tmp);
4717 _dbus_return_val_if_fail (str !=
NULL,
NULL);
4749 _DBUS_SET_OOM (error);
4772 int byte_order, fields_array_len, header_len, body_len;
4786 &validity, &byte_order,
4796 _dbus_assert (have_message || (header_len + body_len) > len);
4797 (void) have_message;
4798 return header_len + body_len;