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_ENABLE_EMBEDDED_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)
521 "before registering a shutdown function");
526 if (message_cache[i])
527 dbus_message_finalize (message_cache[i]);
532 message_cache_count = 0;
533 message_cache_shutdown_registered =
FALSE;
546 dbus_message_get_cached (
void)
562 if (message_cache_count == 0)
577 if (message_cache[i])
579 message = message_cache[i];
580 message_cache[i] =
NULL;
581 message_cache_count -= 1;
599 #ifdef HAVE_UNIX_FD_PASSING
601 close_unix_fds(
int *fds,
unsigned *n_fds)
611 for (i = 0; i < *n_fds; i++)
627 free_counter (
void *element,
634 #ifdef HAVE_UNIX_FD_PASSING
648 dbus_message_cache_or_finalize (
DBusMessage *message)
661 free_counter, message);
664 #ifdef HAVE_UNIX_FD_PASSING
665 close_unix_fds(message->unix_fds, &message->n_unix_fds);
675 "the first time we constructed a message");
678 if (!message_cache_shutdown_registered)
688 message_cache[i] =
NULL;
692 message_cache_shutdown_registered =
TRUE;
697 if (!_dbus_enable_message_cache ())
700 if ((_dbus_string_get_length (&message->
header.
data) +
701 _dbus_string_get_length (&message->
body)) >
710 while (message_cache[i] !=
NULL)
716 message_cache[i] = message;
717 message_cache_count += 1;
719 #ifndef DBUS_DISABLE_CHECKS
729 dbus_message_finalize (message);
732 #if defined(DBUS_ENABLE_CHECKS) || defined(DBUS_ENABLE_ASSERT)
746 if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER)
756 else if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER)
774 _dbus_warn_check_failed (
"dbus message iterator invalid because the message has been modified (or perhaps the iterator is just uninitialized)\n");
803 int spec_type, msg_type, i, j;
810 spec_type = first_arg_type;
817 if (msg_type != spec_type)
820 "Argument %d is specified to be of type \"%s\", but "
821 "is actually of type \"%s\"\n", i,
830 #ifdef HAVE_UNIX_FD_PASSING
834 pfd = va_arg (var_args,
int*);
842 "Message refers to file descriptor at index %i,"
843 "but has only %i descriptors attached.\n",
855 "Platform does not support file desciptor passing.\n");
873 int spec_element_type;
878 spec_element_type = va_arg (var_args,
int);
881 if (spec_element_type != element_type)
884 "Argument %d is specified to be an array of \"%s\", but "
885 "is actually an array of \"%s\"\n",
897 n_elements_p = va_arg (var_args,
int*);
905 (
void *) ptr, n_elements_p);
907 else if (_DBUS_TYPE_IS_STRINGLIKE (spec_element_type))
913 str_array_p = va_arg (var_args,
char***);
914 n_elements_p = va_arg (var_args,
int*);
929 str_array =
dbus_new0 (
char*, n_elements + 1);
930 if (str_array ==
NULL)
932 _DBUS_SET_OOM (error);
940 while (j < n_elements)
947 if (str_array[j] ==
NULL)
950 _DBUS_SET_OOM (error);
964 *str_array_p = str_array;
965 *n_elements_p = n_elements;
967 #ifndef DBUS_DISABLE_CHECKS
970 _dbus_warn (
"you can't read arrays of container types (struct, variant, array) with %s for now\n",
971 _DBUS_FUNCTION_NAME);
976 #ifndef DBUS_DISABLE_CHECKS
979 _dbus_warn (
"you can only read arrays and basic types with %s for now\n",
980 _DBUS_FUNCTION_NAME);
985 spec_type = va_arg (var_args,
int);
989 "Message has only %d arguments, but more were expected", i + 1);
1064 _dbus_return_val_if_fail (message !=
NULL, 0);
1079 dbus_uint32_t reply_serial)
1081 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1082 _dbus_return_val_if_fail (!message->
locked,
FALSE);
1083 _dbus_return_val_if_fail (reply_serial != 0,
FALSE);
1100 dbus_uint32_t v_UINT32;
1102 _dbus_return_val_if_fail (message !=
NULL, 0);
1122 free_counter, message);
1128 #ifdef HAVE_UNIX_FD_PASSING
1129 close_unix_fds(message->unix_fds, &message->n_unix_fds);
1139 dbus_message_new_empty_header (
void)
1144 message = dbus_message_get_cached ();
1146 if (message !=
NULL)
1154 if (message ==
NULL)
1156 #ifndef DBUS_DISABLE_CHECKS
1160 #ifdef HAVE_UNIX_FD_PASSING
1161 message->unix_fds =
NULL;
1162 message->n_unix_fds_allocated = 0;
1168 _dbus_message_trace_ref (message, 0, 1,
"new_empty_header");
1171 #ifndef DBUS_DISABLE_CHECKS
1178 #ifdef HAVE_UNIX_FD_PASSING
1179 message->n_unix_fds = 0;
1180 message->n_unix_fds_allocated = 0;
1181 message->unix_fd_counter_delta = 0;
1230 message = dbus_message_new_empty_header ();
1231 if (message ==
NULL)
1235 DBUS_COMPILER_BYTE_ORDER,
1275 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1276 _dbus_return_val_if_fail (method !=
NULL,
NULL);
1277 _dbus_return_val_if_fail (destination ==
NULL ||
1278 _dbus_check_is_valid_bus_name (destination),
NULL);
1279 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1280 _dbus_return_val_if_fail (iface ==
NULL ||
1281 _dbus_check_is_valid_interface (iface),
NULL);
1282 _dbus_return_val_if_fail (_dbus_check_is_valid_member (method),
NULL);
1284 message = dbus_message_new_empty_header ();
1285 if (message ==
NULL)
1289 DBUS_COMPILER_BYTE_ORDER,
1291 destination, path, iface, method,
NULL))
1313 _dbus_return_val_if_fail (method_call !=
NULL,
NULL);
1319 message = dbus_message_new_empty_header ();
1320 if (message ==
NULL)
1324 DBUS_COMPILER_BYTE_ORDER,
1365 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1366 _dbus_return_val_if_fail (iface !=
NULL,
NULL);
1367 _dbus_return_val_if_fail (name !=
NULL,
NULL);
1368 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1369 _dbus_return_val_if_fail (_dbus_check_is_valid_interface (iface),
NULL);
1370 _dbus_return_val_if_fail (_dbus_check_is_valid_member (name),
NULL);
1372 message = dbus_message_new_empty_header ();
1373 if (message ==
NULL)
1377 DBUS_COMPILER_BYTE_ORDER,
1406 const char *error_name,
1407 const char *error_message)
1413 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1414 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1415 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1423 message = dbus_message_new_empty_header ();
1424 if (message ==
NULL)
1428 DBUS_COMPILER_BYTE_ORDER,
1445 if (error_message !=
NULL)
1478 const char *error_name,
1479 const char *error_format,
1486 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1487 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1488 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1493 va_start (args, error_format);
1497 _dbus_string_get_const_data (&str));
1526 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1535 #ifndef DBUS_DISABLE_CHECKS
1546 _dbus_string_get_length (&message->
body)))
1557 #ifdef HAVE_UNIX_FD_PASSING
1558 retval->unix_fds =
dbus_new(
int, message->n_unix_fds);
1559 if (retval->unix_fds ==
NULL && message->n_unix_fds > 0)
1562 retval->n_unix_fds_allocated = message->n_unix_fds;
1564 for (retval->n_unix_fds = 0;
1565 retval->n_unix_fds < message->n_unix_fds;
1566 retval->n_unix_fds++)
1568 retval->unix_fds[retval->n_unix_fds] =
_dbus_dup(message->unix_fds[retval->n_unix_fds],
NULL);
1570 if (retval->unix_fds[retval->n_unix_fds] < 0)
1576 _dbus_message_trace_ref (retval, 0, 1,
"copy");
1583 #ifdef HAVE_UNIX_FD_PASSING
1584 close_unix_fds(retval->unix_fds, &retval->n_unix_fds);
1604 dbus_int32_t old_refcount;
1606 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1612 _dbus_message_trace_ref (message, old_refcount, old_refcount + 1,
"ref");
1627 dbus_int32_t old_refcount;
1629 _dbus_return_if_fail (message !=
NULL);
1631 _dbus_return_if_fail (!message->
in_cache);
1637 _dbus_message_trace_ref (message, old_refcount, old_refcount - 1,
"unref");
1639 if (old_refcount == 1)
1642 dbus_message_cache_or_finalize (message);
1734 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1736 va_start (var_args, first_arg_type);
1766 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1768 type = first_arg_type;
1790 element_type = va_arg (var_args,
int);
1792 buf[0] = element_type;
1807 n_elements = va_arg (var_args,
int);
1817 else if (_DBUS_TYPE_IS_STRINGLIKE (element_type))
1819 const char ***value_p;
1824 value_p = va_arg (var_args,
const char***);
1825 n_elements = va_arg (var_args,
int);
1830 while (i < n_elements)
1843 _dbus_warn (
"arrays of %s can't be appended with %s for now\n",
1845 _DBUS_FUNCTION_NAME);
1852 #ifndef DBUS_DISABLE_CHECKS
1855 _dbus_warn (
"type %s isn't supported yet in %s\n",
1861 type = va_arg (var_args,
int);
1923 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1924 _dbus_return_val_if_error_is_set (error,
FALSE);
1926 va_start (var_args, first_arg_type);
1951 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1952 _dbus_return_val_if_error_is_set (error,
FALSE);
1959 _dbus_message_iter_init_common (
DBusMessage *message,
2006 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2007 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
2009 get_const_signature (&message->
header, &type_str, &type_pos);
2011 _dbus_message_iter_init_common (message, real,
2012 DBUS_MESSAGE_ITER_TYPE_READER);
2034 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2035 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2053 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2054 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2079 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2136 _dbus_return_if_fail (_dbus_message_iter_check (real));
2137 _dbus_return_if_fail (sub !=
NULL);
2163 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
NULL);
2171 _dbus_string_get_const_data (sig) + start,
2233 _dbus_return_if_fail (_dbus_message_iter_check (real));
2234 _dbus_return_if_fail (value !=
NULL);
2238 #ifdef HAVE_UNIX_FD_PASSING
2246 *((
int*) value) = -1;
2252 *((
int*) value) = -1;
2285 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2331 #ifndef DBUS_DISABLE_CHECKS
2334 _dbus_return_if_fail (_dbus_message_iter_check (real));
2335 _dbus_return_if_fail (value !=
NULL);
2361 _dbus_return_if_fail (message !=
NULL);
2362 _dbus_return_if_fail (iter !=
NULL);
2364 _dbus_message_iter_init_common (message, real,
2365 DBUS_MESSAGE_ITER_TYPE_WRITER);
2374 _dbus_string_get_length (&message->
body));
2390 int current_sig_pos;
2407 ¤t_sig, ¤t_sig_pos))
2414 current_len = _dbus_string_get_byte (current_sig, current_sig_pos);
2415 current_sig_pos += 1;
2443 str, _dbus_string_get_length (str));
2460 const char *v_STRING;
2477 v_STRING = _dbus_string_get_const_data (str);
2520 #ifndef DBUS_DISABLE_CHECKS
2524 if (!_dbus_message_iter_check (iter))
2537 #ifdef HAVE_UNIX_FD_PASSING
2547 if (m->n_unix_fds + n > m->n_unix_fds_allocated)
2553 k = (m->n_unix_fds + n) * 2;
2564 m->n_unix_fds_allocated = k;
2567 return m->unix_fds + m->n_unix_fds;
2598 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2599 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2601 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2603 #ifndef DBUS_DISABLE_CHECKS
2606 const char *
const *string_p;
2611 _dbus_return_val_if_fail (_dbus_check_is_valid_utf8 (*string_p),
FALSE);
2616 _dbus_return_val_if_fail (_dbus_check_is_valid_path (*string_p),
FALSE);
2621 _dbus_return_val_if_fail (_dbus_check_is_valid_signature (*string_p),
FALSE);
2626 _dbus_return_val_if_fail (*bool_p == 0 || *bool_p == 1,
FALSE);
2636 if (!_dbus_message_iter_open_signature (real))
2641 #ifdef HAVE_UNIX_FD_PASSING
2646 if (!(fds = expand_fd_array(real->
message, 1)))
2653 u = real->
message->n_unix_fds;
2661 real->
message->n_unix_fds += 1;
2684 if (!_dbus_message_iter_close_signature (real))
2734 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2735 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2738 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2739 _dbus_return_val_if_fail (n_elements >= 0,
FALSE);
2740 _dbus_return_val_if_fail (n_elements <=
2744 #ifndef DBUS_DISABLE_CHECKS
2750 for (i = 0; i < n_elements; i++)
2752 _dbus_return_val_if_fail ((*bools)[i] == 0 || (*bools)[i] == 1,
FALSE);
2786 const char *contained_signature,
2793 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2794 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2796 _dbus_return_val_if_fail (sub !=
NULL,
FALSE);
2798 contained_signature ==
NULL) ||
2800 contained_signature ==
NULL) ||
2802 contained_signature !=
NULL) ||
2811 (contained_signature ==
NULL ||
2812 _dbus_check_is_valid_signature (contained_signature)),
2815 if (!_dbus_message_iter_open_signature (real))
2820 if (contained_signature !=
NULL)
2860 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2861 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2862 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub),
FALSE);
2863 _dbus_return_val_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2868 if (!_dbus_message_iter_close_signature (real))
2890 #ifndef DBUS_DISABLE_CHECKS
2893 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
2894 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
2895 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
2896 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
2899 _dbus_message_iter_abandon_signature (real);
2922 _dbus_return_if_fail (message !=
NULL);
2923 _dbus_return_if_fail (!message->
locked);
2940 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2964 _dbus_return_if_fail (message !=
NULL);
2965 _dbus_return_if_fail (!message->
locked);
2982 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3003 const char *object_path)
3005 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3006 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3007 _dbus_return_val_if_fail (object_path ==
NULL ||
3008 _dbus_check_is_valid_path (object_path),
3011 return set_or_delete_string_field (message,
3035 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3058 const char *msg_path;
3061 if (msg_path ==
NULL)
3072 if (strcmp (msg_path, path) == 0)
3104 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3105 _dbus_return_val_if_fail (path !=
NULL,
FALSE);
3136 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3137 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3138 _dbus_return_val_if_fail (iface ==
NULL ||
3139 _dbus_check_is_valid_interface (iface),
3142 return set_or_delete_string_field (message,
3166 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3187 const char *msg_interface;
3190 if (msg_interface ==
NULL)
3201 if (strcmp (msg_interface, iface) == 0)
3224 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3225 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3226 _dbus_return_val_if_fail (member ==
NULL ||
3227 _dbus_check_is_valid_member (member),
3230 return set_or_delete_string_field (message,
3252 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3273 const char *msg_member;
3276 if (msg_member ==
NULL)
3287 if (strcmp (msg_member, member) == 0)
3307 const char *error_name)
3309 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3310 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3311 _dbus_return_val_if_fail (error_name ==
NULL ||
3312 _dbus_check_is_valid_error_name (error_name),
3315 return set_or_delete_string_field (message,
3336 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3361 const char *destination)
3363 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3364 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3365 _dbus_return_val_if_fail (destination ==
NULL ||
3366 _dbus_check_is_valid_bus_name (destination),
3369 return set_or_delete_string_field (message,
3389 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3417 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3418 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3419 _dbus_return_val_if_fail (sender ==
NULL ||
3420 _dbus_check_is_valid_bus_name (sender),
3423 return set_or_delete_string_field (message,
3449 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3483 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3485 get_const_signature (&message->
header, &type_str, &type_pos);
3487 return _dbus_string_get_const_data_len (type_str, type_pos, 0);
3491 _dbus_message_has_type_interface_member (
DBusMessage *message,
3511 if (n && strcmp (n, member) == 0)
3515 if (n ==
NULL || strcmp (n, iface) == 0)
3541 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3542 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3543 _dbus_return_val_if_fail (method !=
NULL,
FALSE);
3548 return _dbus_message_has_type_interface_member (message,
3567 const char *signal_name)
3569 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3570 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3571 _dbus_return_val_if_fail (signal_name !=
NULL,
FALSE);
3576 return _dbus_message_has_type_interface_member (message,
3578 iface, signal_name);
3593 const char *error_name)
3597 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3598 _dbus_return_val_if_fail (error_name !=
NULL,
FALSE);
3608 if (n && strcmp (n, error_name) == 0)
3630 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3631 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3638 if (s && strcmp (s, name) == 0)
3665 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3666 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3673 if (s && strcmp (s, name) == 0)
3690 const char *signature)
3694 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3695 _dbus_return_val_if_fail (signature !=
NULL,
FALSE);
3702 if (s && strcmp (s, signature) == 0)
3736 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3737 _dbus_return_val_if_error_is_set (error,
FALSE);
3748 str ?
"%s" :
NULL, str);
3762 #ifdef HAVE_UNIX_FD_PASSING
3765 return message->n_unix_fds > 0;
3789 #define INITIAL_LOADER_DATA_LEN 32
3830 #ifdef HAVE_UNIX_FD_PASSING
3831 loader->unix_fds =
NULL;
3832 loader->n_unix_fds = loader->n_unix_fds_allocated = 0;
3833 loader->unix_fds_outstanding =
FALSE;
3865 #ifdef HAVE_UNIX_FD_PASSING
3866 close_unix_fds(loader->unix_fds, &loader->n_unix_fds);
3902 *buffer = &loader->
data;
3939 unsigned *max_n_fds)
3941 #ifdef HAVE_UNIX_FD_PASSING
3960 loader->unix_fds = a;
3964 *fds = loader->unix_fds + loader->n_unix_fds;
3965 *max_n_fds = loader->n_unix_fds_allocated - loader->n_unix_fds;
3967 loader->unix_fds_outstanding =
TRUE;
3990 #ifdef HAVE_UNIX_FD_PASSING
3992 _dbus_assert(loader->unix_fds + loader->n_unix_fds == fds);
3993 _dbus_assert(loader->n_unix_fds + n_fds <= loader->n_unix_fds_allocated);
3995 loader->n_unix_fds += n_fds;
3996 loader->unix_fds_outstanding =
FALSE;
4032 int fields_array_len,
4041 dbus_uint32_t n_unix_fds = 0;
4043 mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED;
4053 _dbus_assert ((header_len + body_len) <= _dbus_string_get_length (&loader->
data));
4063 _dbus_string_get_length (&loader->
data)))
4065 _dbus_verbose (
"Failed to load header for new message code %d\n", validity);
4084 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
4086 get_const_signature (&message->
header, &type_str, &type_pos);
4100 _dbus_verbose (
"Failed to validate message body code %d\n", validity);
4115 #ifdef HAVE_UNIX_FD_PASSING
4117 if (n_unix_fds > loader->n_unix_fds)
4119 _dbus_verbose(
"Message contains references to more unix fds than were sent %u != %u\n",
4120 n_unix_fds, loader->n_unix_fds);
4133 message->unix_fds =
_dbus_memdup(loader->unix_fds, n_unix_fds *
sizeof(message->unix_fds[0]));
4134 if (message->unix_fds ==
NULL)
4136 _dbus_verbose (
"Failed to allocate file descriptor array\n");
4141 message->n_unix_fds_allocated = message->n_unix_fds = n_unix_fds;
4142 loader->n_unix_fds -= n_unix_fds;
4143 memmove(loader->unix_fds + n_unix_fds, loader->unix_fds, loader->n_unix_fds);
4146 message->unix_fds =
NULL;
4152 _dbus_verbose (
"Hmm, message claims to come with file descriptors "
4153 "but that's not supported on our platform, disconnecting.\n");
4166 _dbus_verbose (
"Failed to append new message to loader queue\n");
4173 (header_len + body_len));
4177 _dbus_verbose (
"Failed to move body into new message\n");
4190 _dbus_verbose (
"Loaded message %p\n", message);
4237 int byte_order, fields_array_len, header_len, body_len;
4246 _dbus_string_get_length (&loader->
data)))
4252 message = dbus_message_new_empty_header ();
4253 if (message ==
NULL)
4256 if (!load_message (loader, message,
4257 byte_order, fields_array_len,
4258 header_len, body_len))
4272 _dbus_verbose (
"Initial peek at header says we don't have a whole message yet, or data broken with invalid code %d\n",
4387 _dbus_verbose (
"clamping requested max message size %ld to %d\n",
4418 _dbus_verbose (
"clamping requested max message unix_fds %ld to %d\n",
4475 _dbus_return_if_fail (*slot_p >= 0);
4503 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
4504 _dbus_return_val_if_fail (slot >= 0,
FALSE);
4508 slot, data, free_data_func,
4509 &old_free_func, &old_data);
4515 (* old_free_func) (old_data);
4535 _dbus_return_val_if_fail (message !=
NULL,
NULL);
4560 if (strcmp (type_str,
"method_call") == 0)
4562 if (strcmp (type_str,
"method_return") == 0)
4564 else if (strcmp (type_str,
"signal") == 0)
4566 else if (strcmp (type_str,
"error") == 0)
4591 return "method_call";
4593 return "method_return";
4617 char **marshalled_data_p,
4623 _dbus_return_val_if_fail (msg !=
NULL,
FALSE);
4624 _dbus_return_val_if_fail (marshalled_data_p !=
NULL,
FALSE);
4625 _dbus_return_val_if_fail (len_p !=
NULL,
FALSE);
4631 was_locked = msg->
locked;
4639 *len_p = _dbus_string_get_length (&tmp);
4644 *len_p = _dbus_string_get_length (&tmp);
4686 _dbus_return_val_if_fail (str !=
NULL,
NULL);
4718 _DBUS_SET_OOM (error);
4740 int byte_order, fields_array_len, header_len, body_len;
4754 &validity, &byte_order,
4764 _dbus_assert (have_message || (header_len + body_len) > len);
4765 (void) have_message;
4766 return header_len + body_len;