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
148 dbus_uint32_t dummy3;
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;
278 dbus_uint32_t serial)
280 _dbus_return_if_fail (message !=
NULL);
281 _dbus_return_if_fail (!message->
locked);
315 _dbus_string_get_length (&message->
header.
data) +
316 _dbus_string_get_length (&message->
body);
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 412 _dbus_string_get_length (&message->
body));
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 ())
680 if ((_dbus_string_get_length (&message->
header.
data) +
681 _dbus_string_get_length (&message->
body)) >
690 while (message_cache[i] !=
NULL)
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);
1162 dbus_uint32_t reply_serial)
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;
1187 dbus_uint32_t v_UINT32;
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);
1584 _dbus_string_get_const_data (&str));
1613 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1622 #ifndef DBUS_DISABLE_CHECKS 1633 _dbus_string_get_length (&message->
body)))
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);
1691 dbus_int32_t old_refcount;
1693 _dbus_return_val_if_fail (message !=
NULL,
NULL);
1699 _dbus_message_trace_ref (message, old_refcount, old_refcount + 1,
"ref");
1714 dbus_int32_t old_refcount;
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);
1827 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1829 va_start (var_args, first_arg_type);
1859 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
1861 type = first_arg_type;
1883 element_type = va_arg (var_args,
int);
1885 buf[0] = element_type;
1900 n_elements = va_arg (var_args,
int);
1910 else if (_DBUS_TYPE_IS_STRINGLIKE (element_type))
1912 const char ***value_p;
1917 value_p = va_arg (var_args,
const char***);
1918 n_elements = va_arg (var_args,
int);
1923 while (i < n_elements)
1936 _dbus_warn (
"arrays of %s can't be appended with %s for now",
1938 _DBUS_FUNCTION_NAME);
1946 #ifndef DBUS_DISABLE_CHECKS 1949 _dbus_warn (
"type %s isn't supported yet in %s",
1955 type = va_arg (var_args,
int);
2017 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2018 _dbus_return_val_if_error_is_set (error,
FALSE);
2020 va_start (var_args, first_arg_type);
2045 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2046 _dbus_return_val_if_error_is_set (error,
FALSE);
2053 _dbus_message_iter_init_common (
DBusMessage *message,
2071 4 *
sizeof (
void *) +
sizeof (dbus_uint32_t) + 9 *
sizeof (
int));
2114 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
2115 _dbus_return_val_if_fail (iter !=
NULL,
FALSE);
2117 get_const_signature (&message->
header, &type_str, &type_pos);
2119 _dbus_message_iter_init_common (message, real,
2120 DBUS_MESSAGE_ITER_TYPE_READER);
2142 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2143 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2161 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
FALSE);
2162 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2187 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_READER,
FALSE);
2244 _dbus_return_if_fail (_dbus_message_iter_check (real));
2245 _dbus_return_if_fail (sub !=
NULL);
2271 _dbus_return_val_if_fail (_dbus_message_iter_check (real),
NULL);
2279 _dbus_string_get_const_data (sig) + start,
2341 _dbus_return_if_fail (_dbus_message_iter_check (real));
2342 _dbus_return_if_fail (value !=
NULL);
2346 #ifdef HAVE_UNIX_FD_PASSING 2354 *((
int*) value) = -1;
2360 *((
int*) value) = -1;
2388 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2398 n_elements = total_len / alignment;
2429 _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0);
2475 #ifndef DBUS_DISABLE_CHECKS 2478 _dbus_return_if_fail (_dbus_message_iter_check (real));
2479 _dbus_return_if_fail (value !=
NULL);
2505 _dbus_return_if_fail (message !=
NULL);
2506 _dbus_return_if_fail (iter !=
NULL);
2508 _dbus_message_iter_init_common (message, real,
2509 DBUS_MESSAGE_ITER_TYPE_WRITER);
2518 _dbus_string_get_length (&message->
body));
2534 int current_sig_pos;
2551 ¤t_sig, ¤t_sig_pos))
2558 current_len = _dbus_string_get_byte (current_sig, current_sig_pos);
2559 current_sig_pos += 1;
2590 str, _dbus_string_get_length (str));
2607 const char *v_STRING;
2624 v_STRING = _dbus_string_get_const_data (str);
2667 #ifndef DBUS_DISABLE_CHECKS 2671 if (!_dbus_message_iter_check (iter))
2684 #ifdef HAVE_UNIX_FD_PASSING 2694 if (m->n_unix_fds + n > m->n_unix_fds_allocated)
2700 k = (m->n_unix_fds + n) * 2;
2711 m->n_unix_fds_allocated = k;
2714 return m->unix_fds + m->n_unix_fds;
2745 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2746 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2748 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2750 #ifndef DBUS_DISABLE_CHECKS 2755 const char *
const *string_p;
2760 _dbus_return_val_if_fail (_dbus_check_is_valid_utf8 (*string_p),
FALSE);
2765 _dbus_return_val_if_fail (_dbus_check_is_valid_path (*string_p),
FALSE);
2773 _dbus_string_get_length (&str));
2783 _dbus_return_val_if_fail (*bool_p == 0 || *bool_p == 1,
FALSE);
2793 if (!_dbus_message_iter_open_signature (real))
2798 #ifdef HAVE_UNIX_FD_PASSING 2805 if (!(fds = expand_fd_array(real->
message, 1)))
2812 u = real->
message->n_unix_fds;
2820 real->
message->n_unix_fds += 1;
2847 if (!_dbus_message_iter_close_signature (real))
2897 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2898 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2901 _dbus_return_val_if_fail (value !=
NULL,
FALSE);
2902 _dbus_return_val_if_fail (n_elements >= 0,
FALSE);
2903 _dbus_return_val_if_fail (n_elements <=
2907 #ifndef DBUS_DISABLE_CHECKS 2913 for (i = 0; i < n_elements; i++)
2915 _dbus_return_val_if_fail ((*bools)[i] == 0 || (*bools)[i] == 1,
FALSE);
2955 const char *contained_signature,
2964 _dbus_return_val_if_fail (sub !=
NULL,
FALSE);
2967 _dbus_message_real_iter_zero (real_sub);
2969 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
2970 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
2973 contained_signature ==
NULL) ||
2975 contained_signature ==
NULL) ||
2977 contained_signature !=
NULL) ||
2985 if (contained_signature !=
NULL)
2990 _dbus_string_get_length (&contained_str));
2998 contained_signature_validity = DBUS_VALID_BUT_INCOMPLETE;
3002 contained_signature ==
NULL ||
3006 if (!_dbus_message_iter_open_signature (real))
3012 if (contained_signature !=
NULL)
3030 _dbus_message_iter_abandon_signature (real);
3063 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real),
FALSE);
3064 _dbus_return_val_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
3065 _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub),
FALSE);
3066 _dbus_return_val_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER,
FALSE);
3070 _dbus_message_real_iter_zero (real_sub);
3072 if (!_dbus_message_iter_close_signature (real))
3096 #ifndef DBUS_DISABLE_CHECKS 3097 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
3098 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3099 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
3100 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3103 _dbus_message_iter_abandon_signature (real);
3104 _dbus_message_real_iter_zero (real_sub);
3161 if (_dbus_message_real_iter_is_zeroed (real) &&
3162 _dbus_message_real_iter_is_zeroed (real_sub))
3165 #ifndef DBUS_DISABLE_CHECKS 3170 _dbus_return_if_fail (_dbus_message_iter_append_check (real));
3171 _dbus_return_if_fail (real->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3181 if (_dbus_message_real_iter_is_zeroed (real_sub))
3184 #ifndef DBUS_DISABLE_CHECKS 3185 _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub));
3186 _dbus_return_if_fail (real_sub->
iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER);
3193 _dbus_message_iter_abandon_signature (real);
3194 _dbus_message_real_iter_zero (real_sub);
3217 _dbus_return_if_fail (message !=
NULL);
3218 _dbus_return_if_fail (!message->
locked);
3235 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3259 _dbus_return_if_fail (message !=
NULL);
3260 _dbus_return_if_fail (!message->
locked);
3277 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3298 const char *object_path)
3300 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3301 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3302 _dbus_return_val_if_fail (object_path ==
NULL ||
3303 _dbus_check_is_valid_path (object_path),
3306 return set_or_delete_string_field (message,
3330 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3353 const char *msg_path;
3356 if (msg_path ==
NULL)
3367 if (strcmp (msg_path, path) == 0)
3399 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3400 _dbus_return_val_if_fail (path !=
NULL,
FALSE);
3431 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3432 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3433 _dbus_return_val_if_fail (iface ==
NULL ||
3434 _dbus_check_is_valid_interface (iface),
3437 return set_or_delete_string_field (message,
3461 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3482 const char *msg_interface;
3485 if (msg_interface ==
NULL)
3496 if (strcmp (msg_interface, iface) == 0)
3519 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3520 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3521 _dbus_return_val_if_fail (member ==
NULL ||
3522 _dbus_check_is_valid_member (member),
3525 return set_or_delete_string_field (message,
3547 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3568 const char *msg_member;
3571 if (msg_member ==
NULL)
3582 if (strcmp (msg_member, member) == 0)
3602 const char *error_name)
3604 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3605 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3606 _dbus_return_val_if_fail (error_name ==
NULL ||
3607 _dbus_check_is_valid_error_name (error_name),
3610 return set_or_delete_string_field (message,
3631 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3656 const char *destination)
3658 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3659 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3660 _dbus_return_val_if_fail (destination ==
NULL ||
3661 _dbus_check_is_valid_bus_name (destination),
3664 return set_or_delete_string_field (message,
3684 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3712 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3713 _dbus_return_val_if_fail (!message->
locked,
FALSE);
3714 _dbus_return_val_if_fail (sender ==
NULL ||
3715 _dbus_check_is_valid_bus_name (sender),
3718 return set_or_delete_string_field (message,
3744 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3778 _dbus_return_val_if_fail (message !=
NULL,
NULL);
3780 get_const_signature (&message->
header, &type_str, &type_pos);
3782 return _dbus_string_get_const_data_len (type_str, type_pos, 0);
3786 _dbus_message_has_type_interface_member (
DBusMessage *message,
3806 if (n && strcmp (n, member) == 0)
3810 if (n ==
NULL || strcmp (n, iface) == 0)
3836 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3837 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3838 _dbus_return_val_if_fail (method !=
NULL,
FALSE);
3843 return _dbus_message_has_type_interface_member (message,
3862 const char *signal_name)
3864 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3865 _dbus_return_val_if_fail (iface !=
NULL,
FALSE);
3866 _dbus_return_val_if_fail (signal_name !=
NULL,
FALSE);
3871 return _dbus_message_has_type_interface_member (message,
3873 iface, signal_name);
3888 const char *error_name)
3892 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3893 _dbus_return_val_if_fail (error_name !=
NULL,
FALSE);
3903 if (n && strcmp (n, error_name) == 0)
3925 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3926 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3933 if (s && strcmp (s, name) == 0)
3960 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3961 _dbus_return_val_if_fail (name !=
NULL,
FALSE);
3968 if (s && strcmp (s, name) == 0)
3985 const char *signature)
3989 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
3990 _dbus_return_val_if_fail (signature !=
NULL,
FALSE);
3997 if (s && strcmp (s, signature) == 0)
4031 _dbus_return_val_if_fail (message !=
NULL,
FALSE);
4032 _dbus_return_val_if_error_is_set (error,
FALSE);
4043 str ?
"%s" :
NULL, str);
4057 #ifdef HAVE_UNIX_FD_PASSING 4060 return message->n_unix_fds > 0;
4084 #define INITIAL_LOADER_DATA_LEN 32 4125 #ifdef HAVE_UNIX_FD_PASSING 4126 loader->unix_fds =
NULL;
4127 loader->n_unix_fds = loader->n_unix_fds_allocated = 0;
4128 loader->unix_fds_outstanding =
FALSE;
4160 #ifdef HAVE_UNIX_FD_PASSING 4161 close_unix_fds(loader->unix_fds, &loader->n_unix_fds);
4199 *buffer = &loader->
data;
4203 if (max_to_read !=
NULL)
4205 #ifdef HAVE_UNIX_FD_PASSING 4209 int fields_array_len;
4215 *may_read_fds =
TRUE;
4217 #ifdef HAVE_UNIX_FD_PASSING 4220 if (loader->n_unix_fds == 0)
4231 remain = _dbus_string_get_length (&loader->
data);
4245 *may_read_fds =
FALSE;
4269 needed = header_len + body_len;
4271 *max_to_read = needed - remain;
4272 *may_read_fds =
FALSE;
4278 needed = header_len + body_len;
4307 #ifdef HAVE_UNIX_FD_PASSING 4321 unsigned *max_n_fds)
4341 loader->unix_fds = a;
4345 *fds = loader->unix_fds + loader->n_unix_fds;
4346 *max_n_fds = loader->n_unix_fds_allocated - loader->n_unix_fds;
4348 loader->unix_fds_outstanding =
TRUE;
4368 _dbus_assert(loader->unix_fds + loader->n_unix_fds == fds);
4369 _dbus_assert(loader->n_unix_fds + n_fds <= loader->n_unix_fds_allocated);
4371 loader->n_unix_fds += n_fds;
4372 loader->unix_fds_outstanding =
FALSE;
4374 if (n_fds && loader->unix_fds_change)
4375 loader->unix_fds_change (loader->unix_fds_change_data);
4409 int fields_array_len,
4418 dbus_uint32_t n_unix_fds = 0;
4420 mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED;
4430 _dbus_assert ((header_len + body_len) <= _dbus_string_get_length (&loader->
data));
4440 _dbus_string_get_length (&loader->
data)))
4442 _dbus_verbose (
"Failed to load header for new message code %d\n", validity);
4461 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
4463 get_const_signature (&message->
header, &type_str, &type_pos);
4477 _dbus_verbose (
"Failed to validate message body code %d\n", validity);
4492 #ifdef HAVE_UNIX_FD_PASSING 4494 if (n_unix_fds > loader->n_unix_fds)
4496 _dbus_verbose(
"Message contains references to more unix fds than were sent %u != %u\n",
4497 n_unix_fds, loader->n_unix_fds);