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_ENABLE_EMBEDDED_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
176 *type_str_p = &_dbus_empty_signature_str;
195 if (byte_order == DBUS_COMPILER_BYTE_ORDER)
198 _dbus_verbose (
"Swapping message into compiler byte order\n");
200 get_const_signature (&message->
header, &type_str, &type_pos);
204 DBUS_COMPILER_BYTE_ORDER,
209 DBUS_COMPILER_BYTE_ORDER);
218 #define ensure_byte_order(message) _dbus_message_byteswap (message)
238 *body = &message->
body;
256 #ifdef HAVE_UNIX_FD_PASSING
257 *fds = message->unix_fds;
258 *n_fds = message->n_unix_fds;
280 _dbus_return_if_fail (message !=
NULL);
281 _dbus_return_if_fail (!message->
locked);
318 #ifdef HAVE_UNIX_FD_PASSING
319 message->unix_fd_counter_delta = message->n_unix_fds;
323 _dbus_verbose (
"message has size %ld\n",
332 #ifdef HAVE_UNIX_FD_PASSING
388 #ifdef HAVE_UNIX_FD_PASSING
484 #define MAX_MESSAGE_SIZE_TO_CACHE 10 * _DBUS_ONE_KILOBYTE
487 #define MAX_MESSAGE_CACHE_SIZE 5
491 static int message_cache_count = 0;
495 dbus_message_cache_shutdown (
void *data)
501 "before registering a shutdown function");
506 if (message_cache[i])
507 dbus_message_finalize (message_cache[i]);
512 message_cache_count = 0;
513 message_cache_shutdown_registered =
FALSE;
526 dbus_message_get_cached (
void)
542 if (message_cache_count == 0)
557 if (message_cache[i])
559 message = message_cache[i];
560 message_cache[i] =
NULL;
561 message_cache_count -= 1;
579 #ifdef HAVE_UNIX_FD_PASSING
581 close_unix_fds(
int *fds,
unsigned *n_fds)
591 for (i = 0; i < *n_fds; i++)
607 free_counter (
void *element,
614 #ifdef HAVE_UNIX_FD_PASSING
628 dbus_message_cache_or_finalize (
DBusMessage *message)
641 free_counter, message);
644 #ifdef HAVE_UNIX_FD_PASSING
645 close_unix_fds(message->unix_fds, &message->n_unix_fds);
655 "the first time we constructed a message");
658 if (!message_cache_shutdown_registered)
668 message_cache[i] =
NULL;
672 message_cache_shutdown_registered =
TRUE;
677 if (!_dbus_enable_message_cache ())
690 while (message_cache[i] !=
NULL)
696 message_cache[i] = message;
697 message_cache_count += 1;
699 #ifndef DBUS_DISABLE_CHECKS
709 dbus_message_finalize (message);
733 _dbus_return_if_fail (iter !=
NULL);
744 #if defined(DBUS_ENABLE_CHECKS) || defined(DBUS_ENABLE_ASSERT)
759 "closed, or is uninitialized or corrupt");
765 if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER)
775 else if (iter->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER)
793 _dbus_warn_check_failed (
"dbus message iterator invalid because the message has been modified (or perhaps the iterator is just uninitialized)");
820 int spec_type, msg_type, i, j;
828 spec_type = first_arg_type;
834 DBUS_VA_COPY (copy_args, var_args);
840 if (msg_type != spec_type)
843 "Argument %d is specified to be of type \"%s\", but "
844 "is actually of type \"%s\"\n", i,
853 #ifdef HAVE_UNIX_FD_PASSING
857 pfd = va_arg (var_args,
int*);
865 "Message refers to file descriptor at index %i,"
866 "but has only %i descriptors attached.\n",
878 "Platform does not support file desciptor passing.\n");
896 int spec_element_type;
901 spec_element_type = va_arg (var_args,
int);
904 if (spec_element_type != element_type)
907 "Argument %d is specified to be an array of \"%s\", but "
908 "is actually an array of \"%s\"\n",
920 n_elements_p = va_arg (var_args,
int*);
928 (
void *) ptr, n_elements_p);
930 else if (_DBUS_TYPE_IS_STRINGLIKE (spec_element_type))
936 str_array_p = va_arg (var_args,
char***);
937 n_elements_p = va_arg (var_args,
int*);
952 str_array =
dbus_new0 (
char*, n_elements + 1);
953 if (str_array ==
NULL)
955 _DBUS_SET_OOM (error);
963 while (j < n_elements)
970 if (str_array[j] ==
NULL)
973 _DBUS_SET_OOM (error);
987 *str_array_p = str_array;
988 *n_elements_p = n_elements;
990 #ifndef DBUS_DISABLE_CHECKS
993 _dbus_warn (
"you can't read arrays of container types (struct, variant, array) with %s for now",
994 _DBUS_FUNCTION_NAME);
999 #ifndef DBUS_DISABLE_CHECKS
1002 _dbus_warn (
"you can only read arrays and basic types with %s for now",
1003 _DBUS_FUNCTION_NAME);
1011 spec_type = va_arg (var_args,
int);
1015 "Message has only %d arguments, but more were expected", i);
1029 spec_type = first_arg_type;
1036 #ifdef HAVE_UNIX_FD_PASSING
1039 pfd = va_arg (copy_args,
int *);
1055 int spec_element_type;
1057 spec_element_type = va_arg (copy_args,
int);
1062 va_arg (copy_args,
int *);
1064 else if (_DBUS_TYPE_IS_STRINGLIKE (spec_element_type))
1066 char ***str_array_p;
1068 str_array_p = va_arg (copy_args,
char ***);
1070 va_arg (copy_args,
int *);
1073 *str_array_p =
NULL;
1077 spec_type = va_arg (copy_args,
int);
1147 _dbus_return_val_if_fail (message !=
NULL, 0);
1166 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1167 _dbus_return_val_if_fail (!message->
locked,
FALSE);
1168 _dbus_return_val_if_fail (reply_serial != 0,
FALSE);
1170 value.
u32 = reply_serial;
1189 _dbus_return_val_if_fail (message !=
NULL, 0);
1209 free_counter, message);
1215 #ifdef HAVE_UNIX_FD_PASSING
1216 close_unix_fds(message->unix_fds, &message->n_unix_fds);
1226 dbus_message_new_empty_header (
void)
1231 message = dbus_message_get_cached ();
1233 if (message !=
NULL)
1241 if (message ==
NULL)
1243 #ifndef DBUS_DISABLE_CHECKS
1247 #ifdef HAVE_UNIX_FD_PASSING
1248 message->unix_fds =
NULL;
1249 message->n_unix_fds_allocated = 0;
1255 _dbus_message_trace_ref (message, 0, 1,
"new_empty_header");
1258 #ifndef DBUS_DISABLE_CHECKS
1265 #ifdef HAVE_UNIX_FD_PASSING
1266 message->n_unix_fds = 0;
1267 message->n_unix_fds_allocated = 0;
1268 message->unix_fd_counter_delta = 0;
1317 message = dbus_message_new_empty_header ();
1318 if (message ==
NULL)
1322 DBUS_COMPILER_BYTE_ORDER,
1362 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1363 _dbus_return_val_if_fail (method !=
NULL,
NULL);
1364 _dbus_return_val_if_fail (destination ==
NULL ||
1365 _dbus_check_is_valid_bus_name (destination),
NULL);
1366 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1367 _dbus_return_val_if_fail (iface ==
NULL ||
1368 _dbus_check_is_valid_interface (iface),
NULL);
1369 _dbus_return_val_if_fail (_dbus_check_is_valid_member (method),
NULL);
1371 message = dbus_message_new_empty_header ();
1372 if (message ==
NULL)
1376 DBUS_COMPILER_BYTE_ORDER,
1378 destination, path, iface, method,
NULL))
1400 _dbus_return_val_if_fail (method_call !=
NULL,
NULL);
1406 message = dbus_message_new_empty_header ();
1407 if (message ==
NULL)
1411 DBUS_COMPILER_BYTE_ORDER,
1452 _dbus_return_val_if_fail (path !=
NULL,
NULL);
1453 _dbus_return_val_if_fail (iface !=
NULL,
NULL);
1454 _dbus_return_val_if_fail (name !=
NULL,
NULL);
1455 _dbus_return_val_if_fail (_dbus_check_is_valid_path (path),
NULL);
1456 _dbus_return_val_if_fail (_dbus_check_is_valid_interface (iface),
NULL);
1457 _dbus_return_val_if_fail (_dbus_check_is_valid_member (name),
NULL);
1459 message = dbus_message_new_empty_header ();
1460 if (message ==
NULL)
1464 DBUS_COMPILER_BYTE_ORDER,
1493 const char *error_name,
1494 const char *error_message)
1500 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1501 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1502 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1510 message = dbus_message_new_empty_header ();
1511 if (message ==
NULL)
1515 DBUS_COMPILER_BYTE_ORDER,
1532 if (error_message !=
NULL)
1565 const char *error_name,
1566 const char *error_format,
1573 _dbus_return_val_if_fail (reply_to !=
NULL,
NULL);
1574 _dbus_return_val_if_fail (error_name !=
NULL,
NULL);
1575 _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name),
NULL);
1580 va_start (args, error_format);
1613 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1622 #ifndef DBUS_DISABLE_CHECKS
1644 #ifdef HAVE_UNIX_FD_PASSING
1645 retval->unix_fds =
dbus_new(
int, message->n_unix_fds);
1646 if (retval->unix_fds ==
NULL && message->n_unix_fds > 0)
1649 retval->n_unix_fds_allocated = message->n_unix_fds;
1651 for (retval->n_unix_fds = 0;
1652 retval->n_unix_fds < message->n_unix_fds;
1653 retval->n_unix_fds++)
1655 retval->unix_fds[retval->n_unix_fds] =
_dbus_dup(message->unix_fds[retval->n_unix_fds],
NULL);
1657 if (retval->unix_fds[retval->n_unix_fds] < 0)
1663 _dbus_message_trace_ref (retval, 0, 1,
"copy");
1670 #ifdef HAVE_UNIX_FD_PASSING
1671 close_unix_fds(retval->unix_fds, &retval->n_unix_fds);
1693 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1699 _dbus_message_trace_ref (message, old_refcount, old_refcount + 1,
"ref");
1716 _dbus_return_if_fail (message !=
NULL);
1718 _dbus_return_if_fail (!message->
in_cache);
1724 _dbus_message_trace_ref (message, old_refcount, old_refcount - 1,
"unref");
1726 if (old_refcount == 1)
1729 dbus_message_cache_or_finalize (message);
1821 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1823 va_start (var_args, first_arg_type);
1853 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1855 type = first_arg_type;
1877 element_type = va_arg (var_args,
int);
1879 buf[0] = element_type;
1894 n_elements = va_arg (var_args,
int);
1904 else if (_DBUS_TYPE_IS_STRINGLIKE (element_type))
1906 const char ***value_p;
1911 value_p = va_arg (var_args,
const char***);
1912 n_elements = va_arg (var_args,
int);
1917 while (i < n_elements)
1930 _dbus_warn (
"arrays of %s can't be appended with %s for now",
1932 _DBUS_FUNCTION_NAME);
1940 #ifndef DBUS_DISABLE_CHECKS
1943 _dbus_warn (
"type %s isn't supported yet in %s",
1949 type = va_arg (var_args,
int);
2011 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2012 _dbus_return_val_if_error_is_set (error,
FALSE);
2014 va_start (var_args, first_arg_type);
2039 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2040 _dbus_return_val_if_error_is_set (error,
FALSE);
2047 _dbus_message_iter_init_common (
DBusMessage *message,
2065 4 *
sizeof (
void *) +
sizeof (
dbus_uint32_t) + 9 *
sizeof (
int));
2108 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2109 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
2111 get_const_signature (&message->
header, &type_str, &type_pos);
2113 _dbus_message_iter_init_common (message, real,
2114 DBUS_MESSAGE_ITER_TYPE_READER);
2136 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2137 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2155 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2156 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2181 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2238 _dbus_return_if_fail (_dbus_message_iter_check (real));
2239 _dbus_return_if_fail (sub !=
NULL);
2265 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
NULL);
2335 _dbus_return_if_fail (_dbus_message_iter_check (real));
2336 _dbus_return_if_fail (value !=
NULL);
2340 #ifdef HAVE_UNIX_FD_PASSING
2348 *((
int*) value) = -1;
2354 *((
int*) value) = -1;
2382 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2392 n_elements = total_len / alignment;
2423 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2469 #ifndef DBUS_DISABLE_CHECKS
2472 _dbus_return_if_fail (_dbus_message_iter_check (real));
2473 _dbus_return_if_fail (value !=
NULL);
2499 _dbus_return_if_fail (message !=
NULL);
2500 _dbus_return_if_fail (iter !=
NULL);
2502 _dbus_message_iter_init_common (message, real,
2503 DBUS_MESSAGE_ITER_TYPE_WRITER);
2528 int current_sig_pos;
2545 ¤t_sig, ¤t_sig_pos))
2553 current_sig_pos += 1;
2601 const char *v_STRING;
2661 #ifndef DBUS_DISABLE_CHECKS
2665 if (!_dbus_message_iter_check (iter))
2678 #ifdef HAVE_UNIX_FD_PASSING
2688 if (m->n_unix_fds + n > m->n_unix_fds_allocated)
2694 k = (m->n_unix_fds + n) * 2;
2705 m->n_unix_fds_allocated = k;
2708 return m->unix_fds + m->n_unix_fds;
2739 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2740 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2742 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2744 #ifndef DBUS_DISABLE_CHECKS
2749 const char *
const *string_p;
2754 _dbus_return_val_if_fail (_dbus_check_is_valid_utf8 (*string_p),
FALSE);
2759 _dbus_return_val_if_fail (_dbus_check_is_valid_path (*string_p),
FALSE);
2777 _dbus_return_val_if_fail (*bool_p == 0 || *bool_p == 1,
FALSE);
2787 if (!_dbus_message_iter_open_signature (real))
2792 #ifdef HAVE_UNIX_FD_PASSING
2799 if (!(fds = expand_fd_array(real->
message, 1)))
2806 u = real->
message->n_unix_fds;
2814 real->
message->n_unix_fds += 1;
2841 if (!_dbus_message_iter_close_signature (real))
2891 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2892 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2895 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2896 _dbus_return_val_if_fail (n_elements >= 0,
FALSE);
2897 _dbus_return_val_if_fail (n_elements <=
2901 #ifndef DBUS_DISABLE_CHECKS
2907 for (i = 0; i < n_elements; i++)
2909 _dbus_return_val_if_fail ((*bools)[i] == 0 || (*bools)[i] == 1,
FALSE);
2949 const char *contained_signature,
2958 _dbus_return_val_if_fail (sub !=
NULL,
FALSE);
2961 _dbus_message_real_iter_zero (real_sub);
2963 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2964 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2967 contained_signature ==
NULL) ||
2969 contained_signature ==
NULL) ||
2971 contained_signature !=
NULL) ||
2979 if (contained_signature !=
NULL)
2992 contained_signature_validity = DBUS_VALID_BUT_INCOMPLETE;
2996 contained_signature ==
NULL ||
3000 if (!_dbus_message_iter_open_signature (real))
3006 if (contained_signature !=
NULL)
3024 _dbus_message_iter_abandon_signature (real);
3057 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
3058 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
3059 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub),
FALSE);
3060 _dbus_return_val_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
3064 _dbus_message_real_iter_zero (real_sub);
3066 if (!_dbus_message_iter_close_signature (real))
3090 #ifndef DBUS_DISABLE_CHECKS
3091 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
3092 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3093 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
3094 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3097 _dbus_message_iter_abandon_signature (real);
3098 _dbus_message_real_iter_zero (real_sub);
3155 if (_dbus_message_real_iter_is_zeroed (real) &&
3156 _dbus_message_real_iter_is_zeroed (real_sub))
3159 #ifndef DBUS_DISABLE_CHECKS
3164 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
3165 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3175 if (_dbus_message_real_iter_is_zeroed (real_sub))
3178 #ifndef DBUS_DISABLE_CHECKS
3179 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
3180 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3187 _dbus_message_iter_abandon_signature (real);
3188 _dbus_message_real_iter_zero (real_sub);
3211 _dbus_return_if_fail (message !=
NULL);
3212 _dbus_return_if_fail (!message->
locked);
3229 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3253 _dbus_return_if_fail (message !=
NULL);
3254 _dbus_return_if_fail (!message->
locked);
3271 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3292 const char *object_path)
3294 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3295 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3296 _dbus_return_val_if_fail (object_path ==
NULL ||
3297 _dbus_check_is_valid_path (object_path),
3300 return set_or_delete_string_field (message,
3324 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3347 const char *msg_path;
3350 if (msg_path ==
NULL)
3361 if (strcmp (msg_path, path) == 0)
3393 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3394 _dbus_return_val_if_fail (path !=
NULL,
FALSE);
3425 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3426 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3427 _dbus_return_val_if_fail (iface ==
NULL ||
3428 _dbus_check_is_valid_interface (iface),
3431 return set_or_delete_string_field (message,
3455 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3476 const char *msg_interface;
3479 if (msg_interface ==
NULL)
3490 if (strcmp (msg_interface, iface) == 0)
3513 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3514 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3515 _dbus_return_val_if_fail (member ==
NULL ||
3516 _dbus_check_is_valid_member (member),
3519 return set_or_delete_string_field (message,
3541 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3562 const char *msg_member;
3565 if (msg_member ==
NULL)
3576 if (strcmp (msg_member, member) == 0)
3596 const char *error_name)
3598 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3599 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3600 _dbus_return_val_if_fail (error_name ==
NULL ||
3601 _dbus_check_is_valid_error_name (error_name),
3604 return set_or_delete_string_field (message,
3625 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3650 const char *destination)
3652 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3653 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3654 _dbus_return_val_if_fail (destination ==
NULL ||
3655 _dbus_check_is_valid_bus_name (destination),
3658 return set_or_delete_string_field (message,
3678 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3706 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3707 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3708 _dbus_return_val_if_fail (sender ==
NULL ||
3709 _dbus_check_is_valid_bus_name (sender),
3712 return set_or_delete_string_field (message,
3738 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3772 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3774 get_const_signature (&message->
header, &type_str, &type_pos);
3780 _dbus_message_has_type_interface_member (
DBusMessage *message,
3800 if (n && strcmp (n, member) == 0)
3804 if (n ==
NULL || strcmp (n, iface) == 0)
3830 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3831 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3832 _dbus_return_val_if_fail (method !=
NULL,
FALSE);
3837 return _dbus_message_has_type_interface_member (message,
3856 const char *signal_name)
3858 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3859 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3860 _dbus_return_val_if_fail (signal_name !=
NULL,
FALSE);
3865 return _dbus_message_has_type_interface_member (message,
3867 iface, signal_name);
3882 const char *error_name)
3886 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3887 _dbus_return_val_if_fail (error_name !=
NULL,
FALSE);
3897 if (n && strcmp (n, error_name) == 0)
3919 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3920 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3927 if (s && strcmp (s, name) == 0)
3954 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3955 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3962 if (s && strcmp (s, name) == 0)
3979 const char *signature)
3983 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3984 _dbus_return_val_if_fail (signature !=
NULL,
FALSE);
3991 if (s && strcmp (s, signature) == 0)
4025 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
4026 _dbus_return_val_if_error_is_set (error,
FALSE);
4037 str ?
"%s" :
NULL, str);
4051 #ifdef HAVE_UNIX_FD_PASSING
4054 return message->n_unix_fds > 0;
4078 #define INITIAL_LOADER_DATA_LEN 32
4119 #ifdef HAVE_UNIX_FD_PASSING
4120 loader->unix_fds =
NULL;
4121 loader->n_unix_fds = loader->n_unix_fds_allocated = 0;
4122 loader->unix_fds_outstanding =
FALSE;
4154 #ifdef HAVE_UNIX_FD_PASSING
4155 close_unix_fds(loader->unix_fds, &loader->n_unix_fds);
4193 *buffer = &loader->
data;
4197 if (max_to_read !=
NULL)
4199 #ifdef HAVE_UNIX_FD_PASSING
4203 int fields_array_len;
4209 *may_read_fds =
TRUE;
4211 #ifdef HAVE_UNIX_FD_PASSING
4214 if (loader->n_unix_fds == 0)
4239 *may_read_fds =
FALSE;
4263 needed = header_len + body_len;
4265 *max_to_read = needed - remain;
4266 *may_read_fds =
FALSE;
4272 needed = header_len + body_len;
4301 #ifdef HAVE_UNIX_FD_PASSING
4315 unsigned *max_n_fds)
4335 loader->unix_fds = a;
4339 *fds = loader->unix_fds + loader->n_unix_fds;
4340 *max_n_fds = loader->n_unix_fds_allocated - loader->n_unix_fds;
4342 loader->unix_fds_outstanding =
TRUE;
4362 _dbus_assert(loader->unix_fds + loader->n_unix_fds == fds);
4363 _dbus_assert(loader->n_unix_fds + n_fds <= loader->n_unix_fds_allocated);
4365 loader->n_unix_fds += n_fds;
4366 loader->unix_fds_outstanding =
FALSE;
4368 if (n_fds && loader->unix_fds_change)
4369 loader->unix_fds_change (loader->unix_fds_change_data);
4403 int fields_array_len,
4414 mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED;
4436 _dbus_verbose (
"Failed to load header for new message code %d\n", validity);
4455 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
4457 get_const_signature (&message->
header, &type_str, &type_pos);
4471 _dbus_verbose (
"Failed to validate message body code %d\n", validity);
4486 #ifdef HAVE_UNIX_FD_PASSING
4488 if (n_unix_fds > loader->n_unix_fds)
4490 _dbus_verbose(
"Message contains references to more unix fds than were sent %u != %u\n",
4491 n_unix_fds, loader->n_unix_fds);
4504 message->unix_fds =
_dbus_memdup(loader->unix_fds, n_unix_fds *
sizeof(message->unix_fds[0]));
4505 if (message->unix_fds ==
NULL)
4507 _dbus_verbose (
"Failed to allocate file descriptor array\n");
4512 message->n_unix_fds_allocated = message->n_unix_fds = n_unix_fds;
4513 loader->n_unix_fds -= n_unix_fds;
4514 memmove (loader->unix_fds, loader->unix_fds + n_unix_fds, loader->n_unix_fds * sizeof (loader->unix_fds[0]));
4516 if (loader->unix_fds_change)
4517 loader->unix_fds_change (loader->unix_fds_change_data);
4520 message->unix_fds =
NULL;
4526 _dbus_verbose (
"Hmm, message claims to come with file descriptors "
4527 "but that's not supported on our platform, disconnecting.\n");
4540 _dbus_verbose (
"Failed to append new message to loader queue\n");
4547 (header_len + body_len));
4551 _dbus_verbose (
"Failed to move body into new message\n");
4564 _dbus_verbose (
"Loaded message %p\n", message);
4611 int byte_order, fields_array_len, header_len, body_len;
4626 message = dbus_message_new_empty_header ();
4627 if (message ==
NULL)
4630 if (!load_message (loader, message,
4631 byte_order, fields_array_len,
4632 header_len, body_len))
4646 _dbus_verbose (
"Initial peek at header says we don't have a whole message yet, or data broken with invalid code %d\n",
4761 _dbus_verbose (
"clamping requested max message size %ld to %d\n",
4792 _dbus_verbose (
"clamping requested max message unix_fds %ld to %d\n",
4819 #ifdef HAVE_UNIX_FD_PASSING
4820 return loader->n_unix_fds;
4836 void (* callback) (
void *),
4839 #ifdef HAVE_UNIX_FD_PASSING
4840 loader->unix_fds_change = callback;
4841 loader->unix_fds_change_data = data;
4883 _dbus_return_if_fail (*slot_p >= 0);
4911 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
4912 _dbus_return_val_if_fail (slot >= 0,
FALSE);
4916 slot, data, free_data_func,
4917 &old_free_func, &old_data);
4923 (* old_free_func) (old_data);
4943 _dbus_return_val_if_fail (message !=
NULL,
NULL);
4968 if (strcmp (type_str,
"method_call") == 0)
4970 if (strcmp (type_str,
"method_return") == 0)
4972 else if (strcmp (type_str,
"signal") == 0)
4974 else if (strcmp (type_str,
"error") == 0)
4999 return "method_call";
5001 return "method_return";
5025 char **marshalled_data_p,
5031 _dbus_return_val_if_fail (msg !=
NULL,
FALSE);
5032 _dbus_return_val_if_fail (marshalled_data_p !=
NULL,
FALSE);
5033 _dbus_return_val_if_fail (len_p !=
NULL,
FALSE);
5039 was_locked = msg->
locked;
5094 _dbus_return_val_if_fail (str !=
NULL,
NULL);
5129 _DBUS_SET_OOM (error);
5151 int byte_order, fields_array_len, header_len, body_len;
5165 &validity, &byte_order,
5175 _dbus_assert (have_message || (header_len + body_len) > len);
5176 (void) have_message;
5177 return header_len + body_len;
5210 _dbus_return_if_fail (message !=
NULL);
5211 _dbus_return_if_fail (!message->
locked);
5227 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
5303 &variant_signature, 0, &self->data, 0);
5306 &contained_signature, 0, &variant_writer))
5322 &contained_signature, 1, &array_writer))
5326 &real_array_reader->
u.
reader))
5350 &real_inner_reader->
u.
reader))
5433 _dbus_assert (_dbus_message_iter_append_check (real_writer));
5438 &variant_signature, 0, &self->data, 0);
5441 if (!_dbus_message_iter_open_signature (real_writer))
5447 if (!_dbus_message_iter_close_signature (real_writer))