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-unix.h"
43 #define _DBUS_TYPE_IS_STRINGLIKE(type) \
44 (type == DBUS_TYPE_STRING || type == DBUS_TYPE_SIGNATURE || \
45 type == DBUS_TYPE_OBJECT_PATH)
47 static void dbus_message_finalize (
DBusMessage *message);
59 #ifdef DBUS_BUILD_TESTS
61 _dbus_enable_message_cache (
void)
63 static int enabled = -1;
78 _dbus_warn (
"DBUS_MESSAGE_CACHE should be 0 or 1 if set, not '%s'",
87 # define _dbus_enable_message_cache() (TRUE)
90 #ifndef _dbus_message_trace_ref
97 static int enabled = -1;
99 _dbus_trace_ref (
"DBusMessage", message, old_refcount, new_refcount, why,
100 "DBUS_MESSAGE_TRACE", &enabled);
113 DBUS_MESSAGE_ITER_TYPE_READER = 3,
114 DBUS_MESSAGE_ITER_TYPE_WRITER = 7
152 *type_str_p = &_dbus_empty_signature_str;
171 if (byte_order == DBUS_COMPILER_BYTE_ORDER)
174 _dbus_verbose (
"Swapping message into compiler byte order\n");
176 get_const_signature (&message->
header, &type_str, &type_pos);
180 DBUS_COMPILER_BYTE_ORDER,
185 DBUS_COMPILER_BYTE_ORDER);
194 #define ensure_byte_order(message) _dbus_message_byteswap (message)
214 *body = &message->
body;
232 #ifdef HAVE_UNIX_FD_PASSING
233 *fds = message->unix_fds;
234 *n_fds = message->n_unix_fds;
254 dbus_uint32_t serial)
256 _dbus_return_if_fail (message !=
NULL);
257 _dbus_return_if_fail (!message->
locked);
291 _dbus_string_get_length (&message->
header.
data) +
292 _dbus_string_get_length (&message->
body);
294 #ifdef HAVE_UNIX_FD_PASSING
295 message->unix_fd_counter_delta = message->n_unix_fds;
299 _dbus_verbose (
"message has size %ld\n",
308 #ifdef HAVE_UNIX_FD_PASSING
364 #ifdef HAVE_UNIX_FD_PASSING
388 _dbus_string_get_length (&message->
body));
440 const char *signature)
442 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
443 _dbus_return_val_if_fail (!message->
locked,
FALSE);
444 _dbus_return_val_if_fail (signature ==
NULL ||
445 _dbus_check_is_valid_signature (signature));
447 _dbus_return_val_if_fail (_dbus_string_get_length (&message->
body) == 0 ||
450 return set_or_delete_string_field (message,
504 #define MAX_MESSAGE_SIZE_TO_CACHE 10 * _DBUS_ONE_KILOBYTE
507 #define MAX_MESSAGE_CACHE_SIZE 5
511 static int message_cache_count = 0;
515 dbus_message_cache_shutdown (
void *data)
524 if (message_cache[i])
525 dbus_message_finalize (message_cache[i]);
530 message_cache_count = 0;
531 message_cache_shutdown_registered =
FALSE;
544 dbus_message_get_cached (
void)
555 if (message_cache_count == 0)
570 if (message_cache[i])
572 message = message_cache[i];
573 message_cache[i] =
NULL;
574 message_cache_count -= 1;
592 #ifdef HAVE_UNIX_FD_PASSING
594 close_unix_fds(
int *fds,
unsigned *n_fds)
604 for (i = 0; i < *n_fds; i++)
620 free_counter (
void *element,
627 #ifdef HAVE_UNIX_FD_PASSING
641 dbus_message_cache_or_finalize (
DBusMessage *message)
654 free_counter, message);
657 #ifdef HAVE_UNIX_FD_PASSING
658 close_unix_fds(message->unix_fds, &message->n_unix_fds);
665 if (!message_cache_shutdown_registered)
675 message_cache[i] =
NULL;
679 message_cache_shutdown_registered =
TRUE;
684 if (!_dbus_enable_message_cache ())
687 if ((_dbus_string_get_length (&message->
header.
data) +
688 _dbus_string_get_length (&message->
body)) >
697 while (message_cache[i] !=
NULL)
703 message_cache[i] = message;
704 message_cache_count += 1;
706 #ifndef DBUS_DISABLE_CHECKS
716 dbus_message_finalize (message);
719 #ifndef DBUS_DISABLE_CHECKS
733 if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER)
743 else if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER)
761 _dbus_warn_check_failed (
"dbus message iterator invalid because the message has been modified (or perhaps the iterator is just uninitialized)\n");
790 int spec_type, msg_type, i;
797 spec_type = first_arg_type;
804 if (msg_type != spec_type)
807 "Argument %d is specified to be of type \"%s\", but "
808 "is actually of type \"%s\"\n", i,
817 #ifdef HAVE_UNIX_FD_PASSING
821 pfd = va_arg (var_args,
int*);
829 "Message refers to file descriptor at index %i,"
830 "but has only %i descriptors attached.\n",
842 "Platform does not support file desciptor passing.\n");
860 int spec_element_type;
865 spec_element_type = va_arg (var_args,
int);
868 if (spec_element_type != element_type)
871 "Argument %d is specified to be an array of \"%s\", but "
872 "is actually an array of \"%s\"\n",
884 n_elements_p = va_arg (var_args,
int*);
892 (
void *) ptr, n_elements_p);
894 else if (_DBUS_TYPE_IS_STRINGLIKE (spec_element_type))
900 str_array_p = va_arg (var_args,
char***);
901 n_elements_p = va_arg (var_args,
int*);
916 str_array =
dbus_new0 (
char*, n_elements + 1);
917 if (str_array ==
NULL)
919 _DBUS_SET_OOM (error);
927 while (i < n_elements)
934 if (str_array[i] ==
NULL)
937 _DBUS_SET_OOM (error);
951 *str_array_p = str_array;
952 *n_elements_p = n_elements;
954 #ifndef DBUS_DISABLE_CHECKS
957 _dbus_warn (
"you can't read arrays of container types (struct, variant, array) with %s for now\n",
958 _DBUS_FUNCTION_NAME);
963 #ifndef DBUS_DISABLE_CHECKS
966 _dbus_warn (
"you can only read arrays and basic types with %s for now\n",
967 _DBUS_FUNCTION_NAME);
972 spec_type = va_arg (var_args,
int);
976 "Message has only %d arguments, but more were expected", i);
1051 _dbus_return_val_if_fail (message !=
NULL, 0);
1066 dbus_uint32_t reply_serial)
1068 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1069 _dbus_return_val_if_fail (!message->
locked,
FALSE);
1070 _dbus_return_val_if_fail (reply_serial != 0,
FALSE);
1087 dbus_uint32_t v_UINT32;
1089 _dbus_return_val_if_fail (message !=
NULL, 0);
1109 free_counter, message);
1115 #ifdef HAVE_UNIX_FD_PASSING
1116 close_unix_fds(message->unix_fds, &message->n_unix_fds);
1126 dbus_message_new_empty_header (
void)
1131 message = dbus_message_get_cached ();
1133 if (message !=
NULL)
1141 if (message ==
NULL)
1143 #ifndef DBUS_DISABLE_CHECKS
1147 #ifdef HAVE_UNIX_FD_PASSING
1148 message->unix_fds =
NULL;
1149 message->n_unix_fds_allocated = 0;
1155 _dbus_message_trace_ref (message, 0, 1,
"new_empty_header");
1158 #ifndef DBUS_DISABLE_CHECKS
1165 #ifdef HAVE_UNIX_FD_PASSING
1166 message->n_unix_fds = 0;
1167 message->n_unix_fds_allocated = 0;
1168 message->unix_fd_counter_delta = 0;
1217 message = dbus_message_new_empty_header ();
1218 if (message ==
NULL)
1222 DBUS_COMPILER_BYTE_ORDER,
1262 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1263 _dbus_return_val_if_fail (method !=
NULL,
NULL);
1264 _dbus_return_val_if_fail (destination ==
NULL ||
1265 _dbus_check_is_valid_bus_name (destination),
NULL);
1266 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1267 _dbus_return_val_if_fail (iface ==
NULL ||
1268 _dbus_check_is_valid_interface (iface),
NULL);
1269 _dbus_return_val_if_fail (_dbus_check_is_valid_member (method),
NULL);
1271 message = dbus_message_new_empty_header ();
1272 if (message ==
NULL)
1276 DBUS_COMPILER_BYTE_ORDER,
1278 destination, path, iface, method,
NULL))
1300 _dbus_return_val_if_fail (method_call !=
NULL,
NULL);
1306 message = dbus_message_new_empty_header ();
1307 if (message ==
NULL)
1311 DBUS_COMPILER_BYTE_ORDER,
1352 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1353 _dbus_return_val_if_fail (iface !=
NULL,
NULL);
1354 _dbus_return_val_if_fail (name !=
NULL,
NULL);
1355 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1356 _dbus_return_val_if_fail (_dbus_check_is_valid_interface (iface),
NULL);
1357 _dbus_return_val_if_fail (_dbus_check_is_valid_member (name),
NULL);
1359 message = dbus_message_new_empty_header ();
1360 if (message ==
NULL)
1364 DBUS_COMPILER_BYTE_ORDER,
1393 const char *error_name,
1394 const char *error_message)
1400 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1401 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1402 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1410 message = dbus_message_new_empty_header ();
1411 if (message ==
NULL)
1415 DBUS_COMPILER_BYTE_ORDER,
1432 if (error_message !=
NULL)
1465 const char *error_name,
1466 const char *error_format,
1473 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1474 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1475 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1480 va_start (args, error_format);
1484 _dbus_string_get_const_data (&str));
1513 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1522 #ifndef DBUS_DISABLE_CHECKS
1533 _dbus_string_get_length (&message->
body)))
1544 #ifdef HAVE_UNIX_FD_PASSING
1545 retval->unix_fds =
dbus_new(
int, message->n_unix_fds);
1546 if (retval->unix_fds ==
NULL && message->n_unix_fds > 0)
1549 retval->n_unix_fds_allocated = message->n_unix_fds;
1551 for (retval->n_unix_fds = 0;
1552 retval->n_unix_fds < message->n_unix_fds;
1553 retval->n_unix_fds++)
1555 retval->unix_fds[retval->n_unix_fds] =
_dbus_dup(message->unix_fds[retval->n_unix_fds],
NULL);
1557 if (retval->unix_fds[retval->n_unix_fds] < 0)
1563 _dbus_message_trace_ref (retval, 0, 1,
"copy");
1570 #ifdef HAVE_UNIX_FD_PASSING
1571 close_unix_fds(retval->unix_fds, &retval->n_unix_fds);
1591 dbus_int32_t old_refcount;
1593 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1599 _dbus_message_trace_ref (message, old_refcount, old_refcount + 1,
"ref");
1614 dbus_int32_t old_refcount;
1616 _dbus_return_if_fail (message !=
NULL);
1618 _dbus_return_if_fail (!message->
in_cache);
1624 _dbus_message_trace_ref (message, old_refcount, old_refcount - 1,
"unref");
1626 if (old_refcount == 1)
1629 dbus_message_cache_or_finalize (message);
1721 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1723 va_start (var_args, first_arg_type);
1753 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1755 type = first_arg_type;
1777 element_type = va_arg (var_args,
int);
1779 buf[0] = element_type;
1794 n_elements = va_arg (var_args,
int);
1804 else if (_DBUS_TYPE_IS_STRINGLIKE (element_type))
1806 const char ***value_p;
1811 value_p = va_arg (var_args,
const char***);
1812 n_elements = va_arg (var_args,
int);
1817 while (i < n_elements)
1830 _dbus_warn (
"arrays of %s can't be appended with %s for now\n",
1832 _DBUS_FUNCTION_NAME);
1839 #ifndef DBUS_DISABLE_CHECKS
1842 _dbus_warn (
"type %s isn't supported yet in %s\n",
1848 type = va_arg (var_args,
int);
1910 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1911 _dbus_return_val_if_error_is_set (error,
FALSE);
1913 va_start (var_args, first_arg_type);
1938 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1939 _dbus_return_val_if_error_is_set (error,
FALSE);
1946 _dbus_message_iter_init_common (
DBusMessage *message,
1993 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1994 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
1996 get_const_signature (&message->
header, &type_str, &type_pos);
1998 _dbus_message_iter_init_common (message, real,
1999 DBUS_MESSAGE_ITER_TYPE_READER);
2021 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2022 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2040 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2041 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2066 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2123 _dbus_return_if_fail (_dbus_message_iter_check (real));
2124 _dbus_return_if_fail (sub !=
NULL);
2150 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
NULL);
2158 _dbus_string_get_const_data (sig) + start,
2220 _dbus_return_if_fail (_dbus_message_iter_check (real));
2221 _dbus_return_if_fail (value !=
NULL);
2225 #ifdef HAVE_UNIX_FD_PASSING
2233 *((
int*) value) = -1;
2239 *((
int*) value) = -1;
2272 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2318 #ifndef DBUS_DISABLE_CHECKS
2321 _dbus_return_if_fail (_dbus_message_iter_check (real));
2322 _dbus_return_if_fail (value !=
NULL);
2348 _dbus_return_if_fail (message !=
NULL);
2349 _dbus_return_if_fail (iter !=
NULL);
2351 _dbus_message_iter_init_common (message, real,
2352 DBUS_MESSAGE_ITER_TYPE_WRITER);
2361 _dbus_string_get_length (&message->
body));
2377 int current_sig_pos;
2394 ¤t_sig, ¤t_sig_pos))
2401 current_len = _dbus_string_get_byte (current_sig, current_sig_pos);
2402 current_sig_pos += 1;
2430 str, _dbus_string_get_length (str));
2447 const char *v_STRING;
2464 v_STRING = _dbus_string_get_const_data (str);
2507 #ifndef DBUS_DISABLE_CHECKS
2511 if (!_dbus_message_iter_check (iter))
2524 #ifdef HAVE_UNIX_FD_PASSING
2534 if (m->n_unix_fds + n > m->n_unix_fds_allocated)
2540 k = (m->n_unix_fds + n) * 2;
2551 m->n_unix_fds_allocated = k;
2554 return m->unix_fds + m->n_unix_fds;
2585 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2586 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2588 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2590 #ifndef DBUS_DISABLE_CHECKS
2593 const char *
const *string_p;
2598 _dbus_return_val_if_fail (_dbus_check_is_valid_utf8 (*string_p),
FALSE);
2603 _dbus_return_val_if_fail (_dbus_check_is_valid_path (*string_p),
FALSE);
2608 _dbus_return_val_if_fail (_dbus_check_is_valid_signature (*string_p),
FALSE);
2613 _dbus_return_val_if_fail (*bool_p == 0 || *bool_p == 1,
FALSE);
2623 if (!_dbus_message_iter_open_signature (real))
2628 #ifdef HAVE_UNIX_FD_PASSING
2633 if (!(fds = expand_fd_array(real->
message, 1)))
2640 u = real->
message->n_unix_fds;
2648 real->
message->n_unix_fds += 1;
2671 if (!_dbus_message_iter_close_signature (real))
2721 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2722 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2725 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2726 _dbus_return_val_if_fail (n_elements >= 0,
FALSE);
2727 _dbus_return_val_if_fail (n_elements <=
2731 #ifndef DBUS_DISABLE_CHECKS
2737 for (i = 0; i < n_elements; i++)
2739 _dbus_return_val_if_fail ((*bools)[i] == 0 || (*bools)[i] == 1,
FALSE);
2773 const char *contained_signature,
2780 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2781 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2783 _dbus_return_val_if_fail (sub !=
NULL,
FALSE);
2785 contained_signature ==
NULL) ||
2787 contained_signature ==
NULL) ||
2789 contained_signature !=
NULL) ||
2798 (contained_signature ==
NULL ||
2799 _dbus_check_is_valid_signature (contained_signature)),
2802 if (!_dbus_message_iter_open_signature (real))
2807 if (contained_signature !=
NULL)
2847 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2848 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2849 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub),
FALSE);
2850 _dbus_return_val_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2855 if (!_dbus_message_iter_close_signature (real))
2877 #ifndef DBUS_DISABLE_CHECKS
2880 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
2881 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
2882 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
2883 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
2886 _dbus_message_iter_abandon_signature (real);
2909 _dbus_return_if_fail (message !=
NULL);
2910 _dbus_return_if_fail (!message->
locked);
2927 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2951 _dbus_return_if_fail (message !=
NULL);
2952 _dbus_return_if_fail (!message->
locked);
2969 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2990 const char *object_path)
2992 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2993 _dbus_return_val_if_fail (!message->
locked,
FALSE);
2994 _dbus_return_val_if_fail (object_path ==
NULL ||
2995 _dbus_check_is_valid_path (object_path),
2998 return set_or_delete_string_field (message,
3022 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3045 const char *msg_path;
3048 if (msg_path ==
NULL)
3059 if (strcmp (msg_path, path) == 0)
3091 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3092 _dbus_return_val_if_fail (path !=
NULL,
FALSE);
3123 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3124 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3125 _dbus_return_val_if_fail (iface ==
NULL ||
3126 _dbus_check_is_valid_interface (iface),
3129 return set_or_delete_string_field (message,
3153 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3174 const char *msg_interface;
3177 if (msg_interface ==
NULL)
3188 if (strcmp (msg_interface, iface) == 0)
3211 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3212 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3213 _dbus_return_val_if_fail (member ==
NULL ||
3214 _dbus_check_is_valid_member (member),
3217 return set_or_delete_string_field (message,
3239 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3260 const char *msg_member;
3263 if (msg_member ==
NULL)
3274 if (strcmp (msg_member, member) == 0)
3294 const char *error_name)
3296 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3297 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3298 _dbus_return_val_if_fail (error_name ==
NULL ||
3299 _dbus_check_is_valid_error_name (error_name),
3302 return set_or_delete_string_field (message,
3323 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3348 const char *destination)
3350 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3351 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3352 _dbus_return_val_if_fail (destination ==
NULL ||
3353 _dbus_check_is_valid_bus_name (destination),
3356 return set_or_delete_string_field (message,
3376 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3404 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3405 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3406 _dbus_return_val_if_fail (sender ==
NULL ||
3407 _dbus_check_is_valid_bus_name (sender),
3410 return set_or_delete_string_field (message,
3436 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3470 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3472 get_const_signature (&message->
header, &type_str, &type_pos);
3474 return _dbus_string_get_const_data_len (type_str, type_pos, 0);
3478 _dbus_message_has_type_interface_member (
DBusMessage *message,
3498 if (n && strcmp (n, member) == 0)
3502 if (n ==
NULL || strcmp (n, iface) == 0)
3528 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3529 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3530 _dbus_return_val_if_fail (method !=
NULL,
FALSE);
3535 return _dbus_message_has_type_interface_member (message,
3554 const char *signal_name)
3556 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3557 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3558 _dbus_return_val_if_fail (signal_name !=
NULL,
FALSE);
3563 return _dbus_message_has_type_interface_member (message,
3565 iface, signal_name);
3580 const char *error_name)
3584 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3585 _dbus_return_val_if_fail (error_name !=
NULL,
FALSE);
3595 if (n && strcmp (n, error_name) == 0)
3617 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3618 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3625 if (s && strcmp (s, name) == 0)
3652 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3653 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3660 if (s && strcmp (s, name) == 0)
3677 const char *signature)
3681 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3682 _dbus_return_val_if_fail (signature !=
NULL,
FALSE);
3689 if (s && strcmp (s, signature) == 0)
3723 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3724 _dbus_return_val_if_error_is_set (error,
FALSE);
3735 str ?
"%s" :
NULL, str);
3749 #ifdef HAVE_UNIX_FD_PASSING
3752 return message->n_unix_fds > 0;
3776 #define INITIAL_LOADER_DATA_LEN 32
3817 #ifdef HAVE_UNIX_FD_PASSING
3818 loader->unix_fds =
NULL;
3819 loader->n_unix_fds = loader->n_unix_fds_allocated = 0;
3820 loader->unix_fds_outstanding =
FALSE;
3852 #ifdef HAVE_UNIX_FD_PASSING
3853 close_unix_fds(loader->unix_fds, &loader->n_unix_fds);
3889 *buffer = &loader->
data;
3928 unsigned *max_n_fds)
3930 #ifdef HAVE_UNIX_FD_PASSING
3949 loader->unix_fds = a;
3953 *fds = loader->unix_fds + loader->n_unix_fds;
3954 *max_n_fds = loader->n_unix_fds_allocated - loader->n_unix_fds;
3956 loader->unix_fds_outstanding =
TRUE;
3979 #ifdef HAVE_UNIX_FD_PASSING
3981 _dbus_assert(loader->unix_fds + loader->n_unix_fds == fds);
3982 _dbus_assert(loader->n_unix_fds + n_fds <= loader->n_unix_fds_allocated);
3984 loader->n_unix_fds += n_fds;
3985 loader->unix_fds_outstanding =
FALSE;
4021 int fields_array_len,
4030 dbus_uint32_t n_unix_fds = 0;
4032 mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED;
4042 _dbus_assert ((header_len + body_len) <= _dbus_string_get_length (&loader->
data));
4052 _dbus_string_get_length (&loader->
data)))
4054 _dbus_verbose (
"Failed to load header for new message code %d\n", validity);
4073 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
4075 get_const_signature (&message->
header, &type_str, &type_pos);
4089 _dbus_verbose (
"Failed to validate message body code %d\n", validity);
4104 #ifdef HAVE_UNIX_FD_PASSING
4106 if (n_unix_fds > loader->n_unix_fds)
4108 _dbus_verbose(
"Message contains references to more unix fds than were sent %u != %u\n",
4109 n_unix_fds, loader->n_unix_fds);
4122 message->unix_fds =
_dbus_memdup(loader->unix_fds, n_unix_fds *
sizeof(message->unix_fds[0]));
4123 if (message->unix_fds ==
NULL)
4125 _dbus_verbose (
"Failed to allocate file descriptor array\n");
4130 message->n_unix_fds_allocated = message->n_unix_fds = n_unix_fds;
4131 loader->n_unix_fds -= n_unix_fds;
4132 memmove(loader->unix_fds + n_unix_fds, loader->unix_fds, loader->n_unix_fds);
4135 message->unix_fds =
NULL;
4141 _dbus_verbose (
"Hmm, message claims to come with file descriptors "
4142 "but that's not supported on our platform, disconnecting.\n");
4155 _dbus_verbose (
"Failed to append new message to loader queue\n");
4162 (header_len + body_len));
4166 _dbus_verbose (
"Failed to move body into new message\n");
4179 _dbus_verbose (
"Loaded message %p\n", message);
4226 int byte_order, fields_array_len, header_len, body_len;
4235 _dbus_string_get_length (&loader->
data)))
4241 message = dbus_message_new_empty_header ();
4242 if (message ==
NULL)
4245 if (!load_message (loader, message,
4246 byte_order, fields_array_len,
4247 header_len, body_len))
4261 _dbus_verbose (
"Initial peek at header says we don't have a whole message yet, or data broken with invalid code %d\n",
4376 _dbus_verbose (
"clamping requested max message size %ld to %d\n",
4407 _dbus_verbose (
"clamping requested max message unix_fds %ld to %d\n",
4465 _dbus_return_if_fail (*slot_p >= 0);
4493 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
4494 _dbus_return_val_if_fail (slot >= 0,
FALSE);
4498 slot, data, free_data_func,
4499 &old_free_func, &old_data);
4505 (* old_free_func) (old_data);
4525 _dbus_return_val_if_fail (message !=
NULL,
NULL);
4550 if (strcmp (type_str,
"method_call") == 0)
4552 if (strcmp (type_str,
"method_return") == 0)
4554 else if (strcmp (type_str,
"signal") == 0)
4556 else if (strcmp (type_str,
"error") == 0)
4581 return "method_call";
4583 return "method_return";
4607 char **marshalled_data_p,
4613 _dbus_return_val_if_fail (msg !=
NULL,
FALSE);
4614 _dbus_return_val_if_fail (marshalled_data_p !=
NULL,
FALSE);
4615 _dbus_return_val_if_fail (len_p !=
NULL,
FALSE);
4621 was_locked = msg->
locked;
4629 *len_p = _dbus_string_get_length (&tmp);
4634 *len_p = _dbus_string_get_length (&tmp);
4676 _dbus_return_val_if_fail (str !=
NULL,
NULL);
4708 _DBUS_SET_OOM (error);
4731 int byte_order, fields_array_len, header_len, body_len;
4745 &validity, &byte_order,
4755 _dbus_assert (have_message || (header_len + body_len) > len);
4756 (void) have_message;
4757 return header_len + body_len;