1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 25a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington/* dbus-message.c DBusMessage object 35a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 49c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Copyright (C) 2002, 2003, 2004, 2005 Red Hat Inc. 51b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * Copyright (C) 2002, 2003 CodeFactory AB 65a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 89c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 95a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * This program is free software; you can redistribute it and/or modify 105a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * it under the terms of the GNU General Public License as published by 115a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 125a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * (at your option) any later version. 135a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 145a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * This program is distributed in the hope that it will be useful, 155a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 165a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 175a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * GNU General Public License for more details. 189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 195a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * You should have received a copy of the GNU General Public License 205a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * along with this program; if not, write to the Free Software 215baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 225a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington * 235a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington */ 245a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington 25dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 26041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-internals.h" 279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-recursive.h" 289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-validate.h" 29fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington#include "dbus-marshal-byteswap.h" 309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-header.h" 3154a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters#include "dbus-signature.h" 327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include "dbus-message-private.h" 339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-object-tree.h" 34041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-memory.h" 35041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-list.h" 367ce7502e1ae23766ba40105327de787c2d1cef9dHavoc Pennington#include "dbus-threads-internal.h" 37a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 38a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#include "dbus-sysdeps-unix.h" 39a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 40a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 41041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include <string.h> 425a6adeee6e20252f8f2b01349b7e95ee6e99e4ffHavoc Pennington 43ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonstatic void dbus_message_finalize (DBusMessage *message); 44ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 4593f222c1d8ed748994f74662671d003495b16d43Havoc Pennington/** 4655de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * @defgroup DBusMessageInternals DBusMessage implementation details 4755de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * @ingroup DBusInternals 4855de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * @brief DBusMessage private implementation details. 4993f222c1d8ed748994f74662671d003495b16d43Havoc Pennington * 5055de3878c42f8254bac653b7c1998e79a1658ae2Havoc Pennington * The guts of DBusMessage and its methods. 5193f222c1d8ed748994f74662671d003495b16d43Havoc Pennington * 5293f222c1d8ed748994f74662671d003495b16d43Havoc Pennington * @{ 5393f222c1d8ed748994f74662671d003495b16d43Havoc Pennington */ 5493f222c1d8ed748994f74662671d003495b16d43Havoc Pennington 559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* Not thread locked, but strictly const/read-only so should be OK 5685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 5731988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** An static string representing an empty signature */ 589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_DBUS_STRING_DEFINE_STATIC(_dbus_empty_signature_str, ""); 59daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin 609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* these have wacky values to help trap uninitialized iterators; 619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * but has to fit in 3 bits 629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 63c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssonenum { 649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_READER = 3, 659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_WRITER = 7 66c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson}; 67c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 683df260c07102745c5606c313af862558f105f83eHavoc Pennington/** typedef for internals of message iterator */ 69c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssontypedef struct DBusMessageRealIter DBusMessageRealIter; 70c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 71993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington/** 72993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington * @brief Internals of DBusMessageIter 739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 74993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington * Object representing a position in a message. All fields are internal. 75993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington */ 76c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssonstruct DBusMessageRealIter 771b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 781b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson DBusMessage *message; /**< Message used */ 799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t changed_stamp : CHANGED_STAMP_BITS; /**< stamp to detect invalid iters */ 809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t iter_type : 3; /**< whether this is a reader or writer iter */ 819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t sig_refcount : 8; /**< depth of open_signature() */ 829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington union 839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 8431988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington DBusTypeWriter writer; /**< writer */ 8531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington DBusTypeReader reader; /**< reader */ 8631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington } u; /**< the type writer or reader that does all the work */ 871b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson}; 881b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 89fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtonstatic void 90fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtonget_const_signature (DBusHeader *header, 91fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington const DBusString **type_str_p, 92fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington int *type_pos_p) 93fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington{ 94fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington if (_dbus_header_get_field_raw (header, 95fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 96fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington type_str_p, 97fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington type_pos_p)) 98fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington { 99fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington *type_pos_p += 1; /* skip the signature length which is 1 byte */ 100fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington } 101fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington else 102fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington { 103fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington *type_str_p = &_dbus_empty_signature_str; 104fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington *type_pos_p = 0; 105fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington } 106fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington} 107fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 108fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington/** 109fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * Swaps the message to compiler byte order if required 110fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * 111fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * @param message the message 112fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington */ 113fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Penningtonstatic void 114fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington_dbus_message_byteswap (DBusMessage *message) 115fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington{ 116fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington const DBusString *type_str; 117fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington int type_pos; 118fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 119fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington if (message->byte_order == DBUS_COMPILER_BYTE_ORDER) 120fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington return; 121fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 122fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_verbose ("Swapping message into compiler byte order\n"); 123fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 124fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 125fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 126fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_marshal_byteswap (type_str, type_pos, 127fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington message->byte_order, 128fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington DBUS_COMPILER_BYTE_ORDER, 129fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington &message->body, 0); 130fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 131fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington message->byte_order = DBUS_COMPILER_BYTE_ORDER; 132fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 133fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_header_byteswap (&message->header, DBUS_COMPILER_BYTE_ORDER); 134fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington} 135fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 13615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** byte-swap the message if it doesn't match our byte order. 13715ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * Called only when we need the message in our own byte order, 13815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * normally when reading arrays of integers or doubles. 13915ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * Otherwise should not be called since it would do needless 14015ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * work. 14115ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */ 142fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington#define ensure_byte_order(message) \ 143fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington if (message->byte_order != DBUS_COMPILER_BYTE_ORDER) \ 144fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington _dbus_message_byteswap (message) 145fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 146041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 147041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Gets the data to be sent over the network for this message. 148041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * The header and then the body should be written out. 149041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This function is guaranteed to always return the same 15016a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * data once a message is locked (with dbus_message_lock()). 151041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 152041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param message the message. 153041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param header return location for message header data. 154041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param body return location for message body data. 155041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 156041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 157041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_get_network_data (DBusMessage *message, 158271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington const DBusString **header, 159271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington const DBusString **body) 160041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 161041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (message->locked); 1629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 1639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *header = &message->header.data; 164271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington *body = &message->body; 165041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 166041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 1679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 168a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Gets the unix fds to be sent over the network for this message. 169a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * This function is guaranteed to always return the same data once a 170a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * message is locked (with dbus_message_lock()). 171a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 172a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param message the message. 173a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param fds return location of unix fd array 174a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param n_fds return number of entries in array 175a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */ 176a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringvoid _dbus_message_get_unix_fds(DBusMessage *message, 177a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering const int **fds, 178a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering unsigned *n_fds) 179a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 180a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert (message->locked); 181a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 182a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 183a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *fds = message->unix_fds; 184a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *n_fds = message->n_unix_fds; 185a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 186a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *fds = NULL; 187a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *n_fds = 0; 188a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 189a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 190a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 191a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/** 1929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the serial number of a message. 1939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * This can only be done once on a message. 1949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 19516a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * DBusConnection will automatically set the serial to an appropriate value 19616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * when the message is sent; this function is only needed when encapsulating 19716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * messages in another protocol, or otherwise bypassing DBusConnection. 19816a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * 1999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 2009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param serial the serial 2019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 20216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachancevoid 20316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachancedbus_message_set_serial (DBusMessage *message, 20416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance dbus_uint32_t serial) 205fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington{ 20616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance _dbus_return_if_fail (message != NULL); 20716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance _dbus_return_if_fail (!message->locked); 208fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington 2099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_set_serial (&message->header, serial); 210fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington} 211fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington 2129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 213bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * Adds a counter to be incremented immediately with the size/unix fds 214bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * of this message, and decremented by the size/unix fds of this 215bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * message when this message if finalized. The link contains a 216bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * counter with its refcount already incremented, but the counter 217bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * itself not incremented. Ownership of link and counter refcount is 218bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * passed to the message. 2199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 2219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param link link with counter as data 2229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 224bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_message_add_counter_link (DBusMessage *message, 225bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering DBusList *link) 2267ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington{ 2279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* right now we don't recompute the delta when message 2289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * size changes, and that's OK for current purposes 2299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * I think, but could be important to change later. 2309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Do recompute it whenever there are no outstanding counters, 2319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * since it's basically free. 2329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 233bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering if (message->counters == NULL) 2349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 2359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counter_delta = 2369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->header.data) + 2379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body); 2387ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 239bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#ifdef HAVE_UNIX_FD_PASSING 240bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering message->unix_fd_counter_delta = message->n_unix_fds; 241bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#endif 242bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 2439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#if 0 2449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose ("message has size %ld\n", 2459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counter_delta); 2469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 2479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2487ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 249bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_list_append_link (&message->counters, link); 2507ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 251bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_adjust_size (link->data, message->size_counter_delta); 2527ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 253bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#ifdef HAVE_UNIX_FD_PASSING 254bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_adjust_unix_fd (link->data, message->unix_fd_counter_delta); 255bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#endif 256dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington} 257dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 2589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 259bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * Adds a counter to be incremented immediately with the size/unix fds 260bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * of this message, and decremented by the size/unix fds of this 261bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * message when this message if finalized. 2629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 2649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param counter the counter 2659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 2669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 268bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_message_add_counter (DBusMessage *message, 269bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering DBusCounter *counter) 270dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington{ 2719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusList *link; 2729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington link = _dbus_list_alloc_link (counter); 2749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (link == NULL) 2759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 2769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_counter_ref (counter); 278bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_message_add_counter_link (message, link); 2799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 281dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington} 282dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 2839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 284bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * Removes a counter tracking the size/unix fds of this message, and 285bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering * decrements the counter by the size/unix fds of this message. 2869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 2889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param link_return return the link used 2899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param counter the counter 2909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 2919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 292bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering_dbus_message_remove_counter (DBusMessage *message, 293bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering DBusCounter *counter, 294bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering DBusList **link_return) 29550c25505f62786756519ef1e194883360eda82e0Havoc Pennington{ 2969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusList *link; 2977265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington 298bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering link = _dbus_list_find_last (&message->counters, 2999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington counter); 3009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (link != NULL); 3017265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington 302bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_list_unlink (&message->counters, 3039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington link); 3049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (link_return) 3059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *link_return = link; 3069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 3079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_free_link (link); 30850c25505f62786756519ef1e194883360eda82e0Havoc Pennington 309bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_adjust_size (counter, - message->size_counter_delta); 310bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering 311bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#ifdef HAVE_UNIX_FD_PASSING 312bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_adjust_unix_fd (counter, - message->unix_fd_counter_delta); 313bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#endif 31450c25505f62786756519ef1e194883360eda82e0Havoc Pennington 3159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_counter_unref (counter); 31650c25505f62786756519ef1e194883360eda82e0Havoc Pennington} 31750c25505f62786756519ef1e194883360eda82e0Havoc Pennington 3189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 3199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Locks a message. Allows checking that applications don't keep a 3209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * reference to a message in the outgoing queue and change it 3219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * underneath us. Messages are locked when they enter the outgoing 3229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * queue (dbus_connection_send_message()), and the library complains 32316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * if the message is modified while locked. This function may also 32416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * called externally, for applications wrapping D-Bus in another protocol. 3259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message to lock. 3279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 3289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 32916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachancedbus_message_lock (DBusMessage *message) 3305fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington{ 3319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!message->locked) 3329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 3339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_update_lengths (&message->header, 3349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body)); 3355fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington 3369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* must have a signature if you have a body */ 3379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->body) == 0 || 3389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_get_signature (message) != NULL); 3395fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington 3409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->locked = TRUE; 3415fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington } 3425fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington} 3435fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington 34450c25505f62786756519ef1e194883360eda82e0Havoc Penningtonstatic dbus_bool_t 3459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonset_or_delete_string_field (DBusMessage *message, 3469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int field, 3479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int typecode, 3489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *value) 34950c25505f62786756519ef1e194883360eda82e0Havoc Pennington{ 3509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (value == NULL) 3519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_delete_field (&message->header, field); 3529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 3539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_set_field_basic (&message->header, 3549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington field, 3559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington typecode, 3569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &value); 3579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 3587ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 3599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#if 0 3609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* Probably we don't need to use this */ 3619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 3629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the signature of the message, i.e. the arguments in the 3639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message payload. The signature includes only "in" arguments for 3649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for 3659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from 3669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * what you might expect (it does not include the signature of the 3679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * entire C++-style method). 3689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The signature is a string made up of type codes such as 3709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32. The string is terminated with nul (nul is also 3719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the value of #DBUS_TYPE_INVALID). The macros such as 3729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32 evaluate to integers; to assemble a signature you 3739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * may find it useful to use the string forms, such as 3749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32_AS_STRING. 3759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * An "unset" or #NULL signature is considered the same as an empty 3779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature. In fact dbus_message_get_signature() will never return 3789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #NULL. 3799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param signature the type signature or #NULL to unset 3829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 3839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 384dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Penningtonstatic dbus_bool_t 3859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_set_signature (DBusMessage *message, 3869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *signature) 387dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington{ 3889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 3899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 3909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (signature == NULL || 3919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_signature (signature)); 3929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* can't delete the signature if you have a message body */ 3939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_string_get_length (&message->body) == 0 || 3949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington signature != NULL); 395dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 3969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 3979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 3989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_SIGNATURE, 3999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington signature); 4009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 4019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 402dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington 4039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* Message Cache 4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * We cache some DBusMessage to reduce the overhead of allocating 4069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * them. In my profiling this consistently made about an 8% 4079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * difference. It avoids the malloc for the message, the malloc for 4089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the slot list, the malloc for the header string and body string, 4099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and the associated free() calls. It does introduce another global 4109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * lock which could be a performance issue in certain cases. 4119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * For the echo client/server the round trip time goes from around 4139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * .000077 to .000069 with the message cache on my laptop. The sysprof 4149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * change is as follows (numbers are cumulative percentage): 4159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * with message cache implemented as array as it is now (0.000069 per): 4179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * new_empty_header 1.46 4189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_lock 0.56 # i.e. _DBUS_LOCK(message_cache) 4199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_unlock 0.25 4209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * self 0.41 4219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * unref 2.24 4229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * self 0.68 4239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * list_clear 0.43 4249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_lock 0.33 # i.e. _DBUS_LOCK(message_cache) 4259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mutex_unlock 0.25 4269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * with message cache implemented as list (0.000070 per roundtrip): 4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * new_empty_header 2.72 4299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * list_pop_first 1.88 4309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * unref 3.3 4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * list_prepend 1.63 4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * without cache (0.000077 per roundtrip): 4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * new_empty_header 6.7 4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * string_init_preallocated 3.43 4369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_malloc 2.43 4379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_malloc0 2.59 4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * unref 4.02 4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * string_free 1.82 4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_free 1.63 4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_free 0.71 4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * If you implement the message_cache with a list, the primary reason 4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it's slower is that you add another thread lock (on the DBusList 4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * mempool). 4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 4489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 44931988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** Avoid caching huge messages */ 450c9c16dd08766d3ad25a362ae335e64f1ca907373Ross Burton#define MAX_MESSAGE_SIZE_TO_CACHE 10 * _DBUS_ONE_KILOBYTE 45131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington 45231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** Avoid caching too many messages */ 4539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#define MAX_MESSAGE_CACHE_SIZE 5 4549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (message_cache); 4569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusMessage *message_cache[MAX_MESSAGE_CACHE_SIZE]; 4579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic int message_cache_count = 0; 4589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t message_cache_shutdown_registered = FALSE; 4599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 460e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Penningtonstatic void 4619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_cache_shutdown (void *data) 462e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington{ 463e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington int i; 4649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_LOCK (message_cache); 4669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 467e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington i = 0; 4689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < MAX_MESSAGE_CACHE_SIZE) 46946c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin { 4709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache[i]) 4719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_finalize (message_cache[i]); 4729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 473e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington ++i; 47446c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin } 4759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_count = 0; 4779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_shutdown_registered = FALSE; 4789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_UNLOCK (message_cache); 4808ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington} 4818ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington 4829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 4839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Tries to get a message from the message cache. The retrieved 4849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message will have junk in it, so it still needs to be cleared out 4859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * in dbus_message_new_empty_header() 4869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the message, or #NULL if none cached 488e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington */ 4899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusMessage* 4909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_cached (void) 4918ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington{ 4929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 4939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int i; 4949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = NULL; 4969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_LOCK (message_cache); 4989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count >= 0); 5008ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington 5019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache_count == 0) 50246c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin { 5039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_UNLOCK (message_cache); 5049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 50546c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin } 5069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* This is not necessarily true unless count > 0, and 5089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message_cache is uninitialized until the shutdown is 5099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * registered 510e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington */ 5119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_shutdown_registered); 51246c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin 5139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 5149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < MAX_MESSAGE_CACHE_SIZE) 515e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington { 5169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache[i]) 517e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington { 5189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = message_cache[i]; 5199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache[i] = NULL; 5209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_count -= 1; 5219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington break; 522e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington } 5239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 524e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington } 5259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count >= 0); 5269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (i < MAX_MESSAGE_CACHE_SIZE); 5279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message != NULL); 52846c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin 5299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message->refcount.value == 0); 530bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_assert (message->counters == NULL); 5318d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington 5328d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington _DBUS_UNLOCK (message_cache); 5339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 5349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 535e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington} 53646c072e1136ca101aefd5fdae35c457899d55bbbMark McLoughlin 537a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 538a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringstatic void 539a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringclose_unix_fds(int *fds, unsigned *n_fds) 540a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 541a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBusError e; 542a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int i; 543a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 544a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (*n_fds <= 0) 545a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return; 546a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 547a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_error_init(&e); 548a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 549a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering for (i = 0; i < *n_fds; i++) 550a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 551a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (!_dbus_close(fds[i], &e)) 552a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 553a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_warn("Failed to close file descriptor: %s\n", e.message); 554a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_error_free(&e); 555a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 556a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 557a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 558a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *n_fds = 0; 559a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 560a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* We don't free the array here, in case we can recycle it later */ 561a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 562a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 563a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 564ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonstatic void 565bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poetteringfree_counter (void *element, 566bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering void *data) 567ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 568ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBusCounter *counter = element; 569ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBusMessage *message = data; 570ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 571bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_adjust_size (counter, - message->size_counter_delta); 572bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#ifdef HAVE_UNIX_FD_PASSING 573bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_counter_adjust_unix_fd (counter, - message->unix_fd_counter_delta); 574bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering#endif 575ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 576ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_counter_unref (counter); 577ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 578ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 5799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 5809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Tries to cache a message, otherwise finalize it. 5819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 5829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 5839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 5849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic void 5859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_cache_or_finalize (DBusMessage *message) 586e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington{ 5879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t was_cached; 5889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int i; 5899d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 5909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message->refcount.value == 0); 591e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington 5929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* This calls application code and has to be done first thing 5939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * without holding the lock 5949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 5959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_data_slot_list_clear (&message->slot_list); 596e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington 597bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_list_foreach (&message->counters, 598bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering free_counter, message); 599bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_list_clear (&message->counters); 6009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 601a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 602a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering close_unix_fds(message->unix_fds, &message->n_unix_fds); 603a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 6049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington was_cached = FALSE; 6069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _DBUS_LOCK (message_cache); 6089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!message_cache_shutdown_registered) 610e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington { 6119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count == 0); 6129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_register_shutdown_func (dbus_message_cache_shutdown, NULL)) 6149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto out; 6159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 6179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < MAX_MESSAGE_CACHE_SIZE) 6189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 6199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache[i] = NULL; 6209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 6219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 6229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_shutdown_registered = TRUE; 624e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington } 625e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington 6269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache_count >= 0); 6279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if ((_dbus_string_get_length (&message->header.data) + 6299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body)) > 6309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington MAX_MESSAGE_SIZE_TO_CACHE) 6319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto out; 6329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message_cache_count >= MAX_MESSAGE_CACHE_SIZE) 6349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto out; 6359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* Find empty slot */ 6379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 6389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (message_cache[i] != NULL) 6399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 6409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (i < MAX_MESSAGE_CACHE_SIZE); 6429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (message_cache[i] == NULL); 6449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache[i] = message; 6459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_cache_count += 1; 6469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington was_cached = TRUE; 64798ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 64898ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington message->in_cache = TRUE; 64998ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#endif 6509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 6519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington out: 65298ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_assert (message->refcount.value == 0); 65398ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington 6548d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington _DBUS_UNLOCK (message_cache); 6558d939deebdce20d5609446c8839de8b3a20e5247Havoc Pennington 6569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!was_cached) 6579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_finalize (message); 6588ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington} 6598ca39d9925df6cce64688a2315a2a424beb7bd55Havoc Pennington 660174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 661174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtonstatic dbus_bool_t 662174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_dbus_message_iter_check (DBusMessageRealIter *iter) 663174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{ 664174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter == NULL) 665174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 666174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message iterator is NULL\n"); 667174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 668174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 669174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 670174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->iter_type == DBUS_MESSAGE_ITER_TYPE_READER) 671174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 672174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->u.reader.byte_order != iter->message->byte_order) 673174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 674174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message changed byte order since iterator was created\n"); 675174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 676174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 677174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington /* because we swap the message into compiler order when you init an iter */ 678174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_assert (iter->u.reader.byte_order == DBUS_COMPILER_BYTE_ORDER); 679174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 680174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington else if (iter->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER) 681174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 682174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->u.writer.byte_order != iter->message->byte_order) 683174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 684174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message changed byte order since append iterator was created\n"); 685174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 686174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 687174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington /* because we swap the message into compiler order when you init an iter */ 688174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_assert (iter->u.writer.byte_order == DBUS_COMPILER_BYTE_ORDER); 689174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 690174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington else 691174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 692174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message iterator looks uninitialized or corrupted\n"); 693174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 694174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 695174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 696174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington if (iter->changed_stamp != iter->message->changed_stamp) 697174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington { 698174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington _dbus_warn_check_failed ("dbus message iterator invalid because the message has been modified (or perhaps the iterator is just uninitialized)\n"); 699174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return FALSE; 700174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington } 701174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 702174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington return TRUE; 703174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington} 704174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#endif /* DBUS_DISABLE_CHECKS */ 705174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington 706afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington/** 707afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Implementation of the varargs arg-getting functions. 708afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_get_args() is the place to go for complete 709afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * documentation. 710afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 711a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @todo This may leak memory and file descriptors if parsing fails. See #21259 712a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 713afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @see dbus_message_get_args 714afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param iter the message iter 715afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error error to be filled in 716afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param first_arg_type type of the first argument 717afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param var_args return location for first argument, followed by list of type/location pairs 718afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #FALSE if error was set 719afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington */ 720afa4ffbd852686633086569cd34942917c5c49afHavoc Penningtondbus_bool_t 721afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington_dbus_message_iter_get_args_valist (DBusMessageIter *iter, 722afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusError *error, 723afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int first_arg_type, 724afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington va_list var_args) 725afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington{ 726afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 727afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int spec_type, msg_type, i; 728afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_bool_t retval; 729afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 730afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (_dbus_message_iter_check (real)); 731afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 732afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington retval = FALSE; 733afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 734afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_type = first_arg_type; 735afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i = 0; 736afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 737afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington while (spec_type != DBUS_TYPE_INVALID) 738afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 739afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington msg_type = dbus_message_iter_get_arg_type (iter); 740afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 741afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (msg_type != spec_type) 742afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 743afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 744afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "Argument %d is specified to be of type \"%s\", but " 745afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "is actually of type \"%s\"\n", i, 746afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (spec_type), 747afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (msg_type)); 748afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 749afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 750afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 751afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 752a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (spec_type == DBUS_TYPE_UNIX_FD) 753a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 754a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 755a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBusBasicValue idx; 756a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int *pfd, nfd; 757a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 758a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering pfd = va_arg (var_args, int*); 759a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert(pfd); 760a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 761a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_type_reader_read_basic(&real->u.reader, &idx); 762a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 763a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (idx.u32 >= real->message->n_unix_fds) 764a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 765a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_set_error (error, DBUS_ERROR_INCONSISTENT_MESSAGE, 766a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering "Message refers to file descriptor at index %i," 767a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering "but has only %i descriptors attached.\n", 768a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering idx.u32, 769a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering real->message->n_unix_fds); 770a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto out; 771a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 772a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 773a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if ((nfd = _dbus_dup(real->message->unix_fds[idx.u32], error)) < 0) 774a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto out; 775a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 776a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *pfd = nfd; 777a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 778a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED, 779a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering "Platform does not support file desciptor passing.\n"); 780a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto out; 781a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 782a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 783a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering else if (dbus_type_is_basic (spec_type)) 784afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 785afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusBasicValue *ptr; 786afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 787afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr = va_arg (var_args, DBusBasicValue*); 788afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 789afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (ptr != NULL); 790afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 791afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_read_basic (&real->u.reader, 792afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr); 793afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 794afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else if (spec_type == DBUS_TYPE_ARRAY) 795afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 796afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int element_type; 797afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int spec_element_type; 798afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington const DBusBasicValue **ptr; 799afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int *n_elements_p; 800afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington DBusTypeReader array; 801afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 802afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_element_type = va_arg (var_args, int); 803afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington element_type = _dbus_type_reader_get_element_type (&real->u.reader); 804afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 805afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (spec_element_type != element_type) 806afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 807afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 808afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "Argument %d is specified to be an array of \"%s\", but " 809afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "is actually an array of \"%s\"\n", 810afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i, 811afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (spec_element_type), 812afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_to_string (element_type)); 813afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 814afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 815afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 816afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 817a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (dbus_type_is_fixed (spec_element_type) && 818a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering element_type != DBUS_TYPE_UNIX_FD) 819afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 820afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ptr = va_arg (var_args, const DBusBasicValue**); 821afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington n_elements_p = va_arg (var_args, int*); 822afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 823afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (ptr != NULL); 824afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (n_elements_p != NULL); 825afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 826afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_recurse (&real->u.reader, &array); 827afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 828afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_read_fixed_multi (&array, 8292d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) ptr, n_elements_p); 830afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 831afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else if (spec_element_type == DBUS_TYPE_STRING || 832afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_element_type == DBUS_TYPE_SIGNATURE || 833afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_element_type == DBUS_TYPE_OBJECT_PATH) 834afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 835afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington char ***str_array_p; 836afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington int n_elements; 837afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington char **str_array; 838afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 839afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington str_array_p = va_arg (var_args, char***); 840afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington n_elements_p = va_arg (var_args, int*); 841afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 842afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (str_array_p != NULL); 843afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (n_elements_p != NULL); 844afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 845afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington /* Count elements in the array */ 846afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_recurse (&real->u.reader, &array); 847afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 848afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington n_elements = 0; 849afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington while (_dbus_type_reader_get_current_type (&array) != DBUS_TYPE_INVALID) 850afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 851afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ++n_elements; 852afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_next (&array); 853afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 854afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 855afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington str_array = dbus_new0 (char*, n_elements + 1); 856afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (str_array == NULL) 857afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 858afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_SET_OOM (error); 859afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 860afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 861afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 862afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington /* Now go through and dup each string */ 863afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_recurse (&real->u.reader, &array); 864afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 865afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i = 0; 866afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington while (i < n_elements) 867afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 868afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington const char *s; 869afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_type_reader_read_basic (&array, 8702d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &s); 871afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 872afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington str_array[i] = _dbus_strdup (s); 873afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (str_array[i] == NULL) 874afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 875afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_free_string_array (str_array); 876afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_SET_OOM (error); 877afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 878afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 879afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 880afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington ++i; 881afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 882afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (!_dbus_type_reader_next (&array)) 883afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (i == n_elements); 884afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 885afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 886afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (_dbus_type_reader_get_current_type (&array) == DBUS_TYPE_INVALID); 887afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (i == n_elements); 888afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_assert (str_array[i] == NULL); 889afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 890afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *str_array_p = str_array; 891afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *n_elements_p = n_elements; 892afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 893afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 894afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else 895afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 896afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_warn ("you can't read arrays of container types (struct, variant, array) with %s for now\n", 897afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_FUNCTION_NAME); 898afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 899afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 900afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#endif 901afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 902afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 903afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington else 904afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 905afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_warn ("you can only read arrays and basic types with %s for now\n", 906afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _DBUS_FUNCTION_NAME); 907afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 908afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 909afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington#endif 910afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 911afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington spec_type = va_arg (var_args, int); 912afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington if (!_dbus_type_reader_next (&real->u.reader) && spec_type != DBUS_TYPE_INVALID) 913afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington { 914afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 915afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington "Message has only %d arguments, but more were expected", i); 916afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington goto out; 917afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 918afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 919afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington i++; 920afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington } 921afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 922afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington retval = TRUE; 923afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 924afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington out: 925afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 926afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington return retval; 927afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington} 928afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington 929ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** @} */ 930ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 931ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 932ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @defgroup DBusMessage DBusMessage 933ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @ingroup DBus 934afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @brief Message to be sent or received over a #DBusConnection. 935ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 936ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * A DBusMessage is the most basic unit of communication over a 937ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * DBusConnection. A DBusConnection represents a stream of messages 938ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * received from a remote application, and a stream of messages 939ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * sent to a remote application. 940ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 941afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * A message has a message type, returned from 942afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_get_type(). This indicates whether the message is a 943afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * method call, a reply to a method call, a signal, or an error reply. 944afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 945afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * A message has header fields such as the sender, destination, method 946afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * or signal name, and so forth. DBusMessage has accessor functions for 947afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * these, such as dbus_message_get_member(). 948afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 949afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Convenience functions dbus_message_is_method_call(), dbus_message_is_signal(), 950afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * and dbus_message_is_error() check several header fields at once and are 951afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * slightly more efficient than checking the header fields with individual 952afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * accessor functions. 953afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 954afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Finally, a message has arguments. The number and types of arguments 955afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * are in the message's signature header field (accessed with 956afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_get_signature()). Simple argument values are usually 957afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * retrieved with dbus_message_get_args() but more complex values such 958afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * as structs may require the use of #DBusMessageIter. 959afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 960afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The D-Bus specification goes into some more detail about header fields and 961afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message types. 962afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 963ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @{ 964ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 965ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 966ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 967ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @typedef DBusMessage 968ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 969ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Opaque data type representing a message received from or to be 970ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * sent to another application. 971ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 972ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 973ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 974ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Returns the serial of a message or 0 if none has been specified. 975ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * The message's serial number is provided by the application sending 976afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the message and is used to identify replies to this message. 977afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 978afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * All messages received on a connection will have a serial provided 979afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * by the remote application. 980afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 981afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * For messages you're sending, dbus_connection_send() will assign a 982afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * serial and return it to you. 983ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 984ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @param message the message 985afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns the serial 986ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 987ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_uint32_t 988ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_get_serial (DBusMessage *message) 989ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 990ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (message != NULL, 0); 991ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 992ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return _dbus_header_get_serial (&message->header); 993ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 994ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 995ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 996afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Sets the reply serial of a message (the serial of the message this 997afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * is a reply to). 998ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 999ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @param message the message 1000afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param reply_serial the serial we're replying to 1001ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @returns #FALSE if not enough memory 1002ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 1003ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_bool_t 1004ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_set_reply_serial (DBusMessage *message, 1005ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington dbus_uint32_t reply_serial) 1006ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 1007ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 1008ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 1009ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (reply_serial != 0, FALSE); /* 0 is invalid */ 1010ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1011ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return _dbus_header_set_field_basic (&message->header, 1012ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_HEADER_FIELD_REPLY_SERIAL, 1013ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_TYPE_UINT32, 1014ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington &reply_serial); 1015ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 1016ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1017ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington/** 1018ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * Returns the serial that the message is a reply to or 0 if none. 1019ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * 1020ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @param message the message 1021ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington * @returns the reply serial 1022ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington */ 1023ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_uint32_t 1024ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_get_reply_serial (DBusMessage *message) 1025ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 1026ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington dbus_uint32_t v_UINT32; 1027ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1028ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_return_val_if_fail (message != NULL, 0); 1029ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1030ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington if (_dbus_header_get_field_basic (&message->header, 1031ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_HEADER_FIELD_REPLY_SERIAL, 1032ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington DBUS_TYPE_UINT32, 1033ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington &v_UINT32)) 1034ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return v_UINT32; 1035ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington else 1036ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington return 0; 1037ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 1038ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1039ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtonstatic void 1040ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Penningtondbus_message_finalize (DBusMessage *message) 1041ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington{ 1042ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_assert (message->refcount.value == 0); 1043ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1044ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington /* This calls application callbacks! */ 1045ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_data_slot_list_free (&message->slot_list); 1046ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1047bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_list_foreach (&message->counters, 1048bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering free_counter, message); 1049bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering _dbus_list_clear (&message->counters); 1050ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1051ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_header_free (&message->header); 1052ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_string_free (&message->body); 1053ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1054a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 1055a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering close_unix_fds(message->unix_fds, &message->n_unix_fds); 1056a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_free(message->unix_fds); 1057a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 1058a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1059ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington _dbus_assert (message->refcount.value == 0); 1060ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 1061ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington dbus_free (message); 1062ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington} 1063ebb239648b60872d0e840e6b4fd63af0eb7d0d5aHavoc Pennington 10649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusMessage* 10659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_empty_header (void) 106650c25505f62786756519ef1e194883360eda82e0Havoc Pennington{ 10679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 10689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t from_cache; 106950c25505f62786756519ef1e194883360eda82e0Havoc Pennington 10709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_get_cached (); 1071dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 10729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message != NULL) 107350c25505f62786756519ef1e194883360eda82e0Havoc Pennington { 10749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington from_cache = TRUE; 107550c25505f62786756519ef1e194883360eda82e0Havoc Pennington } 107650c25505f62786756519ef1e194883360eda82e0Havoc Pennington else 107750c25505f62786756519ef1e194883360eda82e0Havoc Pennington { 10789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington from_cache = FALSE; 10799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_new (DBusMessage, 1); 10809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 10819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 10829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 10839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->generation = _dbus_current_generation; 1084dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington#endif 1085a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1086a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 1087a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message->unix_fds = NULL; 1088a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message->n_unix_fds_allocated = 0; 1089a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 10909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 10919d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 10929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->refcount.value = 1; 10939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order = DBUS_COMPILER_BYTE_ORDER; 10949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->locked = FALSE; 109598ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS 109698ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington message->in_cache = FALSE; 109798ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington#endif 1098bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering message->counters = NULL; 10999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->size_counter_delta = 0; 11009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->changed_stamp = 0; 1101482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington 1102a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 1103a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message->n_unix_fds = 0; 1104a992f732bb4f3ea13746b830d3306f8f2b56d6ccLuiz Augusto Von Dentz message->n_unix_fds_allocated = 0; 1105bfad32422f1f78bce4de1e88a4afb5cc295bb877Lennart Poettering message->unix_fd_counter_delta = 0; 1106a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 1107a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 11089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!from_cache) 11099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_data_slot_list_init (&message->slot_list); 1110dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 11119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (from_cache) 1112482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington { 11139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_reinit (&message->header, message->byte_order); 11149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_set_length (&message->body, 0); 1115482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington } 1116482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington else 1117482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington { 11189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_init (&message->header, message->byte_order)) 11199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 11209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (message); 11219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1123e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 11249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (&message->body, 32)) 11259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 11269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_free (&message->header); 11279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (message); 11289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 11299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1130fdb3ecc33366edc475e684baa8adb3c933563f0dAnders Carlsson } 1131c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 11329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 11335175ad00e1d648a89efdf8d397b31bf84fd203c8Anders Carlsson} 11345175ad00e1d648a89efdf8d397b31bf84fd203c8Anders Carlsson 11351b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 11369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a new message of the given message type. 11379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Types include #DBUS_MESSAGE_TYPE_METHOD_CALL, 11389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_SIGNAL, and so forth. 1139dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson * 1140afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Usually you want to use dbus_message_new_method_call(), 1141afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_new_method_return(), dbus_message_new_signal(), 1142afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * or dbus_message_new_error() instead. 1143afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 11449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message_type type of message 1145afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns new message or #NULL if no memory 1146dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson */ 11479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 11489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new (int message_type) 1149dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson{ 11509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 1151babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 11529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message_type != DBUS_MESSAGE_TYPE_INVALID, NULL); 1153babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 11549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 11559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 11569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1157dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 11589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 11599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message_type, 11609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington NULL, NULL, NULL, NULL, NULL)) 1161e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson { 11629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 11639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1164e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson } 1165e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 11669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1167e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson} 1168e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 1169dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson/** 11709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a new message to invoke a method on a remote 11719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * object. Returns #NULL if memory can't be allocated for the 11729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message. The destination may be #NULL in which case no destination 11737652304bff969afb3969603149bb385efe861fe8John (J * is set; this is appropriate when using D-Bus in a peer-to-peer 11749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * context (no message bus). The interface may be #NULL, which means 11759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * that if multiple methods with the given name exist it is undefined 11769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * which one will be invoked. 1177afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1178afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The path and method names may not be #NULL. 1179afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1180afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Destination, path, interface, and method name can't contain 1181afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * any invalid characters (see the D-Bus specification). 1182afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 11838873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param destination name that the message should be sent to or #NULL 11849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param path object path the message should be sent to 1185afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param interface interface to invoke method on, or #NULL 11869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param method method to invoke 1187799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson * 11889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new DBusMessage, free with dbus_message_unref() 1189799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson */ 11909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 11919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_method_call (const char *destination, 11929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *path, 11939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *interface, 11949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *method) 1195799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson{ 11969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 1197799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 11989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (path != NULL, NULL); 11999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (method != NULL, NULL); 12009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (destination == NULL || 12018873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_check_is_valid_bus_name (destination), NULL); 12029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_path (path), NULL); 12039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (interface == NULL || 12049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_interface (interface), NULL); 12059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_member (method), NULL); 1206799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 12079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 12089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 12099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1210c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 12119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 12129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_METHOD_CALL, 12139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington destination, path, interface, method, NULL)) 12149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 12159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 12169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1218c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 12199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1220799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson} 1221799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 1222799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson/** 12239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a message that is a reply to a method call. Returns 12249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #NULL if memory can't be allocated for the message. 12251f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson * 1226afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param method_call the message being replied to 12279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new DBusMessage, free with dbus_message_unref() 12281f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson */ 12299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 12309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_method_return (DBusMessage *method_call) 12311f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson{ 12329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 12339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *sender; 12341f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (method_call != NULL, NULL); 12361f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender = dbus_message_get_sender (method_call); 12381f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 12399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* sender is allowed to be null here in peer-to-peer case */ 12409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 12419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 12429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 12439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 12459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 12469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_METHOD_RETURN, 12479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender, NULL, NULL, NULL, NULL)) 12489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 12499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 12509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1252d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 12539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_set_no_reply (message, TRUE); 12540123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_set_reply_serial (message, 12569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_get_serial (method_call))) 12579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 12589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 12599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 12610123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 12630123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 12640123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12650123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 12669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Constructs a new message representing a signal emission. Returns 12679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #NULL if memory can't be allocated for the message. A signal is 1268afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * identified by its originating object path, interface, and the name 1269afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * of the signal. 12700123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 1271afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Path, interface, and signal name must all be valid (the D-Bus 1272afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * specification defines the syntax of these fields). 1273afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 12749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param path the path to the object emitting the signal 12759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param interface the interface the signal is emitted from 12769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param name name of the signal 12779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new DBusMessage, free with dbus_message_unref() 12780123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 12799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 12809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_signal (const char *path, 12819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *interface, 12829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name) 12830123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 12849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 12850123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (path != NULL, NULL); 12879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (interface != NULL, NULL); 12889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (name != NULL, NULL); 12899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_path (path), NULL); 12909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_interface (interface), NULL); 12919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_member (name), NULL); 12920123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 12949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 12959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 12960123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 12979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 12989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_SIGNAL, 12999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington NULL, path, interface, name, NULL)) 13000123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks { 13019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 13029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13030123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks } 13040123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_set_no_reply (message, TRUE); 13060123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 13080123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 13090123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13100123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 1311afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Creates a new message that is an error reply to another message. 1312afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Error replies are most common in response to method calls, but 1313afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * can be returned in reply to any message. 13140123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 1315afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The error name must be a valid error name according to the syntax 1316afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * given in the D-Bus specification. If you don't want to make 1317afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * up an error name just use #DBUS_ERROR_FAILED. 1318afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1319afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param reply_to the message we're replying to 13209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_name the error name 1321afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error_message the error message string (or #NULL for none, but please give a message) 1322afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns a new error message object, free with dbus_message_unref() 13230123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 13249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 13259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_error (DBusMessage *reply_to, 13269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_name, 13279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_message) 13280123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 13299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 13309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *sender; 13319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 13320123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (reply_to != NULL, NULL); 13349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (error_name != NULL, NULL); 13359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name), NULL); 13360123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender = dbus_message_get_sender (reply_to); 13389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 13399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* sender may be NULL for non-message-bus case or 13409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * when the message bus is dealing with an unregistered 13419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * connection. 13429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 13439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 13449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 13459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 13479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_create (&message->header, 13489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_TYPE_ERROR, 13499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender, NULL, NULL, NULL, error_name)) 13500123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks { 13519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 13529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 13540123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_set_no_reply (message, TRUE); 13560123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 13579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_set_reply_serial (message, 13589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_get_serial (reply_to))) 13599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 13609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 13619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 13631f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 13649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (error_message != NULL) 13659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 136631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (message, &iter); 13679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&iter, 13689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 13699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &error_message)) 13700123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks { 13719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 13729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 13730123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks } 13740123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks } 13759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 13769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1377c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 137829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1379c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 1380afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Creates a new message that is an error reply to another message, allowing 1381afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * you to use printf formatting. 1382afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1383afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * See dbus_message_new_error() for details - this function is the same 1384afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * aside from the printf formatting. 1385c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1386716059087dcf7caeb12313520eee8fc4b554ef54Havoc Pennington * @todo add _DBUS_GNUC_PRINTF to this (requires moving _DBUS_GNUC_PRINTF to 1387fb93e1faa875d6b1ca48b0e792a9b79aa7cbc517Ralf Habacker * public header, see DBUS_DEPRECATED for an example) 1388716059087dcf7caeb12313520eee8fc4b554ef54Havoc Pennington * 13899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param reply_to the original message 13909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_name the error name 13919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_format the error message format as with printf 13929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param ... format string arguments 13939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns a new error message 1394c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 13959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage* 13969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_new_error_printf (DBusMessage *reply_to, 13979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_name, 13989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_format, 13999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ...) 1400c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 14019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list args; 14029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString str; 14039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 1404c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 14059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (reply_to != NULL, NULL); 14069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (error_name != NULL, NULL); 14079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_check_is_valid_error_name (error_name), NULL); 14081f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init (&str)) 14109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1411c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson 14129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_start (args, error_format); 14131f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (_dbus_string_append_printf_valist (&str, error_format, args)) 14159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_error (reply_to, error_name, 14169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_const_data (&str)); 14179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 14189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = NULL; 14191f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (&str); 14211f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_end (args); 14231f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1425c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 14261f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 1428c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 14299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Creates a new message that is an exact replica of the message 14309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * specified, except that its refcount is set to 1, its message serial 14319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * is reset to 0, and if the original message was "locked" (in the 14329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * outgoing message queue and thus not modifiable) the new message 14339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * will not be locked. 1434c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1435a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @todo This function can't be used in programs that try to recover from OOM errors. 1436a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 1437afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param message the message 1438a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @returns the new message.or #NULL if not enough memory or Unix file descriptors (in case the message to copy includes Unix file descriptors) can be allocated. 1439c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 14409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage * 14419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_copy (const DBusMessage *message) 1442c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 14439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *retval; 14441f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 14461f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = dbus_new0 (DBusMessage, 1); 14489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (retval == NULL) 14499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 14501f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 14519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->refcount.value = 1; 14529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->byte_order = message->byte_order; 14539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->locked = FALSE; 14549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 14559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval->generation = message->generation; 14569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 1457b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 14589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_copy (&message->header, &retval->header)) 14599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 14609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (retval); 14619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 14629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1463b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 14649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (&retval->body, 14659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body))) 14669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 14679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_free (&retval->header); 14689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (retval); 14699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 14709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 1471b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 14729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_copy (&message->body, 0, 14739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &retval->body, 0)) 14749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed_copy; 1475b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1476a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 1477a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering retval->unix_fds = dbus_new(int, message->n_unix_fds); 1478a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (retval->unix_fds == NULL && message->n_unix_fds > 0) 1479a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto failed_copy; 1480a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1481a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering retval->n_unix_fds_allocated = message->n_unix_fds; 1482a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1483a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering for (retval->n_unix_fds = 0; 1484a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering retval->n_unix_fds < message->n_unix_fds; 1485a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering retval->n_unix_fds++) 1486a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 1487a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering retval->unix_fds[retval->n_unix_fds] = _dbus_dup(message->unix_fds[retval->n_unix_fds], NULL); 1488a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1489a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (retval->unix_fds[retval->n_unix_fds] < 0) 1490a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto failed_copy; 1491a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 1492a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1493a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 1494a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 14959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 1496b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 14979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington failed_copy: 14989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_free (&retval->header); 14999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (&retval->body); 1500a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1501a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 1502a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering close_unix_fds(retval->unix_fds, &retval->n_unix_fds); 1503a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_free(retval->unix_fds); 1504a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 1505a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 15069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (retval); 1507b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 15089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return NULL; 1509b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 1510b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1511b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1512c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 15139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Increments the reference count of a DBusMessage. 1514c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1515afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param message the message 15169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the message 15179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_unref 1518c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 15199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusMessage * 15209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_ref (DBusMessage *message) 1521c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 15229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_int32_t old_refcount; 15231f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 15249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 15259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message->generation == _dbus_current_generation, NULL); 152698ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_return_val_if_fail (!message->in_cache, NULL); 152798ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington 15289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington old_refcount = _dbus_atomic_inc (&message->refcount); 15299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (old_refcount >= 1); 15301b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 15319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return message; 1532c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1533babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 1534c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 1535afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Decrements the reference count of a DBusMessage, freeing the 1536afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message if the count reaches 0. 1537c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 1538afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param message the message 15399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_ref 1540c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 15419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 15429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_unref (DBusMessage *message) 15430123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 15449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_int32_t old_refcount; 15450123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 15469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 15479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message->generation == _dbus_current_generation); 154898ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_return_if_fail (!message->in_cache); 15490123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 15509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington old_refcount = _dbus_atomic_dec (&message->refcount); 15510123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 15529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (old_refcount >= 0); 15530123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 15549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (old_refcount == 1) 15559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 15569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* Calls application callbacks! */ 15579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_cache_or_finalize (message); 15589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 15590123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 15600123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 1561c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 15629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the type of a message. Types include 15639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL, #DBUS_MESSAGE_TYPE_METHOD_RETURN, 15649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_ERROR, #DBUS_MESSAGE_TYPE_SIGNAL, but other 15659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * types are allowed and all code must silently ignore messages of 1566afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * unknown type. #DBUS_MESSAGE_TYPE_INVALID will never be returned. 1567c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 15689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 15699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the type of the message 1570c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 15719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 15729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_type (DBusMessage *message) 1573c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 15749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, DBUS_MESSAGE_TYPE_INVALID); 1575c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 15769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_get_message_type (&message->header); 15771f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson} 15781f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson 15791f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson/** 15809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends fields to a message given a variable argument list. The 15819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * variable argument list should contain the type of each argument 15829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * followed by the value to append. Appendable types are basic types, 1583724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * and arrays of fixed-length basic types (except arrays of Unix file 1584724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * descriptors). To append variable-length basic types, or any more 1585724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * complex value, you have to use an iterator rather than this 1586724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * function. 1587c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 15889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * To append a basic type, specify its type code followed by the 158964f3d8f67db09e0c84ed3ff009b86d0127fe82b4Havoc Pennington * address of the value. For example: 15909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 15919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 15929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 159364f3d8f67db09e0c84ed3ff009b86d0127fe82b4Havoc Pennington * dbus_int32_t v_INT32 = 42; 159464f3d8f67db09e0c84ed3ff009b86d0127fe82b4Havoc Pennington * const char *v_STRING = "Hello World"; 1595afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_append_args (message, 1596afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_INT32, &v_INT32, 1597afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_STRING, &v_STRING, 1598afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * DBUS_TYPE_INVALID); 15999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 16009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1601724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * To append an array of fixed-length basic types (except Unix file 1602724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * descriptors), pass in the DBUS_TYPE_ARRAY typecode, the element 1603724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * typecode, the address of the array pointer, and a 32-bit integer 1604724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * giving the number of elements in the array. So for example: @code 1605724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * const dbus_int32_t array[] = { 1, 2, 3 }; const dbus_int32_t 1606724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * *v_ARRAY = array; dbus_message_append_args (message, 1607724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &v_ARRAY, 3, DBUS_TYPE_INVALID); 16089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 16099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1610724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * This function does not support arrays of Unix file descriptors. If 1611724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * you need those you need to manually recurse into the array. 1612724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 1613724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * For Unix file descriptors this function will internally duplicate 1614724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * the descriptor you passed in. Hence you may close the descriptor 1615724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * immediately after this call. 1616724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 16179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @warning in C, given "int array[]", "&array == array" (the 16189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * comp.lang.c FAQ says otherwise, but gcc and the FAQ don't agree). 16199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So if you're using an array instead of a pointer you have to create 16209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a pointer variable, assign the array to it, then take the address 16219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of the pointer variable. For strings it works to write 16229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const char *array = "Hello" and then use &array though. 16239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 16249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The last argument to this function must be #DBUS_TYPE_INVALID, 1625afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * marking the end of the argument list. If you don't do this 1626afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * then libdbus won't know to stop and will read invalid memory. 16279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 162883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * String/signature/path arrays should be passed in as "const char*** 162983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * address_of_array" and "int n_elements" 163083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * 16319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo support DBUS_TYPE_STRUCT and DBUS_TYPE_VARIANT and complex arrays 16329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 16339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 16349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 16359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 16369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 16379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type type of the first argument 16389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param ... value of first argument, list of additional type-value pairs 1639c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * @returns #TRUE on success 1640c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 1641c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 16429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_append_args (DBusMessage *message, 16439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 16449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ...) 1645c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 16469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t retval; 16479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args; 1648c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 16499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 1650b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 16519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_start (var_args, first_arg_type); 16529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = dbus_message_append_args_valist (message, 16539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington first_arg_type, 16549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington var_args); 16559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_end (var_args); 16569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 1658b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 1659b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 1660b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 1661afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Like dbus_message_append_args() but takes a va_list for use by language bindings. 1662b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 16639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo for now, if this function fails due to OOM it will leave 16649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the message half-written and you have to discard the message 16659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and start over. 1666b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 16679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_append_args. 16689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 16699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type type of first argument 16709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param var_args value of first argument, then list of type/value pairs 1671b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * @returns #TRUE on success 1672b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 1673b29d0c534a631b211f1f94168e7672c604c8f815Havoc Penningtondbus_bool_t 16749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_append_args_valist (DBusMessage *message, 16759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 16769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args) 1677b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 16789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type; 16799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 1680b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 16819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 1682b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 16839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type = first_arg_type; 16849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 168531988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (message, &iter); 16869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (type != DBUS_TYPE_INVALID) 16889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 168954a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters if (dbus_type_is_basic (type)) 16909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 16919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusBasicValue *value; 16929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value = va_arg (var_args, const DBusBasicValue*); 16939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 16949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&iter, 16959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type, 16969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value)) 16979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 16989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 16999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else if (type == DBUS_TYPE_ARRAY) 17009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 17019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int element_type; 17029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter array; 17039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington char buf[2]; 17049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington element_type = va_arg (var_args, int); 170683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 17079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington buf[0] = element_type; 17089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington buf[1] = '\0'; 17099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_open_container (&iter, 17109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_ARRAY, 17119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington buf, 17129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &array)) 17139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 1714a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 1715a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (dbus_type_is_fixed (element_type) && 1716a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering element_type != DBUS_TYPE_UNIX_FD) 171783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 171883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington const DBusBasicValue **value; 171983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington int n_elements; 172083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 172183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value = va_arg (var_args, const DBusBasicValue**); 172283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington n_elements = va_arg (var_args, int); 172383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 172483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington if (!dbus_message_iter_append_fixed_array (&array, 172583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type, 172683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value, 17273f070088232f82fafce97c4fb3015da098fe00bfScott James Remnant n_elements)) { 17283f070088232f82fafce97c4fb3015da098fe00bfScott James Remnant dbus_message_iter_abandon_container (&iter, &array); 172983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington goto failed; 17303f070088232f82fafce97c4fb3015da098fe00bfScott James Remnant } 173183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 173283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington else if (element_type == DBUS_TYPE_STRING || 173383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type == DBUS_TYPE_SIGNATURE || 173483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type == DBUS_TYPE_OBJECT_PATH) 173583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 173683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington const char ***value_p; 173783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington const char **value; 173883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington int n_elements; 173983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington int i; 174083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 174183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value_p = va_arg (var_args, const char***); 174283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington n_elements = va_arg (var_args, int); 174383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 174483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington value = *value_p; 174583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington 174683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington i = 0; 174783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington while (i < n_elements) 174883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 174983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington if (!dbus_message_iter_append_basic (&array, 175083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington element_type, 17513f070088232f82fafce97c4fb3015da098fe00bfScott James Remnant &value[i])) { 17523f070088232f82fafce97c4fb3015da098fe00bfScott James Remnant dbus_message_iter_abandon_container (&iter, &array); 175383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington goto failed; 17543f070088232f82fafce97c4fb3015da098fe00bfScott James Remnant } 175583dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington ++i; 175683dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 175783dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 175883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington else 175983dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington { 176083dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington _dbus_warn ("arrays of %s can't be appended with %s for now\n", 176183dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington _dbus_type_to_string (element_type), 176283dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington _DBUS_FUNCTION_NAME); 176383dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington goto failed; 176483dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington } 17659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_close_container (&iter, &array)) 17679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 17689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 17699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 17709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 17719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 17729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_warn ("type %s isn't supported yet in %s\n", 17739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_to_string (type), _DBUS_FUNCTION_NAME); 17749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington goto failed; 17759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 17769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 17779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type = va_arg (var_args, int); 17799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 17809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 17829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 17839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington failed: 17849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 1785c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1786c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1787c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 17889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets arguments from a message given a variable argument list. The 17899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * supported types include those supported by 17909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_append_args(); that is, basic types and arrays of 17919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * fixed-length basic types. The arguments are the same as they would 17929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * be for dbus_message_iter_get_basic() or 17939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_get_fixed_array(). 1794993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington * 17959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * In addition to those types, arrays of string, object path, and 17969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature are supported; but these are returned as allocated memory 17979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and must be freed with dbus_free_string_array(), while the other 179883dd8129a0429a2647c3a989ec73c712feb6060cHavoc Pennington * types are returned as const references. To get a string array 1799724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * pass in "char ***array_location" and "int *n_elements". 1800724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 1801724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * Similar to dbus_message_get_fixed_array() this function does not 1802724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * support arrays of type DBUS_TYPE_UNIX_FD. If you need to parse 1803724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * messages with arrays of Unix file descriptors you need to recurse 1804724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * into the array manually. 1805724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 1806724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * Unix file descriptors that are read with this function will have 1807724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * the FD_CLOEXEC flag set. If you need them without this flag set, 1808724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * make sure to unset it with fcntl(). 1809c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson * 18109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The variable argument list should contain the type of the argument 18119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * followed by a pointer to where the value should be stored. The list 18129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * is terminated with #DBUS_TYPE_INVALID. 18139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1814afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Except for string arrays, the returned values are constant; do not 1815afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * free them. They point into the #DBusMessage. 18169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 18179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * If the requested arguments are not present, or do not have the 18189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * requested types, then an error will be set. 18199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 1820afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * If more arguments than requested are present, the requested 1821afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * arguments are returned and the extra arguments are ignored. 1822afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 18239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo support DBUS_TYPE_STRUCT and DBUS_TYPE_VARIANT and complex arrays 18249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 18259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 18269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error error to be filled in on failure 18279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type the first argument type 18289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param ... location for first argument value, then list of type-location pairs 18299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if the error was set 1830c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson */ 1831c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 18329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_args (DBusMessage *message, 18339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusError *error, 18349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 18359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ...) 1836c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 18379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t retval; 18389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args; 1839c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 18409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 18419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_error_is_set (error, FALSE); 1842c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 18439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_start (var_args, first_arg_type); 18449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = dbus_message_get_args_valist (message, error, first_arg_type, var_args); 18459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_end (var_args); 1846c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 18479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 1848c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1849c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1850d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington/** 1851afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Like dbus_message_get_args but takes a va_list for use by language bindings. 1852d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington * 18539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @see dbus_message_get_args 18549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 18559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error error to be filled in 18569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param first_arg_type type of the first argument 18579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param var_args return location for first argument, followed by list of type/location pairs 18589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if error was set 1859d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington */ 1860d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Penningtondbus_bool_t 18619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_args_valist (DBusMessage *message, 18629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusError *error, 18639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int first_arg_type, 18649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington va_list var_args) 1865d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington{ 18669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 1867d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 18689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 18699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_error_is_set (error, FALSE); 1870d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 18719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_iter_init (message, &iter); 18727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington return _dbus_message_iter_get_args_valist (&iter, error, first_arg_type, var_args); 18739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 1874c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 18759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic void 18769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_init_common (DBusMessage *message, 18779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real, 18789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int iter_type) 18799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 18809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (sizeof (DBusMessageRealIter) <= sizeof (DBusMessageIter)); 1881c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1882fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington /* Since the iterator will read or write who-knows-what from the 1883fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington * message, we need to get in the right byte order 1884fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington */ 1885fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington ensure_byte_order (message); 1886fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington 18879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->message = message; 18889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->changed_stamp = message->changed_stamp; 18899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->iter_type = iter_type; 18909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount = 0; 1891c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 1892c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 1893c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson/** 18949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Initializes a #DBusMessageIter for reading the arguments of the 18959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message passed in. 18967265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington * 1897afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * When possible, dbus_message_get_args() is much more convenient. 1898afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Some types of argument can only be read with #DBusMessageIter 1899afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * however. 1900afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1901afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The easiest way to iterate is like this: 1902afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @code 190316e9289ca2c5143c3bcbfe89ebb77c40ca36ff92Xan Lopez * dbus_message_iter_init (message, &iter); 1904afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * while ((current_type = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) 1905afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_iter_next (&iter); 1906afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @endcode 1907afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1908afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * #DBusMessageIter contains no allocated memory; it need not be 1909afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * freed, and can be copied by assignment or memcpy(). 1910afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 19111b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * @param message the message 19123df260c07102745c5606c313af862558f105f83eHavoc Pennington * @param iter pointer to an iterator to initialize 19139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if the message has no arguments 19141b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 19159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 19169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_init (DBusMessage *message, 19179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *iter) 19181b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 1919c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 19209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *type_str; 19219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type_pos; 1922c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 19239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 19249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (iter != NULL, FALSE); 19259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 19279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_message_iter_init_common (message, real, 19299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_READER); 19309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_init (&real->u.reader, 19329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order, 19339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington type_str, type_pos, 19349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &message->body, 19359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 0); 19369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 1937737479031f51b00020b6020f8780137bb4a3de1bJoe Shaw return _dbus_type_reader_get_current_type (&real->u.reader) != DBUS_TYPE_INVALID; 1938c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 19391b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 19401b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 19419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks if an iterator has any more fields. 19421b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 19439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 1944afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #TRUE if there are more fields following 19451b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 1946c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 19479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_has_next (DBusMessageIter *iter) 19481b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 1949c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 19501b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 19519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), FALSE); 19529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE); 1953c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 19549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_type_reader_has_next (&real->u.reader); 19550123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 19560123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 19570123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 19589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Moves the iterator to the next field, if any. If there's no next 19599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * field, returns #FALSE. If the iterator moves forward, returns 19609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #TRUE. 19610123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 19629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 19639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the iterator was moved to the next field 19640123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 19650123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeksdbus_bool_t 19669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_next (DBusMessageIter *iter) 19670123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 19689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 19699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), FALSE); 19719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE); 19729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_type_reader_next (&real->u.reader); 19741b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 19751b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 19761b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 19779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns the argument type of the argument that the message iterator 19789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * points to. If the iterator is at the end of the message, returns 19799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INVALID. You can thus write a loop as follows: 19801b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 19819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 19829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_init (&iter); 19839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * while ((current_type = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) 19849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_next (&iter); 19859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 19869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 19879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 19889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the argument type 19891b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 19909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 19919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_get_arg_type (DBusMessageIter *iter) 19921b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 19939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 19949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), DBUS_TYPE_INVALID); 19969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, FALSE); 19979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 19989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_type_reader_get_current_type (&real->u.reader); 19991b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 20001b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 20011b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 20029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns the element type of the array that the message iterator 20039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * points to. Note that you need to check that the iterator points to 20049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * an array prior to using this function. 20051b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 20069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iter 20079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the array element type 20081b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 20099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 201031988af4089f3793940417535f8eabaae1ac26c8Havoc Penningtondbus_message_iter_get_element_type (DBusMessageIter *iter) 20111b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 20129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 20139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 20149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_check (real), DBUS_TYPE_INVALID); 20159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_READER, DBUS_TYPE_INVALID); 20169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY, DBUS_TYPE_INVALID); 20179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 201831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington return _dbus_type_reader_get_element_type (&real->u.reader); 20191b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 20201b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 20211b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 20229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Recurses into a container value when reading values from a message, 20239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * initializing a sub-iterator to use for traversing the child values 20249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of the container. 20251b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 20269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Note that this recurses into a value, not a type, so you can only 20279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * recurse if the value exists. The main implication of this is that 20289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if you have for example an empty array of array of int32, you can 20299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * recurse into the outermost array, but it will have no values, so 20309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you won't be able to recurse further. There's no array of int32 to 20319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * recurse into. 20329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2033724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * If a container is an array of fixed-length types (except Unix file 2034724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * descriptors), it is much more efficient to use 2035724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * dbus_message_iter_get_fixed_array() to get the whole array in one 2036724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * shot, rather than individually walking over the array elements. 2037b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2038b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * Be sure you have somehow checked that 2039b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_arg_type() matches the type you are expecting 2040b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * to recurse into. Results of this function are undefined if there is 2041b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * no container to recurse into at the current iterator position. 2042b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 20439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the message iterator 20449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sub the sub-iterator to initialize 20451b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 20469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 20479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_recurse (DBusMessageIter *iter, 20489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *sub) 20491b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 20509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 20519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 20521b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 20539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (_dbus_message_iter_check (real)); 20549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (sub != NULL); 20559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 20569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *real_sub = *real; 20579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_recurse (&real->u.reader, &real_sub->u.reader); 20589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 2059b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2060b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 206161411a061c09def43687153e6c734ff27b7fd556Colin Walters * Returns the current signature of a message iterator. This 206261411a061c09def43687153e6c734ff27b7fd556Colin Walters * is useful primarily for dealing with variants; one can 206361411a061c09def43687153e6c734ff27b7fd556Colin Walters * recurse into a variant and determine the signature of 206461411a061c09def43687153e6c734ff27b7fd556Colin Walters * the variant's value. 206561411a061c09def43687153e6c734ff27b7fd556Colin Walters * 2066afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string must be freed with dbus_free(). 2067afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 206861411a061c09def43687153e6c734ff27b7fd556Colin Walters * @param iter the message iterator 206961411a061c09def43687153e6c734ff27b7fd556Colin Walters * @returns the contained signature, or NULL if out of memory 207061411a061c09def43687153e6c734ff27b7fd556Colin Walters */ 207161411a061c09def43687153e6c734ff27b7fd556Colin Walterschar * 207261411a061c09def43687153e6c734ff27b7fd556Colin Waltersdbus_message_iter_get_signature (DBusMessageIter *iter) 207361411a061c09def43687153e6c734ff27b7fd556Colin Walters{ 207461411a061c09def43687153e6c734ff27b7fd556Colin Walters const DBusString *sig; 207561411a061c09def43687153e6c734ff27b7fd556Colin Walters DBusString retstr; 207661411a061c09def43687153e6c734ff27b7fd556Colin Walters char *ret; 207761411a061c09def43687153e6c734ff27b7fd556Colin Walters int start, len; 207861411a061c09def43687153e6c734ff27b7fd556Colin Walters DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 207961411a061c09def43687153e6c734ff27b7fd556Colin Walters 208061411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_return_val_if_fail (_dbus_message_iter_check (real), NULL); 208161411a061c09def43687153e6c734ff27b7fd556Colin Walters 208261411a061c09def43687153e6c734ff27b7fd556Colin Walters if (!_dbus_string_init (&retstr)) 208361411a061c09def43687153e6c734ff27b7fd556Colin Walters return NULL; 208461411a061c09def43687153e6c734ff27b7fd556Colin Walters 208561411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_type_reader_get_signature (&real->u.reader, &sig, 208661411a061c09def43687153e6c734ff27b7fd556Colin Walters &start, &len); 208761411a061c09def43687153e6c734ff27b7fd556Colin Walters if (!_dbus_string_append_len (&retstr, 208861411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_string_get_const_data (sig) + start, 208961411a061c09def43687153e6c734ff27b7fd556Colin Walters len)) 209061411a061c09def43687153e6c734ff27b7fd556Colin Walters return NULL; 209161411a061c09def43687153e6c734ff27b7fd556Colin Walters if (!_dbus_string_steal_data (&retstr, &ret)) 209261411a061c09def43687153e6c734ff27b7fd556Colin Walters return NULL; 209361411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_string_free (&retstr); 209461411a061c09def43687153e6c734ff27b7fd556Colin Walters return ret; 209561411a061c09def43687153e6c734ff27b7fd556Colin Walters} 209661411a061c09def43687153e6c734ff27b7fd556Colin Walters 209761411a061c09def43687153e6c734ff27b7fd556Colin Walters/** 20989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Reads a basic-typed value from the message iterator. 20999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Basic types are the non-containers such as integer and string. 2100b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 21019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The value argument should be the address of a location to store 21029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the returned value. So for int32 it should be a "dbus_int32_t*" 21039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and for string a "const char**". The returned value is 21049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * by reference and should not be freed. 2105b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2106724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * This call duplicates Unix file descriptors when reading them. It is 2107724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * your job to close them when you don't need them anymore. 2108724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 2109724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * Unix file descriptors that are read with this function will have 2110724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * the FD_CLOEXEC flag set. If you need them without this flag set, 2111724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * make sure to unset it with fcntl(). 2112724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 2113b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * Be sure you have somehow checked that 2114b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_arg_type() matches the type you are 2115b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * expecting, or you'll crash when you try to use an integer as a 2116b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * string or something. 2117b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2118724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * To read any container type (array, struct, dict) you will need to 2119724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * recurse into the container with dbus_message_iter_recurse(). If 2120724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * the container is an array of fixed-length values (except Unix file 2121724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * descriptors), you can get all the array elements at once with 2122724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * dbus_message_iter_get_fixed_array(). Otherwise, you have to iterate 2123724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * over the container's contents one value at a time. 2124b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2125b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * All basic-typed values are guaranteed to fit in 8 bytes. So you can 21269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * write code like this: 21279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 21289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 21299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_uint64_t value; 21309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * int type; 21319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_get_basic (&read_iter, &value); 21329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * type = dbus_message_iter_get_arg_type (&read_iter); 21339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_append_basic (&write_iter, type, &value); 21349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 21359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2136b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * On some really obscure platforms dbus_uint64_t might not exist, if 2137b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * you need to worry about this you will know. dbus_uint64_t is just 2138afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * one example of a type that's large enough to hold any possible 2139b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * value, you could use a struct or char[8] instead if you like. 21409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 21419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the iterator 21429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value location to store the value 2143b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 21449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 21459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_get_basic (DBusMessageIter *iter, 21469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington void *value) 2147b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 21489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 21499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 21509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (_dbus_message_iter_check (real)); 21519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (value != NULL); 21529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2153a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_UNIX_FD) 2154a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 2155a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 2156a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBusBasicValue idx; 2157a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2158a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_type_reader_read_basic(&real->u.reader, &idx); 2159a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2160a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (idx.u32 >= real->message->n_unix_fds) { 2161a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* Hmm, we cannot really signal an error here, so let's make 2162a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering sure to return an invalid fd. */ 2163a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *((int*) value) = -1; 2164a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return; 2165a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2166a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2167a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *((int*) value) = _dbus_dup(real->message->unix_fds[idx.u32], NULL); 2168a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 2169a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *((int*) value) = -1; 2170a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 2171a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2172a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering else 2173a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 2174a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_type_reader_read_basic (&real->u.reader, 2175a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering value); 2176a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2177b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 2178b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2179b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 2180afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Returns the number of bytes in the array as marshaled in the wire 2181afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * protocol. The iterator must currently be inside an array-typed 2182afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * value. 2183afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2184afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * This function is deprecated on the grounds that it is stupid. Why 2185afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * would you want to know how many bytes are in the array as marshaled 2186afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the wire protocol? For now, use the n_elements returned from 2187afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * dbus_message_iter_get_fixed_array() instead, or iterate over the 2188afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * array values and count them. 218961411a061c09def43687153e6c734ff27b7fd556Colin Walters * 2190afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @todo introduce a variant of this get_n_elements that returns 2191afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the number of elements, though with a non-fixed array it will not 2192afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * be very efficient, so maybe it's not good. 2193afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 219461411a061c09def43687153e6c734ff27b7fd556Colin Walters * @param iter the iterator 2195afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns the number of bytes in the array 219661411a061c09def43687153e6c734ff27b7fd556Colin Walters */ 219761411a061c09def43687153e6c734ff27b7fd556Colin Waltersint 219861411a061c09def43687153e6c734ff27b7fd556Colin Waltersdbus_message_iter_get_array_len (DBusMessageIter *iter) 219961411a061c09def43687153e6c734ff27b7fd556Colin Walters{ 220061411a061c09def43687153e6c734ff27b7fd556Colin Walters DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 220161411a061c09def43687153e6c734ff27b7fd556Colin Walters 220261411a061c09def43687153e6c734ff27b7fd556Colin Walters _dbus_return_val_if_fail (_dbus_message_iter_check (real), 0); 220361411a061c09def43687153e6c734ff27b7fd556Colin Walters 220461411a061c09def43687153e6c734ff27b7fd556Colin Walters return _dbus_type_reader_get_array_length (&real->u.reader); 220561411a061c09def43687153e6c734ff27b7fd556Colin Walters} 220661411a061c09def43687153e6c734ff27b7fd556Colin Walters 220761411a061c09def43687153e6c734ff27b7fd556Colin Walters/** 22089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Reads a block of fixed-length values from the message iterator. 22099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Fixed-length values are those basic types that are not string-like, 2210b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * such as integers, bool, double. The returned block will be from the 22119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * current position in the array until the end of the array. 2212b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2213724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * There is one exception here: although DBUS_TYPE_UNIX_FD is 2214724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * considered a 'fixed' type arrays of this type may not be read with 2215724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * this function. 2216724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 2217b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * The message iter should be "in" the array (that is, you recurse into the 2218b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * array, and then you call dbus_message_iter_get_fixed_array() on the 2219b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * "sub-iterator" created by dbus_message_iter_recurse()). 222074b1b35402f6b9bbc09999a6224dfc04bc48b2a9Colin Walters * 22219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The value argument should be the address of a location to store the 22229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * returned array. So for int32 it should be a "const dbus_int32_t**" 22239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The returned value is by reference and should not be freed. 2224b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2225b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * This function should only be used if dbus_type_is_fixed() returns 2226b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * #TRUE for the element type. 2227b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2228b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * If an array's elements are not fixed in size, you have to recurse 2229b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * into the array with dbus_message_iter_recurse() and read the 2230b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * elements one by one. 2231b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * 2232b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * Because the array is not copied, this function runs in constant 2233b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * time and is fast; it's much preferred over walking the entire array 2234b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * with an iterator. (However, you can always use 2235b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_recurse(), even for fixed-length types; 2236b80a8fe6b364543aa4b32a02a5ad913faf97173bHavoc Pennington * dbus_message_iter_get_fixed_array() is just an optimization.) 2237afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 22389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the iterator 22399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value location to store the block 22409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param n_elements number of elements in the block 2241b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 22429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 22439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_get_fixed_array (DBusMessageIter *iter, 22449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington void *value, 22459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int *n_elements) 2246b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 22479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 22480d0642b31b9bac2546f9fa2c6bdc55b5ced0b7adRobert McQueen int subtype = _dbus_type_reader_get_current_type(&real->u.reader); 2249b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 22509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (_dbus_message_iter_check (real)); 22519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (value != NULL); 22520d0642b31b9bac2546f9fa2c6bdc55b5ced0b7adRobert McQueen _dbus_return_if_fail ((subtype == DBUS_TYPE_INVALID) || 2253a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering (dbus_type_is_fixed (subtype) && subtype != DBUS_TYPE_UNIX_FD)); 2254b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 22559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_reader_read_fixed_multi (&real->u.reader, 22569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington value, n_elements); 22571b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 22581b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 22591b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 22609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Initializes a #DBusMessageIter for appending arguments to the end 22619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of a message. 2262632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green * 22639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If appending any of the arguments fails due to lack of 2264afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * memory, the message is hosed and you have to start over building 2265afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the whole message. 2266632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green * 22679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 22689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter pointer to an iterator to initialize 2269632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green */ 22709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 227131988af4089f3793940417535f8eabaae1ac26c8Havoc Penningtondbus_message_iter_init_append (DBusMessage *message, 22729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *iter) 2273632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green{ 2274632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 2275632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 22769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 22779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (iter != NULL); 2278632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 22799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_message_iter_init_common (message, real, 22809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MESSAGE_ITER_TYPE_WRITER); 22819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 22829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* We create the signature string and point iterators at it "on demand" 22839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * when a value is actually appended. That means that init() never fails 22849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * due to OOM. 22859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 22869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_writer_init_types_delayed (&real->u.writer, 22879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order, 22889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &message->body, 22899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&message->body)); 2290632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green} 2291632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 2292632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green/** 22939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Creates a temporary signature string containing the current 22949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature, stores it in the iterator, and points the iterator to 22959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the end of it. Used any time we write to the message. 22969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 22979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param real an iterator without a type_str 22989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 22991b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 23009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t 23019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_open_signature (DBusMessageRealIter *real) 23021b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 23039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString *str; 23049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *current_sig; 23059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int current_sig_pos; 23069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 2308c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 23099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (real->u.writer.type_str != NULL) 23109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 23119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->sig_refcount > 0); 23129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount += 1; 23139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 23149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2315c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 23169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str = dbus_new (DBusString, 1); 23179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (str == NULL) 2318c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson return FALSE; 23199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_get_field_raw (&real->message->header, 23219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 23229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ¤t_sig, ¤t_sig_pos)) 23239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington current_sig = NULL; 23249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (current_sig) 2326c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson { 23279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int current_len; 23289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington current_len = _dbus_string_get_byte (current_sig, current_sig_pos); 23309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington current_sig_pos += 1; /* move on to sig data */ 23319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (str, current_len + 4)) 23339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 23349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 23359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 23369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 23379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_copy_len (current_sig, current_sig_pos, current_len, 23399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str, 0)) 23409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 23419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (str); 23429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 23439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 23449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2345c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson } 23469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 2347c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson { 23489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_init_preallocated (str, 4)) 23499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 23509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 23519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 23529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 2353c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson } 2354c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 23559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount = 1; 23569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 23579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_writer_add_types (&real->u.writer, 23589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str, _dbus_string_get_length (str)); 2359c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson return TRUE; 23601b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 23611b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 23621b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 23639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the new signature as the message signature, frees the 23649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature string, and marks the iterator as not having a type_str 23659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * anymore. Frees the signature even if it fails, so you can't 23669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * really recover from failure. Kinda busted. 23671b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 23689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param real an iterator without a type_str 23699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory 23701b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 23719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t 23729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_close_signature (DBusMessageRealIter *real) 23731b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 23749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString *str; 23759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v_STRING; 23769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t retval; 2377c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 23789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 23799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->u.writer.type_str != NULL); 23809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->sig_refcount > 0); 2381c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 23829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington real->sig_refcount -= 1; 23831b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 23849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (real->sig_refcount > 0) 2385e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return TRUE; 23869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (real->sig_refcount == 0); 2387e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 23889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = TRUE; 2389e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 23909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington str = real->u.writer.type_str; 2391e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 23929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v_STRING = _dbus_string_get_const_data (str); 23939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_header_set_field_basic (&real->message->header, 23949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SIGNATURE, 23959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_SIGNATURE, 23969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &v_STRING)) 23979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = FALSE; 2398e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 23999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_type_writer_remove_types (&real->u.writer); 24009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_free (str); 24019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free (str); 24029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 24039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return retval; 2404e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson} 2405e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 2406e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant/** 2407e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * Frees the signature string and marks the iterator as not having a 2408e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * type_str anymore. Since the new signature is not set, the message 2409e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * will generally be hosed after this is called. 2410e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * 2411e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * @param real an iterator without a type_str 2412e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant */ 2413e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnantstatic void 2414e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant_dbus_message_iter_abandon_signature (DBusMessageRealIter *real) 2415e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant{ 2416e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant DBusString *str; 2417e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2418e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_assert (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 2419e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_assert (real->u.writer.type_str != NULL); 2420e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_assert (real->sig_refcount > 0); 2421e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2422e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant real->sig_refcount -= 1; 2423e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2424e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant if (real->sig_refcount > 0) 2425e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant return; 2426e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_assert (real->sig_refcount == 0); 2427e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2428e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant str = real->u.writer.type_str; 2429e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2430e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_type_writer_remove_types (&real->u.writer); 2431e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_string_free (str); 2432e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant dbus_free (str); 2433e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant} 2434e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 24359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#ifndef DBUS_DISABLE_CHECKS 2436e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larssonstatic dbus_bool_t 24379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_message_iter_append_check (DBusMessageRealIter *iter) 2438e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson{ 24399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_check (iter)) 2440e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return FALSE; 244156cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 24429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (iter->message->locked) 24439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 2444afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington _dbus_warn_check_failed ("dbus append iterator can't be used: message is locked (has already been sent)\n"); 24459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 2446e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson } 2447e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 2448e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return TRUE; 2449e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson} 24509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif /* DBUS_DISABLE_CHECKS */ 2451e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 2452a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 2453a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringstatic int * 2454a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringexpand_fd_array(DBusMessage *m, 2455a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering unsigned n) 2456a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 2457a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert(m); 2458a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2459a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* This makes space for adding n new fds to the array and returns a 2460a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering pointer to the place were the first fd should be put. */ 2461a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2462a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (m->n_unix_fds + n > m->n_unix_fds_allocated) 2463a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 2464a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering unsigned k; 2465a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int *p; 2466a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2467a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* Make twice as much space as necessary */ 2468a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering k = (m->n_unix_fds + n) * 2; 2469a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2470a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* Allocate at least four */ 2471a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (k < 4) 2472a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering k = 4; 2473a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2474a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering p = dbus_realloc(m->unix_fds, k * sizeof(int)); 2475a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (p == NULL) 2476a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return NULL; 2477a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2478a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering m->unix_fds = p; 2479a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering m->n_unix_fds_allocated = k; 2480a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2481a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2482a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return m->unix_fds + m->n_unix_fds; 2483a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 2484a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 2485a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 24861b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/** 24879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends a basic-typed value to the message. The basic types are the 24889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * non-container types such as integer and string. 24891b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * 24909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The "value" argument should be the address of a basic-typed value. 24919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So for string, const char**. For integer, dbus_int32_t*. 24929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2493724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * For Unix file descriptors this function will internally duplicate 2494724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * the descriptor you passed in. Hence you may close the descriptor 2495724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * immediately after this call. 2496724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 24979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 24989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 24999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 25009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 25019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param type the type of the value 25029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value the address of the value 25039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 25041b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */ 2505c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larssondbus_bool_t 25069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_append_basic (DBusMessageIter *iter, 25079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type, 25089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const void *value) 25091b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson{ 2510c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 25119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t ret; 2512c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 25139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 25149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 251554a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters _dbus_return_val_if_fail (dbus_type_is_basic (type), FALSE); 25169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (value != NULL, FALSE); 2517e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson 25189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_open_signature (real)) 2519e84c3a03b3be9cfc351ca8e0b9b935cca455e672Alexander Larsson return FALSE; 2520c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 2521a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (type == DBUS_TYPE_UNIX_FD) 2522a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 2523a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 2524a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int *fds; 2525a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_uint32_t u; 2526a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2527a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* First step, include the fd in the fd list of this message */ 2528a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (!(fds = expand_fd_array(real->message, 1))) 2529a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return FALSE; 2530a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2531a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *fds = _dbus_dup(*(int*) value, NULL); 2532a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (*fds < 0) 2533a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return FALSE; 2534a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2535a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering u = real->message->n_unix_fds; 2536a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2537a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* Second step, write the index to the fd */ 2538a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (!(ret = _dbus_type_writer_write_basic (&real->u.writer, DBUS_TYPE_UNIX_FD, &u))) { 2539a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_close(*fds, NULL); 2540a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return FALSE; 2541a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2542a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2543a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering real->message->n_unix_fds += 1; 2544a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering u += 1; 2545a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2546a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* Final step, update the header accordingly */ 2547a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering ret = _dbus_header_set_field_basic (&real->message->header, 2548a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBUS_HEADER_FIELD_UNIX_FDS, 2549a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBUS_TYPE_UINT32, 2550a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering &u); 2551a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 2552a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* If any of these operations fail the message is 2553a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering hosed. However, no memory or fds should be leaked since what 2554a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering has been added to message has been added to the message, and 2555a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering can hence be accounted for when the message is being 2556a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering freed. */ 2557a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 2558a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering ret = FALSE; 2559a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 2560a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2561a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering else 2562a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 2563a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering ret = _dbus_type_writer_write_basic (&real->u.writer, type, value); 2564a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 2565c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 25669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_close_signature (real)) 25679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = FALSE; 25689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 25699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return ret; 25701b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 25711b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 2572502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 25739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends a block of fixed-length values to an array. The 25749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * fixed-length types are all basic types that are not string-like. So 2575724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * int32, double, bool, etc. (Unix file descriptors however are not 2576724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * supported.) You must call dbus_message_iter_open_container() to 2577724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * open an array of values before calling this function. You may call 2578724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * this function multiple times (and intermixed with calls to 25799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_append_basic()) for the same array. 2580c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson * 25819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The "value" argument should be the address of the array. So for 25829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * integer, "dbus_int32_t**" is expected for example. 25839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 25849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @warning in C, given "int array[]", "&array == array" (the 25859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * comp.lang.c FAQ says otherwise, but gcc and the FAQ don't agree). 25869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So if you're using an array instead of a pointer you have to create 25879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a pointer variable, assign the array to it, then take the address 25889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * of the pointer variable. 25899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 25909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const dbus_int32_t array[] = { 1, 2, 3 }; 25919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * const dbus_int32_t *v_ARRAY = array; 25929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if (!dbus_message_iter_append_fixed_array (&iter, DBUS_TYPE_INT32, &v_ARRAY, 3)) 25939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * fprintf (stderr, "No memory!\n"); 25949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 25959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * For strings it works to write const char *array = "Hello" and then 25969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * use &array though. 25979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 25989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 25999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 26009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2601724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * For Unix file descriptors this function will internally duplicate 2602724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * the descriptor you passed in. Hence you may close the descriptor 2603724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * immediately after this call. 2604724adb2f61bd8a6ea41932e04df9303d0a1eed18Lennart Poettering * 26059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 260631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * @param element_type the type of the array elements 26079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value the address of the array 26089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param n_elements the number of elements to append 26099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 2610c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson */ 2611c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlssondbus_bool_t 26129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_append_fixed_array (DBusMessageIter *iter, 26139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int element_type, 26149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const void *value, 26159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int n_elements) 26160123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 26170123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 26189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t ret; 26199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 26219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 2622a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_return_val_if_fail (dbus_type_is_fixed (element_type) && element_type != DBUS_TYPE_UNIX_FD, FALSE); 26239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->u.writer.container_type == DBUS_TYPE_ARRAY, FALSE); 26249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (value != NULL, FALSE); 26259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (n_elements >= 0, FALSE); 26269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (n_elements <= 26279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_MAXIMUM_ARRAY_LENGTH / _dbus_type_get_alignment (element_type), 26289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 26299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = _dbus_type_writer_write_fixed_multi (&real->u.writer, element_type, value, n_elements); 26319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return ret; 26339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 26349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 26369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Appends a container-typed value to the message; you are required to 26379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * append the contents of the container using the returned 26389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * sub-iterator, and then call 26399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_close_container(). Container types are for 26409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * example struct, variant, and array. For variants, the 26419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * contained_signature should be the type of the single value inside 2642c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * the variant. For structs and dict entries, contained_signature 2643c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * should be #NULL; it will be set to whatever types you write into 2644c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * the struct. For arrays, contained_signature should be the type of 2645c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * the array elements. 26469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 26479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 26489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 26499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 26509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 26519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param type the type of the value 26529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param contained_signature the type of container contents 26539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sub sub-iterator to initialize 26549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 26559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 26569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 26579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_open_container (DBusMessageIter *iter, 26589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type, 26599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *contained_signature, 26609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *sub) 26610123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks{ 26620123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 26639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 26649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusString contained_str; 26659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 26679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 266854a2e9f7961b4b8afff94bb0c5b756f986965be6Colin Walters _dbus_return_val_if_fail (dbus_type_is_container (type), FALSE); 26699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (sub != NULL, FALSE); 26709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail ((type == DBUS_TYPE_STRUCT && 26719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington contained_signature == NULL) || 2672c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington (type == DBUS_TYPE_DICT_ENTRY && 2673c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington contained_signature == NULL) || 267415a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington (type == DBUS_TYPE_VARIANT && 267515a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington contained_signature != NULL) || 267615a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington (type == DBUS_TYPE_ARRAY && 267715a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington contained_signature != NULL), FALSE); 2678c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington 267915a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington /* this would fail if the contained_signature is a dict entry, since 268015a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington * dict entries are invalid signatures standalone (they must be in 2681c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * an array) 2682c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington */ 268362f09b8bc6ca258a54a316b452d28f1c590d51c1Havoc Pennington _dbus_return_val_if_fail ((type == DBUS_TYPE_ARRAY && contained_signature && *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || 268415a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington (contained_signature == NULL || 268515a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington _dbus_check_is_valid_signature (contained_signature)), 268615a610bc4c87d389463112ef0ad4fde195af83caHavoc Pennington FALSE); 26879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 26889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_open_signature (real)) 26890123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks return FALSE; 26900123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 26919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *real_sub = *real; 26928fda602e991990d21f196e65d917a481c6ec1360John (J 26938fda602e991990d21f196e65d917a481c6ec1360John (J if (contained_signature != NULL) 26948fda602e991990d21f196e65d917a481c6ec1360John (J { 26958fda602e991990d21f196e65d917a481c6ec1360John (J _dbus_string_init_const (&contained_str, contained_signature); 26968fda602e991990d21f196e65d917a481c6ec1360John (J 26978fda602e991990d21f196e65d917a481c6ec1360John (J return _dbus_type_writer_recurse (&real->u.writer, 26988fda602e991990d21f196e65d917a481c6ec1360John (J type, 26998fda602e991990d21f196e65d917a481c6ec1360John (J &contained_str, 0, 27008fda602e991990d21f196e65d917a481c6ec1360John (J &real_sub->u.writer); 27018fda602e991990d21f196e65d917a481c6ec1360John (J } 27028fda602e991990d21f196e65d917a481c6ec1360John (J else 27038fda602e991990d21f196e65d917a481c6ec1360John (J { 27048fda602e991990d21f196e65d917a481c6ec1360John (J return _dbus_type_writer_recurse (&real->u.writer, 27058fda602e991990d21f196e65d917a481c6ec1360John (J type, 27068fda602e991990d21f196e65d917a481c6ec1360John (J NULL, 0, 27078fda602e991990d21f196e65d917a481c6ec1360John (J &real_sub->u.writer); 27088fda602e991990d21f196e65d917a481c6ec1360John (J } 27090123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 27100123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 27110123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 27120123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks/** 27139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Closes a container-typed value appended to the message; may write 27149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * out more information to the message known only after the entire 27159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * container is written, and may free resources created by 27169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_iter_open_container(). 27170123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks * 27189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo If this fails due to lack of memory, the message is hosed and 27199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * you have to start over building the whole message. 27209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 27219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param iter the append iterator 27229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sub sub-iterator to close 27239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 27240123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks */ 27250123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeksdbus_bool_t 27269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_iter_close_container (DBusMessageIter *iter, 27279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter *sub) 2728c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson{ 27299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 27309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 27319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t ret; 2732c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson 27339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real), FALSE); 27349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 27359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (_dbus_message_iter_append_check (real_sub), FALSE); 27369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (real_sub->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER, FALSE); 2737c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 27389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = _dbus_type_writer_unrecurse (&real->u.writer, 27399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &real_sub->u.writer); 27400123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks 27419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_message_iter_close_signature (real)) 27429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ret = FALSE; 2743c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 27449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return ret; 27459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 2746c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson 27479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 2748e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * Abandons creation of a contained-typed value and frees resources created 2749e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * by dbus_message_iter_open_container(). Once this returns, the message 2750e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * is hosed and you have to start over building the whole message. 2751e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * 2752e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * This should only be used to abandon creation of a message when you have 2753e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * open containers. 2754e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * 2755e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * @param iter the append iterator 2756e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant * @param sub sub-iterator to close 2757e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant */ 2758e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnantvoid 2759e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnantdbus_message_iter_abandon_container (DBusMessageIter *iter, 2760e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant DBusMessageIter *sub) 2761e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant{ 2762e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant DBusMessageRealIter *real = (DBusMessageRealIter *)iter; 2763e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant DBusMessageRealIter *real_sub = (DBusMessageRealIter *)sub; 2764e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2765e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_return_if_fail (_dbus_message_iter_append_check (real)); 2766e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_return_if_fail (real->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 2767e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_return_if_fail (_dbus_message_iter_append_check (real_sub)); 2768e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_return_if_fail (real_sub->iter_type == DBUS_MESSAGE_ITER_TYPE_WRITER); 2769e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2770e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant _dbus_message_iter_abandon_signature (real); 2771e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant} 2772e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant 2773e57a368c440aec39caf6c3b491cf76ef615dc2e8Scott James Remnant/** 27749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets a flag indicating that the message does not want a reply; if 27759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * this flag is set, the other end of the connection may (but is not 27769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * required to) optimize by not sending method return or error 27779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * replies. If this flag is set, there is no way to know whether the 27789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message successfully arrived at the remote end. Normally you know a 27799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * message was received when you receive the reply to it. 27809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2781afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The flag is #FALSE by default, that is by default the other end is 2782afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * required to reply. 2783afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2784afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * On the protocol level this toggles #DBUS_HEADER_FLAG_NO_REPLY_EXPECTED 2785afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 27869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 27879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param no_reply #TRUE if no reply is desired 27889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 27899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 27909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_no_reply (DBusMessage *message, 27919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_bool_t no_reply) 27929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 27939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 27949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (!message->locked); 27959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 27969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_toggle_flag (&message->header, 27979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FLAG_NO_REPLY_EXPECTED, 27989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington no_reply); 27990123e6a927772af6d56ddbe3f75a443ab40646d1Michael Meeks} 2800c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 2801c8769e0b1dde3f1c4ad40cd10dd89c284ecc672bAnders Carlsson/** 28029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns #TRUE if the message does not expect 28039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a reply. 2804babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson * 28059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 28069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the message sender isn't waiting for a reply 2807babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson */ 2808babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 28099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_no_reply (DBusMessage *message) 2810babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson{ 28119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 28129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 28139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_header_get_flag (&message->header, 28149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FLAG_NO_REPLY_EXPECTED); 2815babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson} 2816babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 2817babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson/** 28188873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Sets a flag indicating that an owner for the destination name will 28198873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * be automatically started before the message is delivered. When this 28208873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * flag is set, the message is held until a name owner finishes 28218873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * starting up, or fails to start up. In case of failure, the reply 28228873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * will be an error. 2823babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson * 2824afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The flag is set to #TRUE by default, i.e. auto starting is the default. 2825afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2826afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * On the protocol level this toggles #DBUS_HEADER_FLAG_NO_AUTO_START 2827afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 28289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 28298873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param auto_start #TRUE if auto-starting is desired 2830babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson */ 28319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvoid 28328873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Penningtondbus_message_set_auto_start (DBusMessage *message, 28338873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington dbus_bool_t auto_start) 2834babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson{ 28359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (message != NULL); 28369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_if_fail (!message->locked); 28379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 28389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_toggle_flag (&message->header, 2839f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBUS_HEADER_FLAG_NO_AUTO_START, 2840f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington !auto_start); 2841babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson} 2842babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 2843babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson/** 28448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Returns #TRUE if the message will cause an owner for 28458873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * destination name to be auto-started. 2846babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson * 28479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 28488873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns #TRUE if the message will use auto-start 2849babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson */ 2850babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 28518873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Penningtondbus_message_get_auto_start (DBusMessage *message) 2852babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson{ 28539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 28549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 2855f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington return !_dbus_header_get_flag (&message->header, 2856f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBUS_HEADER_FLAG_NO_AUTO_START); 2857babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson} 2858babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson 2859b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2860b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 28619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the object path this message is being sent to (for 28629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_CALL) or the one a signal is being 28639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * emitted from (for DBUS_MESSAGE_TYPE_SIGNAL). 2864b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2865afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The path must contain only valid characters as defined 2866afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 2867afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 28689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 28699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param object_path the path or #NULL to unset 28709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 2871b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 2872b29d0c534a631b211f1f94168e7672c604c8f815Havoc Penningtondbus_bool_t 28739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_path (DBusMessage *message, 28749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *object_path) 2875b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 28769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 28779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 28789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (object_path == NULL || 28799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_path (object_path), 28809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 28819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 28829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 28839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_PATH, 28849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_OBJECT_PATH, 28859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington object_path); 2886b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 2887b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2888b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington/** 28899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the object path this message is being sent to (for 28909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted from (for 28919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_SIGNAL). Returns #NULL if none. 2892b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington * 2893afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * See also dbus_message_get_path_decomposed(). 2894afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 2895afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 2896afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 2897afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 28989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 28999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the path (should not be freed) or #NULL 2900b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington */ 29019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 29029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_path (DBusMessage *message) 2903b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington{ 29049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 29059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 29079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 29099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 29109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_PATH, 29119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_OBJECT_PATH, 29122d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &v); 29139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 2914b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington} 2915b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington 2916babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlsson/** 2917afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Checks if the message has a particular object path. The object 2918afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * path is the destination object for a method call or the emitting 2919afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * object for a signal. 2920a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * 2921a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @param message the message 2922cb81ac7edeb97f9f97ace8c990c5fdcb3c991345Havoc Pennington * @param path the path name 2923a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @returns #TRUE if there is a path field in the header 2924a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J */ 2925a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_bool_t 2926a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_message_has_path (DBusMessage *message, 2927a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *path) 2928a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J{ 2929a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *msg_path; 2930a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J msg_path = dbus_message_get_path (message); 2931a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2932a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (msg_path == NULL) 2933a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J { 2934a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (path == NULL) 2935a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2936a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J else 2937a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2938a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J } 2939a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2940a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (path == NULL) 2941a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2942a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2943a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (strcmp (msg_path, path) == 0) 2944a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 2945a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2946a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 2947a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J} 2948a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 2949a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J/** 29509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the object path this message is being sent to 29519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted 29529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * from (for DBUS_MESSAGE_TYPE_SIGNAL) in a decomposed 29539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * format (one array element per path component). 29549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Free the returned array with dbus_free_string_array(). 2955502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 29569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * An empty but non-NULL path array means the path "/". 29579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * So the path "/foo/bar" becomes { "foo", "bar", NULL } 29589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and the path "/" becomes { NULL }. 29599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 2960afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * See also dbus_message_get_path(). 2961afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 29629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this could be optimized by using the len from the message 29639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * instead of calling strlen() again 29649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 29659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 29669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param path place to store allocated array of path components; #NULL set here if no path field exists 29679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if no memory to allocate the array 2968502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 2969babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 29709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_path_decomposed (DBusMessage *message, 29719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington char ***path) 2972000d29a283b06517f0cfb599516a390e3afbf25cAnders Carlsson{ 29739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 29749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 29769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (path != NULL, FALSE); 29779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *path = NULL; 29799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 29809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = dbus_message_get_path (message); 29819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (v != NULL) 29829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 29839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_decompose_path (v, strlen (v), 29849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington path, NULL)) 29859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 29869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 29879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return TRUE; 2988000d29a283b06517f0cfb599516a390e3afbf25cAnders Carlsson} 2989000d29a283b06517f0cfb599516a390e3afbf25cAnders Carlsson 2990dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson/** 29919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the interface this message is being sent to 29929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_METHOD_CALL) or 29939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the interface a signal is being emitted from 29949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_SIGNAL). 29956c07098c5ec68e78320a6f07e4c9e141a95729edHavoc Pennington * 2996afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The interface name must contain only valid characters as defined 2997afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 2998afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 29999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 30009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param interface the interface or #NULL to unset 30019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 3002dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson */ 3003babdabd40c98a1a5db93e5315bf0b2609e73f426Anders Carlssondbus_bool_t 30049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_interface (DBusMessage *message, 30059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *interface) 3006dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson{ 30079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 30089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 30099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (interface == NULL || 30109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_interface (interface), 30119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 30129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 30139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 30149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_INTERFACE, 30159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 30169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington interface); 3017dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson} 3018dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 3019dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson/** 30209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the interface this message is being sent to 30219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (for DBUS_MESSAGE_TYPE_METHOD_CALL) or being emitted 30229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * from (for DBUS_MESSAGE_TYPE_SIGNAL). 30239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The interface name is fully-qualified (namespaced). 30249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Returns #NULL if none. 3025799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson * 3026afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 3027afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 3028afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 30299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 30309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the message interface (should not be freed) or #NULL 3031799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson */ 30329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 30339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_interface (DBusMessage *message) 3034799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson{ 30359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 3036c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 30379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 3038799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 30399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 30409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 30419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_INTERFACE, 30429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 30432d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &v); 30449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 30459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington} 30469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 30479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 3048a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * Checks if the message has an interface 3049a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * 3050a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @param message the message 3051cb81ac7edeb97f9f97ace8c990c5fdcb3c991345Havoc Pennington * @param interface the interface name 3052afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #TRUE if the interface field in the header matches 3053a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J */ 3054a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_bool_t 3055a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_message_has_interface (DBusMessage *message, 3056a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *interface) 3057a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J{ 3058a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *msg_interface; 3059a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J msg_interface = dbus_message_get_interface (message); 3060a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3061a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (msg_interface == NULL) 3062a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J { 3063a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (interface == NULL) 3064a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 3065a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J else 3066a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 3067a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J } 3068a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3069a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (interface == NULL) 3070a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 3071a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3072a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (strcmp (msg_interface, interface) == 0) 3073a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 3074a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3075a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 3076a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3077a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J} 3078a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3079a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J/** 30809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the interface member being invoked 30819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_METHOD_CALL) or emitted 30829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_SIGNAL). 3083afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 3084afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The member name must contain only valid characters as defined 3085afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 30869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 30879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 30889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param member the member or #NULL to unset 30899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 30909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 30919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t 30929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_member (DBusMessage *message, 30939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *member) 30949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 30959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 30969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 30979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (member == NULL || 30989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_member (member), 30999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 3100c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson 31019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 31029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_MEMBER, 31039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 31049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington member); 3105799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson} 3106799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 3107799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson/** 31089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the interface member being invoked 31099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_METHOD_CALL) or emitted 31109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * (DBUS_MESSAGE_TYPE_SIGNAL). Returns #NULL if none. 3111632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green * 3112afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 3113afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 3114afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 31159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param message the message 31169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the member name (should not be freed) or #NULL 3117632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green */ 31189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 31199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_member (DBusMessage *message) 3120632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green{ 31219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 3122632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 31239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 3124632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 31259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 31269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 31279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_MEMBER, 31289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 31292d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &v); 31309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 3131632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green} 3132632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green 3133632d54e0dbf5e405258be7afffbaa48942c06cbcOwen Fraser-Green/** 3134a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * Checks if the message has an interface member 3135a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * 3136a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @param message the message 3137cb81ac7edeb97f9f97ace8c990c5fdcb3c991345Havoc Pennington * @param member the member name 3138a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J * @returns #TRUE if there is a member field in the header 3139a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J */ 3140a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_bool_t 3141a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (Jdbus_message_has_member (DBusMessage *message, 3142a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *member) 3143a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J{ 3144a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J const char *msg_member; 3145a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J msg_member = dbus_message_get_member (message); 3146a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3147a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (msg_member == NULL) 3148a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J { 3149a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (member == NULL) 3150a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 3151a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J else 3152a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 3153a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J } 3154a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3155a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (member == NULL) 3156a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 3157a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3158a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J if (strcmp (msg_member, member) == 0) 3159a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return TRUE; 3160a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3161a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J return FALSE; 3162a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3163a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J} 3164a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J 3165a93f9c04acedc37277ef60dc7225464b8b62f0eeJohn (J/** 31669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the name of the error (DBUS_MESSAGE_TYPE_ERROR). 31679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The name is fully-qualified (namespaced). 316850c25505f62786756519ef1e194883360eda82e0Havoc Pennington * 3169afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The error name must contain only valid characters as defined 3170afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 3171afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 3172dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson * @param message the message 31739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param error_name the name or #NULL to unset 317450c25505f62786756519ef1e194883360eda82e0Havoc Pennington * @returns #FALSE if not enough memory 3175dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson */ 317650c25505f62786756519ef1e194883360eda82e0Havoc Penningtondbus_bool_t 31779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_error_name (DBusMessage *message, 31789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *error_name) 3179dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson{ 3180c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 3181c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 31829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (error_name == NULL || 31839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_check_is_valid_error_name (error_name), 31849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 3185dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 31869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 31879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_ERROR_NAME, 31889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 31899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington error_name); 3190dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson} 3191dc6a61a15b2d9cdc6504753fa9eb0a718f99d6d8Anders Carlsson 31920ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington/** 31939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Gets the error name (DBUS_MESSAGE_TYPE_ERROR only) 31949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * or #NULL if none. 31950ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * 3196afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 3197afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 3198afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 31990ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * @param message the message 32009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns the error name (should not be freed) or #NULL 32010ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington */ 32029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 32039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_error_name (DBusMessage *message) 32048ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson{ 32059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 3206c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 32079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 32089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 32099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 32109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 32119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_ERROR_NAME, 32129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 32132d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &v); 32149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 32158ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson} 32168ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson 32170ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington/** 32188873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Sets the message's destination. The destination is the name of 32198873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * another connection on the bus and may be either the unique name 32208873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * assigned by the bus to each connection, or a well-known name 32218873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * specified in advance. 32220ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * 3223afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The destination name must contain only valid characters as defined 3224afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * in the D-Bus specification. 3225afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 32260ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington * @param message the message 32278873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param destination the destination name or #NULL to unset 32289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 32290ff552a2c5c542a1be9a1c73597c298e6ece358fHavoc Pennington */ 32308ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlssondbus_bool_t 32319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_destination (DBusMessage *message, 32329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *destination) 32338ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson{ 3234c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 32359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 32369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (destination == NULL || 32378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_check_is_valid_bus_name (destination), 32389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 32398ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson 32409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 32419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_DESTINATION, 32429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 32439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington destination); 32448ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson} 32458ab042b9571dda44a5afcfe50e0d29dc9b58ecaeAnders Carlsson 324669bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult/** 32478873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Gets the destination of a message or #NULL if there is none set. 324869bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * 3249afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 3250afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 3251afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 325269bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * @param message the message 32538873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns the message destination (should not be freed) or #NULL 325469bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult */ 32559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char* 32569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_get_destination (DBusMessage *message) 325793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 32589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 325993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 32609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 32619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 32629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 32639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 32649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_DESTINATION, 32659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 32662d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &v); 32679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 326893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 326993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 327069bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult/** 32719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Sets the message sender. 327269bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * 3273afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The sender must be a valid bus name as defined in the D-Bus 3274afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * specification. 3275afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 3276afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Usually you don't want to call this. The message bus daemon will 3277afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * call it to set the origin of each message. If you aren't implementing 3278afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * a message bus daemon you shouldn't need to set the sender. 3279afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 328069bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult * @param message the message 32819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param sender the sender or #NULL to unset 32829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #FALSE if not enough memory 328369bf27e5563cbad2d2c9a74ea43e89a8dcb83357Richard Hult */ 328493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultdbus_bool_t 32859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_set_sender (DBusMessage *message, 32869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *sender) 328793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 328893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_return_val_if_fail (message != NULL, FALSE); 32899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (!message->locked, FALSE); 32909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_return_val_if_fail (sender == NULL || 32918873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_check_is_valid_bus_name (sender), 32929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington FALSE); 329393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 32949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return set_or_delete_string_field (message, 32959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SENDER, 32969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 32979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington sender); 329893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 329993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 33002f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington/** 33018873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Gets the unique name of the connection which originated this 33028873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * message, or #NULL if unknown or inapplicable. The sender is filled 33038873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * in by the message bus. 33042f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington * 3305afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Note, the returned sender is always the unique bus name. 3306afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Connections may own multiple other bus names, but those 3307afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * are not found in the sender field. 3308afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 3309afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 3310afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 3311afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 33122f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington * @param message the message 33138873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns the unique name of the sender or #NULL 33142f440457d5fe45afb732820da64a147157e2e82dHavoc Pennington */ 3315fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlssonconst char* 3316fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlssondbus_message_get_sender (DBusMessage *message) 3317fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson{ 33189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *v; 33199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3320c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 33219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 33229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington v = NULL; /* in case field doesn't exist */ 33239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_header_get_field_basic (&message->header, 33249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_HEADER_FIELD_SENDER, 33259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, 33262d0c9d37de01c97df806e9635ee55746e8dfe0e9Ole André Vadla RavnÃ¥s (void *) &v); 33279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return v; 3328fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson} 3329fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson 333056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington/** 333156cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * Gets the type signature of the message, i.e. the arguments in the 333256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * message payload. The signature includes only "in" arguments for 333356cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for 333456cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from 3335afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * what you might expect (that is, it does not include the signature of the 333656cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * entire C++-style method). 333756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * 33389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The signature is a string made up of type codes such as 33399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_TYPE_INT32. The string is terminated with nul (nul is also 33409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the value of #DBUS_TYPE_INVALID). 33419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3342afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The returned string becomes invalid if the message is 3343afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * modified, since it points into the wire-marshaled message data. 3344afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 334556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @param message the message 334656cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @returns the type signature 334756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington */ 334856cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtonconst char* 334956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtondbus_message_get_signature (DBusMessage *message) 335056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington{ 33519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *type_str; 33529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type_pos; 33539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 335456cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 3355f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington 33569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 33579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 33589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return _dbus_string_get_const_data_len (type_str, type_pos, 0); 335956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington} 336056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 336168a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtonstatic dbus_bool_t 336268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington_dbus_message_has_type_interface_member (DBusMessage *message, 336368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington int type, 336468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *interface, 33659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *member) 336668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington{ 336768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *n; 336868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 336968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (message != NULL); 337068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (interface != NULL); 33719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (member != NULL); 337268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 337368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != type) 337468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return FALSE; 337568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 33769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* Optimize by checking the short member name first 337768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * instead of the longer interface name 33789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 337968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 338068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington n = dbus_message_get_member (message); 338168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 33829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (n && strcmp (n, member) == 0) 338368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington { 338468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington n = dbus_message_get_interface (message); 33859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 33869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (n == NULL || strcmp (n, interface) == 0) 338768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return TRUE; 338868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington } 338968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 339068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return FALSE; 3391fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson} 3392fdddf7246da9ea6ce841146e2befe843aede0466Anders Carlsson 3393c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington/** 339468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * Checks whether the message is a method call with the given 339568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * interface and member fields. If the message is not 33969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_MESSAGE_TYPE_METHOD_CALL, or has a different interface or 33979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * member field, returns #FALSE. If the interface field is missing, 33987652304bff969afb3969603149bb385efe861fe8John (J * then it will be assumed equal to the provided interface. The D-Bus 33999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * protocol allows method callers to leave out the interface name. 3400c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * 3401c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param message the message 340295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * @param interface the name to check (must not be #NULL) 340368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param method the name to check (must not be #NULL) 34049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 340568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @returns #TRUE if the message is the specified method call 3406c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington */ 34076cf6f82faae928a9142d4aa465b5add381960e29Anders Carlssondbus_bool_t 340868a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_message_is_method_call (DBusMessage *message, 340968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *interface, 341068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *method) 34116cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson{ 341295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 341395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_return_val_if_fail (interface != NULL, FALSE); 341468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (method != NULL, FALSE); 34159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that interface/method are valid since it would be 34169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * expensive, and not catch many common errors 34179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 3418c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington 341968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return _dbus_message_has_type_interface_member (message, 342068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_MESSAGE_TYPE_METHOD_CALL, 342168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington interface, method); 342295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington} 342395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 342468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington/** 34259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks whether the message is a signal with the given interface and 34269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * member fields. If the message is not #DBUS_MESSAGE_TYPE_SIGNAL, or 3427afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * has a different interface or member field, returns #FALSE. 342868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * 342968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param message the message 343068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param interface the name to check (must not be #NULL) 343168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param signal_name the name to check (must not be #NULL) 34329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 343368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @returns #TRUE if the message is the specified signal 343468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington */ 343568a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_bool_t 343668a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_message_is_signal (DBusMessage *message, 343768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *interface, 343868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington const char *signal_name) 343968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington{ 3440c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 344168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (interface != NULL, FALSE); 344268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (signal_name != NULL, FALSE); 34439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that interface/name are valid since it would be 34449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * expensive, and not catch many common errors 34459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 344668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 344768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return _dbus_message_has_type_interface_member (message, 344868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_MESSAGE_TYPE_SIGNAL, 344968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington interface, signal_name); 345068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington} 345195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 345295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington/** 345368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * Checks whether the message is an error reply with the given error 345468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * name. If the message is not #DBUS_MESSAGE_TYPE_ERROR, or has a 345568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * different name, returns #FALSE. 3456c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * 3457c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington * @param message the message 345868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @param error_name the name to check (must not be #NULL) 34599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 346068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington * @returns #TRUE if the message is the specified error 3461c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington */ 34626cf6f82faae928a9142d4aa465b5add381960e29Anders Carlssondbus_bool_t 346368a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtondbus_message_is_error (DBusMessage *message, 3464fbae5baa06819fed71f62ddbba64a64675c2d333Havoc Pennington const char *error_name) 34656cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson{ 3466c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington const char *n; 34679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 346868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 346968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_return_val_if_fail (error_name != NULL, FALSE); 34709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that error_name is valid since it would be expensive, 34719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and not catch many common errors 34729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 34739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 347468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) 347568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return FALSE; 347668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 3477d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington n = dbus_message_get_error_name (message); 3478c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington 347968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (n && strcmp (n, error_name) == 0) 34806cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson return TRUE; 34816cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson else 34826cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson return FALSE; 34836cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson} 34846cf6f82faae928a9142d4aa465b5add381960e29Anders Carlsson 3485056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington/** 34868873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Checks whether the message was sent to the given name. If the 34878873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * message has no destination specified or has a different 34888873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * destination, returns #FALSE. 3489056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * 3490056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * @param message the message 34918873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param name the name to check (must not be #NULL) 34929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 34938873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns #TRUE if the message has the given destination name 3494056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington */ 3495056d76d809dc341b0dce160d3f79062604565c77Havoc Penningtondbus_bool_t 3496e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Penningtondbus_message_has_destination (DBusMessage *message, 34978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington const char *name) 3498056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington{ 3499056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington const char *s; 3500056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 3501c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 35028873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_return_val_if_fail (name != NULL, FALSE); 35038873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington /* don't check that name is valid since it would be expensive, and 35048873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * not catch many common errors 35059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 35069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3507e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Pennington s = dbus_message_get_destination (message); 3508056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 35098873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (s && strcmp (s, name) == 0) 3510056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return TRUE; 3511056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington else 3512056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 3513056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington} 3514056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 3515056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington/** 35168873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Checks whether the message has the given unique name as its sender. 35178873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * If the message has no sender specified or has a different sender, 35188873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * returns #FALSE. Note that a peer application will always have the 35198873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * unique name of the connection as the sender. So you can't use this 35208873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * function to see whether a sender owned a well-known name. 3521056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * 3522248895207dc15914ac7970a6d1431308075dca1dColin Walters * Messages from the bus itself will have #DBUS_SERVICE_DBUS 35238873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * as the sender. 35249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3525056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington * @param message the message 35268873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @param name the name to check (must not be #NULL) 35279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 35288873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * @returns #TRUE if the message has the given sender 3529056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington */ 3530056d76d809dc341b0dce160d3f79062604565c77Havoc Penningtondbus_bool_t 3531e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Penningtondbus_message_has_sender (DBusMessage *message, 35328873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington const char *name) 3533056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington{ 3534056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington const char *s; 3535056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 353656cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 35378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_return_val_if_fail (name != NULL, FALSE); 35388873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington /* don't check that name is valid since it would be expensive, and 35398873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * not catch many common errors 35409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 35419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3542056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington s = dbus_message_get_sender (message); 3543056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 35448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (s && strcmp (s, name) == 0) 3545056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return TRUE; 3546056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington else 3547056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 3548056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington} 3549056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 3550f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington/** 35519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks whether the message has the given signature; see 35529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * dbus_message_get_signature() for more details on what the signature 35539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * looks like. 355456cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * 355556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @param message the message 355656cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @param signature typecode array 355756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington * @returns #TRUE if message has the given signature 355856cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington*/ 355956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtondbus_bool_t 356056cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Penningtondbus_message_has_signature (DBusMessage *message, 356156cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington const char *signature) 356256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington{ 3563f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington const char *s; 3564f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington 356556cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 356656cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington _dbus_return_val_if_fail (signature != NULL, FALSE); 35679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* don't check that signature is valid since it would be expensive, 35689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * and not catch many common errors 35699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 35709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3571f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington s = dbus_message_get_signature (message); 357256cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 3573f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington if (s && strcmp (s, signature) == 0) 3574f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington return TRUE; 3575f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington else 3576f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington return FALSE; 357756cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington} 357856cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington 357956cc4ae1a241d36b64dbe26de89714f7771f6e78Havoc Pennington/** 3580f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * Sets a #DBusError based on the contents of the given 3581f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * message. The error is only set if the message 3582afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * is an error message, as in #DBUS_MESSAGE_TYPE_ERROR. 3583f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * The name of the error is set to the name of the message, 3584f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * and the error message is set to the first argument 3585f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * if the argument exists and is a string. 3586f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * 3587f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * The return value indicates whether the error was set (the error is 35889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * set if and only if the message is an error message). So you can 35899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * check for an error reply and convert it to DBusError in one go: 35909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 35919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if (dbus_set_error_from_message (error, reply)) 35929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * return error; 35939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * else 35949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * process reply; 35959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 3596f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * 3597f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * @param error the error to set 3598f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington * @param message the message to set it from 3599afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @returns #TRUE if the message had type #DBUS_MESSAGE_TYPE_ERROR 3600f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington */ 3601f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtondbus_bool_t 3602f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtondbus_set_error_from_message (DBusError *error, 3603f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBusMessage *message) 3604f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington{ 36059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *str; 3606c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 3607c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 3608c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_error_is_set (error, FALSE); 36099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3610ff8908f1e98eda82b0a77abb449ecff36abf14aaHavoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) 3611f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington return FALSE; 3612f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 3613f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington str = NULL; 3614f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington dbus_message_get_args (message, NULL, 3615f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBUS_TYPE_STRING, &str, 3616f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington DBUS_TYPE_INVALID); 3617f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 361895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_set_error (error, dbus_message_get_error_name (message), 3619f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington str ? "%s" : NULL, str); 3620f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 3621f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington return TRUE; 3622f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington} 3623f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington 362489f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering/** 362589f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering * Checks whether a message contains unix fds 362689f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering * 362789f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering * @param message the message 362889f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering * @returns #TRUE if the message contains unix fds 362989f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering */ 363089f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poetteringdbus_bool_t 363189f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poetteringdbus_message_contains_unix_fds(DBusMessage *message) 363289f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering{ 3633c1a31b6b30dc683f219ffb8c655138b07a12a187Benjamin Reed#ifdef HAVE_UNIX_FD_PASSING 363489f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering _dbus_assert(message); 363589f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering 363689f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering return message->n_unix_fds > 0; 3637c1a31b6b30dc683f219ffb8c655138b07a12a187Benjamin Reed#else 3638c1a31b6b30dc683f219ffb8c655138b07a12a187Benjamin Reed return FALSE; 3639c1a31b6b30dc683f219ffb8c655138b07a12a187Benjamin Reed#endif 364089f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering} 364189f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering 3642041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */ 3643041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3644041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3645041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @addtogroup DBusMessageInternals 3646041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3647041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 3648041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3649041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3650041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3651041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * The initial buffer size of the message loader. 36529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3653041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @todo this should be based on min header size plus some average 3654041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * body size, or something. Or rather, the min header size only, if we 3655041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * want to try to read only the header, store that in a DBusMessage, 3656041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * then read only the body and store that, etc., depends on 3657041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * how we optimize _dbus_message_loader_get_buffer() and what 3658041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the exact message format is. 3659041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3660041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#define INITIAL_LOADER_DATA_LEN 32 3661041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3662041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3663041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Creates a new message loader. Returns #NULL if memory can't 3664041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * be allocated. 3665041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3666041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns new loader, or #NULL. 3667041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3668041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusMessageLoader* 3669041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_new (void) 3670041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3671041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusMessageLoader *loader; 3672041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3673041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader = dbus_new0 (DBusMessageLoader, 1); 3674041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (loader == NULL) 3675041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return NULL; 36769d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 3677502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington loader->refcount = 1; 3678271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington 36799d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = FALSE; 36809d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = DBUS_VALID; 36818f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington 36828f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington /* this can be configured by the app, but defaults to the protocol max */ 36838f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington loader->max_message_size = DBUS_MAXIMUM_MESSAGE_LENGTH; 36849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3685a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* We set a very relatively conservative default here since due to how 3686a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering SCM_RIGHTS works we need to preallocate an fd array of the maximum 3687a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering number of unix fds we want to receive in advance. A 3688a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering try-and-reallocate loop is not possible. */ 3689a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->max_message_unix_fds = 1024; 3690a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3691fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&loader->data)) 3692271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington { 3693271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington dbus_free (loader); 3694271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington return NULL; 3695271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington } 3696271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington 3697271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington /* preallocate the buffer for speed, ignore failure */ 3698ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_string_set_length (&loader->data, INITIAL_LOADER_DATA_LEN); 3699ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington _dbus_string_set_length (&loader->data, 0); 37009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3701a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 3702a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->unix_fds = NULL; 3703a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->n_unix_fds = loader->n_unix_fds_allocated = 0; 3704a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->unix_fds_outstanding = FALSE; 3705a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 3706a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3707041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return loader; 3708041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3709041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3710041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3711041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Increments the reference count of the loader. 3712041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3713041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 37149f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal * @returns the loader 3715041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 37169f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalDBusMessageLoader * 3717041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_ref (DBusMessageLoader *loader) 3718041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3719041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->refcount += 1; 37209f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 37219f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return loader; 3722041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3723041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3724041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3725041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Decrements the reference count of the loader and finalizes the 3726041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * loader when the count reaches zero. 3727041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3728041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 3729041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3730041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 3731041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_unref (DBusMessageLoader *loader) 3732041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3733041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->refcount -= 1; 3734041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (loader->refcount == 0) 3735041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 3736a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 3737a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering close_unix_fds(loader->unix_fds, &loader->n_unix_fds); 3738a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_free(loader->unix_fds); 3739a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 3740041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_list_foreach (&loader->messages, 3741041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington (DBusForeachFunction) dbus_message_unref, 3742041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington NULL); 3743041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_list_clear (&loader->messages); 3744271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington _dbus_string_free (&loader->data); 3745041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington dbus_free (loader); 3746041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 3747041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3748041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3749041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3750041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Gets the buffer to use for reading data from the network. Network 3751041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * data is read directly into an allocated buffer, which is then used 3752041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * in the DBusMessage, to avoid as many extra memcpy's as possible. 3753041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * The buffer must always be returned immediately using 3754041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * _dbus_message_loader_return_buffer(), even if no bytes are 3755041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * successfully read. 3756041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3757041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @todo this function can be a lot more clever. For example 3758041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it can probably always return a buffer size to read exactly 3759041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the body of the next message, thus avoiding any memory wastage 3760041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * or reallocs. 37617584a7bdccc6c7cf9f3d11c315f088794729b7e4Havoc Pennington * 37627584a7bdccc6c7cf9f3d11c315f088794729b7e4Havoc Pennington * @todo we need to enforce a max length on strings in header fields. 37639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 3764041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the message loader. 3765271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington * @param buffer the buffer 3766041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3767271fa7fc335f332bb2be3beeef735334546c4957Havoc Penningtonvoid 3768041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_get_buffer (DBusMessageLoader *loader, 3769271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington DBusString **buffer) 3770041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3771041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (!loader->buffer_outstanding); 3772041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3773271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington *buffer = &loader->data; 37749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3775041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->buffer_outstanding = TRUE; 3776041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 3777041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3778041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3779041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Returns a buffer obtained from _dbus_message_loader_get_buffer(), 3780041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * indicating to the loader how many bytes of the buffer were filled 3781041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * in. This function must always be called, even if no bytes were 3782041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * successfully read. 3783041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 3784041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 3785041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param buffer the buffer. 3786041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param bytes_read number of bytes that were read into the buffer. 3787041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 3788041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 3789041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_return_buffer (DBusMessageLoader *loader, 3790271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington DBusString *buffer, 3791041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington int bytes_read) 3792041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 3793041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington _dbus_assert (loader->buffer_outstanding); 3794271fa7fc335f332bb2be3beeef735334546c4957Havoc Pennington _dbus_assert (buffer == &loader->data); 379593f222c1d8ed748994f74662671d003495b16d43Havoc Pennington 3796041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington loader->buffer_outstanding = FALSE; 3797ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington} 3798041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 3799a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/** 3800a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Gets the buffer to use for reading unix fds from the network. 3801a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 3802a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * This works similar to _dbus_message_loader_get_buffer() 3803a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 3804a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param loader the message loader. 3805a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param fds the array to read fds into 3806a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param max_n_fds how many fds to read at most 3807a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @return TRUE on success, FALSE on OOM 3808a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */ 3809a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringdbus_bool_t 3810a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering_dbus_message_loader_get_unix_fds(DBusMessageLoader *loader, 3811a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int **fds, 3812a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering unsigned *max_n_fds) 3813a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 3814a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 3815a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert (!loader->unix_fds_outstanding); 3816a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3817a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* Allocate space where we can put the fds we read. We allocate 3818a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering space for max_message_unix_fds since this is an 3819a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering upper limit how many fds can be received within a single 3820a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message. Since SCM_RIGHTS doesn't allow a reallocate+retry logic 3821a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering we are allocating the maximum possible array size right from the 3822a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering beginning. This sucks a bit, however unless SCM_RIGHTS is fixed 3823a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering there is no better way. */ 3824a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3825a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (loader->n_unix_fds_allocated < loader->max_message_unix_fds) 3826a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 3827a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int *a = dbus_realloc(loader->unix_fds, 3828a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->max_message_unix_fds * sizeof(loader->unix_fds[0])); 3829a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3830a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (!a) 3831a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return FALSE; 3832a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3833a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->unix_fds = a; 3834a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->n_unix_fds_allocated = loader->max_message_unix_fds; 3835a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 3836a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3837a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *fds = loader->unix_fds + loader->n_unix_fds; 3838a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering *max_n_fds = loader->n_unix_fds_allocated - loader->n_unix_fds; 3839a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3840a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->unix_fds_outstanding = TRUE; 3841a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return TRUE; 3842a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 3843a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert_not_reached("Platform doesn't support unix fd passing"); 38440feebc3e121bc52e1fcfb6235784702ff87ea360Romain Pokrzywka return FALSE; 3845a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 3846a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 3847a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3848a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/** 3849a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Returns a buffer obtained from _dbus_message_loader_get_unix_fds(). 3850a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 3851a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * This works similar to _dbus_message_loader_return_buffer() 3852a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 3853a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param loader the message loader. 3854a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param fds the array fds were read into 3855a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param max_n_fds how many fds were read 3856a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */ 3857a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3858a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringvoid 3859a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering_dbus_message_loader_return_unix_fds(DBusMessageLoader *loader, 3860a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering int *fds, 3861a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering unsigned n_fds) 3862a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 3863a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 3864a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert(loader->unix_fds_outstanding); 3865a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert(loader->unix_fds + loader->n_unix_fds == fds); 3866a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert(loader->n_unix_fds + n_fds <= loader->n_unix_fds_allocated); 3867a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3868a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->n_unix_fds += n_fds; 3869a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->unix_fds_outstanding = FALSE; 3870a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 3871a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_assert_not_reached("Platform doesn't support unix fd passing"); 3872a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 3873a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 3874a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 38759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* 38769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * FIXME when we move the header out of the buffer, that memmoves all 38779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * buffered messages. Kind of crappy. 38789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Also we copy the header and body, which is kind of crappy. To 38809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * avoid this, we have to allow header and body to be in a single 38819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * memory block, which is good for messages we read and bad for 38829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * messages we are creating. But we could move_len() the buffer into 38839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * this single memory block, and move_len() will just swap the buffers 38849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * if you're moving the entire buffer replacing the dest string. 38859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * We could also have the message loader tell the transport how many 38879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * bytes to read; so it would first ask for some arbitrary number like 38889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 256, then if the message was incomplete it would use the 38899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * header/body len to ask for exactly the size of the message (or 38909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * blocks the size of a typical kernel buffer for the socket). That 38919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * way we don't get trailing bytes in the buffer that have to be 38929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * memmoved. Though I suppose we also don't have a chance of reading a 38939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * bunch of small messages at once, so the optimization may be stupid. 38949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Another approach would be to keep a "start" index into 38969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * loader->data and only delete it occasionally, instead of after 38979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * each message is loaded. 38989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 38999d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington * load_message() returns FALSE if not enough memory OR the loader was corrupted 39009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 39013251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Penningtonstatic dbus_bool_t 39029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonload_message (DBusMessageLoader *loader, 39039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message, 39049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int byte_order, 39059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int fields_array_len, 39069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int header_len, 39079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int body_len) 39083251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington{ 39093251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington dbus_bool_t oom; 39109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusValidity validity; 39119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const DBusString *type_str; 39129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int type_pos; 3913606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington DBusValidationMode mode; 3914a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_uint32_t n_unix_fds = 0; 39159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3916606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington mode = DBUS_VALIDATION_MODE_DATA_IS_UNTRUSTED; 3917606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington 39183251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington oom = FALSE; 39199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3920e11ae7246655e59f8e04d1ffcb3788176a6d98b8Havoc Pennington#if 0 3921eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington _dbus_verbose_bytes_of_string (&loader->data, 0, header_len /* + body_len */); 39229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#endif 39233251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 39249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* 1. VALIDATE AND COPY OVER HEADER */ 39259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->header.data) == 0); 39269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert ((header_len + body_len) <= _dbus_string_get_length (&loader->data)); 39279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 3928606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington if (!_dbus_header_load (&message->header, 3929606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington mode, 3930606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington &validity, 3931606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington byte_order, 3932606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington fields_array_len, 3933606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington header_len, 3934606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington body_len, 3935606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington &loader->data, 0, 3936606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington _dbus_string_get_length (&loader->data))) 39379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 39389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose ("Failed to load header for new message code %d\n", validity); 39395e389fdf499c39926c61b47fcafb5e71291ce1a2John (J 39405e389fdf499c39926c61b47fcafb5e71291ce1a2John (J /* assert here so we can catch any code that still uses DBUS_VALID to indicate 39415e389fdf499c39926c61b47fcafb5e71291ce1a2John (J oom errors. They should use DBUS_VALIDITY_UNKNOWN_OOM_ERROR instead */ 39425e389fdf499c39926c61b47fcafb5e71291ce1a2John (J _dbus_assert (validity != DBUS_VALID); 39435e389fdf499c39926c61b47fcafb5e71291ce1a2John (J 39445e389fdf499c39926c61b47fcafb5e71291ce1a2John (J if (validity == DBUS_VALIDITY_UNKNOWN_OOM_ERROR) 39459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington oom = TRUE; 39469d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington else 39479d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington { 39489d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = TRUE; 39499d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = validity; 39509d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington } 39513251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington goto failed; 39523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 39533251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 39549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (validity == DBUS_VALID); 39553251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 39569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message->byte_order = byte_order; 39573251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 39589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* 2. VALIDATE BODY */ 3959606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY) 39609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 3961606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington get_const_signature (&message->header, &type_str, &type_pos); 3962606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington 3963606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington /* Because the bytes_remaining arg is NULL, this validates that the 3964606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington * body is the right length 3965606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington */ 3966606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington validity = _dbus_validate_body_with_reason (type_str, 3967606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington type_pos, 3968606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington byte_order, 3969606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington NULL, 3970606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington &loader->data, 3971606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington header_len, 3972606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington body_len); 3973606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington if (validity != DBUS_VALID) 3974606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington { 3975606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington _dbus_verbose ("Failed to validate message body code %d\n", validity); 39769d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 39779d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = TRUE; 39789d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = validity; 39799d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 3980606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington goto failed; 3981606eb2106b3d7f5cd36a4f1786d281b771bb1bf7Havoc Pennington } 39823251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 39833251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 3984a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* 3. COPY OVER UNIX FDS */ 3985a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_header_get_field_basic(&message->header, 3986a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBUS_HEADER_FIELD_UNIX_FDS, 3987a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering DBUS_TYPE_UINT32, 3988a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering &n_unix_fds); 3989a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3990a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 3991a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3992a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (n_unix_fds > loader->n_unix_fds) 3993a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 3994a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_verbose("Message contains references to more unix fds than were sent %u != %u\n", 3995a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering n_unix_fds, loader->n_unix_fds); 3996a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 3997a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->corrupted = TRUE; 3998a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->corruption_reason = DBUS_INVALID_MISSING_UNIX_FDS; 3999a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto failed; 4000a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 4001a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4002a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering /* If this was a recycled message there might still be 4003a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering some memory allocated for the fds */ 4004a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering dbus_free(message->unix_fds); 4005a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4006a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (n_unix_fds > 0) 4007a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 4008a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message->unix_fds = _dbus_memdup(loader->unix_fds, n_unix_fds * sizeof(message->unix_fds[0])); 4009a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (message->unix_fds == NULL) 4010a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 4011a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_verbose ("Failed to allocate file descriptor array\n"); 4012a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering oom = TRUE; 4013a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto failed; 4014a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 4015a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4016a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message->n_unix_fds_allocated = message->n_unix_fds = n_unix_fds; 4017a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->n_unix_fds -= n_unix_fds; 4018a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering memmove(loader->unix_fds + n_unix_fds, loader->unix_fds, loader->n_unix_fds); 4019a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 4020a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering else 4021a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering message->unix_fds = NULL; 4022a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4023a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#else 4024a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4025a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (n_unix_fds > 0) 4026a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 4027a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_verbose ("Hmm, message claims to come with file descriptors " 4028a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering "but that's not supported on our platform, disconnecting.\n"); 4029a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4030a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->corrupted = TRUE; 4031a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->corruption_reason = DBUS_INVALID_MISSING_UNIX_FDS; 4032a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering goto failed; 4033a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 4034a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4035a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering#endif 4036a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 40379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* 3. COPY OVER BODY AND QUEUE MESSAGE */ 40389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40393251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington if (!_dbus_list_append (&loader->messages, message)) 40403251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington { 40413251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("Failed to append new message to loader queue\n"); 40423251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington oom = TRUE; 40433251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington goto failed; 40443251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 40453251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40463251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->body) == 0); 40473251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (_dbus_string_get_length (&loader->data) >= 40483251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington (header_len + body_len)); 40499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!_dbus_string_copy_len (&loader->data, header_len, body_len, &message->body, 0)) 40513251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington { 40523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("Failed to move body into new message\n"); 40533251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington oom = TRUE; 40543251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington goto failed; 40553251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 40563251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_delete (&loader->data, 0, header_len + body_len); 40589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40598c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie /* don't waste more than 2k of memory */ 40608c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie _dbus_string_compact (&loader->data, 2048); 40618c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie 40629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->header.data) == header_len); 40633251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (_dbus_string_get_length (&message->body) == body_len); 40643251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40653251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("Loaded message %p\n", message); 40663251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40673251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (!oom); 40683251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_assert (!loader->corrupted); 40699d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (loader->messages != NULL); 40709d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (_dbus_list_find_last (&loader->messages, message) != NULL); 40713251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40723251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington return TRUE; 40733251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40743251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington failed: 40759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40763251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington /* Clean up */ 40773251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington /* does nothing if the message isn't in the list */ 40799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_list_remove_last (&loader->messages, message); 40809d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 40819d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington if (oom) 40829d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (!loader->corrupted); 40839d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington else 40849d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (loader->corrupted); 40859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose_bytes_of_string (&loader->data, 0, _dbus_string_get_length (&loader->data)); 40873251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 40889d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington return FALSE; 40893251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington} 40903251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 4091ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/** 40929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Converts buffered data into messages, if we have enough data. If 40939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * we don't have enough data, does nothing. 4094ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * 40959c5d01f0fe1ba855c0f7518c4f27d75a609b8faaHavoc Pennington * @todo we need to check that the proper named header fields exist 40969c5d01f0fe1ba855c0f7518c4f27d75a609b8faaHavoc Pennington * for each message type. 40979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 40987c3693a53b4eba0db1aebe1edab5ded21eb7757fHavoc Pennington * @todo If a message has unknown type, we should probably eat it 40997c3693a53b4eba0db1aebe1edab5ded21eb7757fHavoc Pennington * right here rather than passing it out to applications. However 41007c3693a53b4eba0db1aebe1edab5ded21eb7757fHavoc Pennington * it's not an error to see messages of unknown type. 41019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4102ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param loader the loader. 4103ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns #TRUE if we had enough memory to finish. 4104ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */ 4105ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Penningtondbus_bool_t 4106ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_message_loader_queue_messages (DBusMessageLoader *loader) 4107ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{ 41089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (!loader->corrupted && 41099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&loader->data) >= DBUS_MINIMUM_HEADER_SIZE) 4110041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 41119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusValidity validity; 41129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int byte_order, fields_array_len, header_len, body_len; 4113993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington 41149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (_dbus_header_have_message_untrusted (loader->max_message_size, 41159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &validity, 41169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &byte_order, 41179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &fields_array_len, 41189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &header_len, 41199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &body_len, 41209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &loader->data, 0, 41219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_string_get_length (&loader->data))) 41229c5d01f0fe1ba855c0f7518c4f27d75a609b8faaHavoc Pennington { 41239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *message; 41247ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington 41259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_assert (validity == DBUS_VALID); 4126482dab2076282ef1195564fa60dd25c1ffb77682Havoc Pennington 41279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington message = dbus_message_new_empty_header (); 41289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (message == NULL) 41299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 4130799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 41319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!load_message (loader, message, 41329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington byte_order, fields_array_len, 41339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington header_len, body_len)) 41349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 41359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (message); 41369d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington /* load_message() returns false if corrupted or OOM; if 41379d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington * corrupted then return TRUE for not OOM 41389d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington */ 41399d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington return loader->corrupted; 41409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 41419d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington 41429d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (loader->messages != NULL); 41439d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert (_dbus_list_find_last (&loader->messages, message) != NULL); 41449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 41459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 41467ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington { 41479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington _dbus_verbose ("Initial peek at header says we don't have a whole message yet, or data broken with invalid code %d\n", 41489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington validity); 41499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (validity != DBUS_VALID) 41509d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington { 41519d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corrupted = TRUE; 41529d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington loader->corruption_reason = validity; 41539d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington } 4154ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return TRUE; 41557ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington } 4156041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 4157ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 4158ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return TRUE; 4159ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington} 4160ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 4161ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington/** 4162ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * Peeks at first loaded message, returns #NULL if no messages have 4163ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * been queued. 4164ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * 4165ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @param loader the loader. 4166ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * @returns the next message, or #NULL if none. 4167ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington */ 4168ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc PenningtonDBusMessage* 4169ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington_dbus_message_loader_peek_message (DBusMessageLoader *loader) 4170ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington{ 4171ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington if (loader->messages) 4172ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return loader->messages->data; 4173ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington else 4174ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington return NULL; 4175041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 4176041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 4177041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 4178041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Pops a loaded message (passing ownership of the message 4179041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * to the caller). Returns #NULL if no messages have been 4180ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington * queued. 4181041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 4182041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param loader the loader. 4183041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns the next message, or #NULL if none. 4184041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 4185041b0767b284034aee09e9a0de2a3844b8cc546aHavoc PenningtonDBusMessage* 4186041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington_dbus_message_loader_pop_message (DBusMessageLoader *loader) 4187041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 4188041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return _dbus_list_pop_first (&loader->messages); 418993f222c1d8ed748994f74662671d003495b16d43Havoc Pennington} 419093f222c1d8ed748994f74662671d003495b16d43Havoc Pennington 41915c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington/** 41925c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * Pops a loaded message inside a list link (passing ownership of the 41935c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * message and link to the caller). Returns #NULL if no messages have 41945c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * been loaded. 41955c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * 41965c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * @param loader the loader. 41975c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington * @returns the next message link, or #NULL if none. 41985c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington */ 41995c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc PenningtonDBusList* 42005c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington_dbus_message_loader_pop_message_link (DBusMessageLoader *loader) 42015c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington{ 42025c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington return _dbus_list_pop_first_link (&loader->messages); 42035c53fb2a36024c66b3aaa6d26e93a802393664b2Havoc Pennington} 4204ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 4205ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington/** 42064b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * Returns a popped message link, used to undo a pop. 42074b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * 42084b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * @param loader the loader 42094b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington * @param link the link with a message in it 42104b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington */ 42114b45f17965f3262eb9b3bb49c015af79781c6882Havoc Penningtonvoid 42124b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington_dbus_message_loader_putback_message_link (DBusMessageLoader *loader, 42134b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington DBusList *link) 42144b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington{ 42154b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington _dbus_list_prepend_link (&loader->messages, link); 42164b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington} 42174b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington 42184b45f17965f3262eb9b3bb49c015af79781c6882Havoc Pennington/** 4219ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * Checks whether the loader is confused due to bad data. 4220ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * If messages are received that are invalid, the 4221ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * loader gets confused and gives up permanently. 4222ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * This state is called "corrupted." 4223ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * 4224ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @param loader the loader 4225ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington * @returns #TRUE if the loader is hosed. 4226ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington */ 4227ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Penningtondbus_bool_t 4228ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington_dbus_message_loader_get_is_corrupted (DBusMessageLoader *loader) 4229ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington{ 42309d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington _dbus_assert ((loader->corrupted && loader->corruption_reason != DBUS_VALID) || 42319d21554dd3b560952cd5aa607c4ec07898c0b260Havoc Pennington (!loader->corrupted && loader->corruption_reason == DBUS_VALID)); 4232ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington return loader->corrupted; 4233ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington} 4234ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington 4235502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 4236ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson * Checks what kind of bad data confused the loader. 4237ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson * 4238ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson * @param loader the loader 4239ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson * @returns why the loader is hosed, or DBUS_VALID if it isn't. 4240ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson */ 4241ae94a89c442c51232d2ed9298d021edf10f6981bWill ThompsonDBusValidity 4242ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson_dbus_message_loader_get_corruption_reason (DBusMessageLoader *loader) 4243ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson{ 4244ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson _dbus_assert ((loader->corrupted && loader->corruption_reason != DBUS_VALID) || 4245ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson (!loader->corrupted && loader->corruption_reason == DBUS_VALID)); 4246ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson 4247ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson return loader->corruption_reason; 4248ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson} 4249ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson 4250ae94a89c442c51232d2ed9298d021edf10f6981bWill Thompson/** 4251502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * Sets the maximum size message we allow. 4252502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 4253502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param loader the loader 4254502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param size the max message size in bytes 4255502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 4256502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonvoid 4257502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_message_loader_set_max_message_size (DBusMessageLoader *loader, 4258502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington long size) 4259502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 42609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (size > DBUS_MAXIMUM_MESSAGE_LENGTH) 42617ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington { 42627ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington _dbus_verbose ("clamping requested max message size %ld to %d\n", 42639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington size, DBUS_MAXIMUM_MESSAGE_LENGTH); 42649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington size = DBUS_MAXIMUM_MESSAGE_LENGTH; 42657ba714ad7fe8256edfaad7d9a0f09aeb9611ca44Havoc Pennington } 4266502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington loader->max_message_size = size; 4267502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 4268502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 4269502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington/** 4270502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * Gets the maximum allowed message size in bytes. 4271502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * 4272502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @param loader the loader 4273502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington * @returns max size in bytes 4274502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington */ 4275502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Penningtonlong 4276502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington_dbus_message_loader_get_max_message_size (DBusMessageLoader *loader) 4277502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington{ 4278502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington return loader->max_message_size; 4279502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington} 4280502fbda2201a4e7e50d687f42af29c82e66299bbHavoc Pennington 4281a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/** 4282a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Sets the maximum unix fds per message we allow. 4283a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 4284a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param loader the loader 4285a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param size the max number of unix fds in a message 4286a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */ 4287a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringvoid 4288a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering_dbus_message_loader_set_max_message_unix_fds (DBusMessageLoader *loader, 4289a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering long n) 4290a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 4291a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering if (n > DBUS_MAXIMUM_MESSAGE_UNIX_FDS) 4292a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering { 4293a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering _dbus_verbose ("clamping requested max message unix_fds %ld to %d\n", 4294a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering n, DBUS_MAXIMUM_MESSAGE_UNIX_FDS); 4295a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering n = DBUS_MAXIMUM_MESSAGE_UNIX_FDS; 4296a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering } 4297a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering loader->max_message_unix_fds = n; 4298a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 4299a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4300a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering/** 4301a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * Gets the maximum allowed number of unix fds per message 4302a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * 4303a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @param loader the loader 4304a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering * @returns max unix fds 4305a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering */ 4306a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poetteringlong 4307a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering_dbus_message_loader_get_max_message_unix_fds (DBusMessageLoader *loader) 4308a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering{ 4309a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering return loader->max_message_unix_fds; 4310a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering} 4311a0cc21f8bb6752ffe0ee5f4f5b575dc50d6d46aeLennart Poettering 4312958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtonstatic DBusDataSlotAllocator slot_allocator; 4313958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (message_slots); 4314958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4315958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 4316958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Allocates an integer ID to be used for storing application-specific 4317958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * data on any DBusMessage. The allocated ID may then be used 4318958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * with dbus_message_set_data() and dbus_message_get_data(). 4319958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * The passed-in slot must be initialized to -1, and is filled in 4320958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * with the slot ID. If the passed-in slot is not -1, it's assumed 4321958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * to be already allocated, and its refcount is incremented. 43229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 4323958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * The allocated slot is global, i.e. all DBusMessage objects will 4324958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * have a slot with the given integer ID reserved. 4325958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 4326958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot_p address of a global variable storing the slot 4327958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @returns #FALSE on failure (no memory) 4328958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 4329958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_bool_t 4330958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_allocate_data_slot (dbus_int32_t *slot_p) 4331958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 4332958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington return _dbus_data_slot_allocator_alloc (&slot_allocator, 433314cc7d28a8308060428bbc9b3dd357eaea3a4749John (J &_DBUS_LOCK_NAME (message_slots), 4334958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington slot_p); 4335958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 4336958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4337958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 4338958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Deallocates a global ID for message data slots. 4339958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * dbus_message_get_data() and dbus_message_set_data() may no 4340958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * longer be used with this slot. Existing data stored on existing 4341958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * DBusMessage objects will be freed when the message is 4342958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * finalized, but may not be retrieved (and may only be replaced if 4343958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * someone else reallocates the slot). When the refcount on the 4344958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * passed-in slot reaches 0, it is set to -1. 4345958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 4346958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot_p address storing the slot to deallocate 4347958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 4348958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtonvoid 4349958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_free_data_slot (dbus_int32_t *slot_p) 4350958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 4351958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_if_fail (*slot_p >= 0); 43529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4353958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_data_slot_allocator_free (&slot_allocator, slot_p); 4354958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 4355958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4356958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 4357958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Stores a pointer on a DBusMessage, along 4358958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * with an optional function to be used for freeing 4359958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * the data when the data is set again, or when 4360958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * the message is finalized. The slot number 4361958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * must have been allocated with dbus_message_allocate_data_slot(). 4362958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 4363958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param message the message 4364958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot the slot number 4365958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param data the data to store 4366958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param free_data_func finalizer function for the data 4367958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @returns #TRUE if there was enough memory to store the data 4368958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 4369958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_bool_t 4370958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_set_data (DBusMessage *message, 4371958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington dbus_int32_t slot, 4372958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington void *data, 4373958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington DBusFreeFunction free_data_func) 4374958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 4375958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington DBusFreeFunction old_free_func; 4376958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington void *old_data; 4377958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington dbus_bool_t retval; 4378958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4379958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_val_if_fail (message != NULL, FALSE); 4380958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_val_if_fail (slot >= 0, FALSE); 4381958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4382958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington retval = _dbus_data_slot_list_set (&slot_allocator, 4383958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington &message->slot_list, 4384958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington slot, data, free_data_func, 4385958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington &old_free_func, &old_data); 4386958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4387958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington if (retval) 4388958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington { 4389958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington /* Do the actual free outside the message lock */ 4390958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington if (old_free_func) 4391958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington (* old_free_func) (old_data); 4392958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington } 4393958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4394958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington return retval; 4395958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 4396958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4397958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington/** 4398958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * Retrieves data previously set with dbus_message_set_data(). 4399958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * The slot must still be allocated (must not have been freed). 4400958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * 4401958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param message the message 4402958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @param slot the slot to get data from 4403958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington * @returns the data, or #NULL if not found 4404958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington */ 4405958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtonvoid* 4406958805418359aca169cd363a4a3279f0fdab753cHavoc Penningtondbus_message_get_data (DBusMessage *message, 4407958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington dbus_int32_t slot) 4408958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington{ 4409958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington void *res; 4410958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4411958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington _dbus_return_val_if_fail (message != NULL, NULL); 44129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4413958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington res = _dbus_data_slot_list_get (&slot_allocator, 4414958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington &message->slot_list, 4415958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington slot); 4416958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 4417958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington return res; 4418958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington} 4419958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington 44206a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington/** 44219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Utility function to convert a machine-readable (not translated) 44227652304bff969afb3969603149bb385efe861fe8John (J * string into a D-Bus message type. 44239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 44249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 44259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "method_call" -> DBUS_MESSAGE_TYPE_METHOD_CALL 44269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "method_return" -> DBUS_MESSAGE_TYPE_METHOD_RETURN 44279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "signal" -> DBUS_MESSAGE_TYPE_SIGNAL 44289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * "error" -> DBUS_MESSAGE_TYPE_ERROR 44299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * anything else -> DBUS_MESSAGE_TYPE_INVALID 44309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 44319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 44329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 44339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonint 44349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_type_from_string (const char *type_str) 44359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{ 44369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (strcmp (type_str, "method_call") == 0) 44379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_METHOD_CALL; 44389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (strcmp (type_str, "method_return") == 0) 44399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_METHOD_RETURN; 44409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else if (strcmp (type_str, "signal") == 0) 44419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_SIGNAL; 44429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else if (strcmp (type_str, "error") == 0) 44439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_ERROR; 44449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington else 44459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return DBUS_MESSAGE_TYPE_INVALID; 44461b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson} 44471b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 44489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** 44497652304bff969afb3969603149bb385efe861fe8John (J * Utility function to convert a D-Bus message type into a 44509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * machine-readable string (not translated). 44519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 44529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @code 44539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_CALL -> "method_call" 44549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_METHOD_RETURN -> "method_return" 44559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_SIGNAL -> "signal" 44569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_ERROR -> "error" 44579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * DBUS_MESSAGE_TYPE_INVALID -> "invalid" 44589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @endcode 44599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * 44609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */ 44619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonconst char * 44629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_message_type_to_string (int type) 4463c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson{ 4464c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson switch (type) 4465c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson { 44669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_METHOD_CALL: 44679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "method_call"; 44689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_METHOD_RETURN: 44699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "method_return"; 44709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_SIGNAL: 44719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "signal"; 44729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington case DBUS_MESSAGE_TYPE_ERROR: 44739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "error"; 4474c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson default: 44759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return "invalid"; 4476c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson } 4477c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson} 4478799a3ff443f5357ae7857ebe989a7f92f7bd84dfAnders Carlsson 4479c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie/** 4480c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Turn a DBusMessage into the marshalled form as described in the D-Bus 4481c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * specification. 4482c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 4483c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Generally, this function is only useful for encapsulating D-Bus messages in 4484c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * a different protocol. 4485c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 4486c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param msg the DBusMessage 4487c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param marshalled_data_p the location to save the marshalled form to 4488c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param len_p the location to save the length of the marshalled form to 4489c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @returns #FALSE if there was not enough memory 4490c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie */ 4491c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittiedbus_bool_t 4492c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittiedbus_message_marshal (DBusMessage *msg, 4493c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie char **marshalled_data_p, 4494c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie int *len_p) 4495c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie{ 4496c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusString tmp; 44979f825271f9106c23fe51ab54abdb5156b7751014Will Thompson dbus_bool_t was_locked; 4498c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4499c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (msg != NULL, FALSE); 4500c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (marshalled_data_p != NULL, FALSE); 4501c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (len_p != NULL, FALSE); 450216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance 4503c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_init (&tmp)) 4504c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return FALSE; 4505c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 45069f825271f9106c23fe51ab54abdb5156b7751014Will Thompson /* Ensure the message is locked, to ensure the length header is filled in. */ 45079f825271f9106c23fe51ab54abdb5156b7751014Will Thompson was_locked = msg->locked; 45089f825271f9106c23fe51ab54abdb5156b7751014Will Thompson 45099f825271f9106c23fe51ab54abdb5156b7751014Will Thompson if (!was_locked) 45109f825271f9106c23fe51ab54abdb5156b7751014Will Thompson dbus_message_lock (msg); 45119f825271f9106c23fe51ab54abdb5156b7751014Will Thompson 4512c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_copy (&(msg->header.data), 0, &tmp, 0)) 4513c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail; 4514c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4515c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie *len_p = _dbus_string_get_length (&tmp); 4516c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4517c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_copy (&(msg->body), 0, &tmp, *len_p)) 4518c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail; 4519c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4520c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie *len_p = _dbus_string_get_length (&tmp); 4521c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4522c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_string_steal_data (&tmp, marshalled_data_p)) 4523c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail; 4524c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4525c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_string_free (&tmp); 45269f825271f9106c23fe51ab54abdb5156b7751014Will Thompson 45279f825271f9106c23fe51ab54abdb5156b7751014Will Thompson if (!was_locked) 45289f825271f9106c23fe51ab54abdb5156b7751014Will Thompson msg->locked = FALSE; 45299f825271f9106c23fe51ab54abdb5156b7751014Will Thompson 4530c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return TRUE; 4531c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4532c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie fail: 4533c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_string_free (&tmp); 45349f825271f9106c23fe51ab54abdb5156b7751014Will Thompson 45359f825271f9106c23fe51ab54abdb5156b7751014Will Thompson if (!was_locked) 45369f825271f9106c23fe51ab54abdb5156b7751014Will Thompson msg->locked = FALSE; 45379f825271f9106c23fe51ab54abdb5156b7751014Will Thompson 4538c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return FALSE; 4539c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie} 4540c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4541c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie/** 4542c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Demarshal a D-Bus message from the format described in the D-Bus 4543c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * specification. 4544c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 4545c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * Generally, this function is only useful for encapsulating D-Bus messages in 4546c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * a different protocol. 4547c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * 4548c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param str the marshalled DBusMessage 4549c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param len the length of str 4550c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @param error the location to save errors to 4551c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie * @returns #NULL if there was an error 4552c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie */ 4553c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittieDBusMessage * 4554c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittiedbus_message_demarshal (const char *str, 4555c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie int len, 4556c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusError *error) 4557c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie{ 4558c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusMessageLoader *loader; 4559c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusString *buffer; 4560c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie DBusMessage *msg; 4561c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4562c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_return_val_if_fail (str != NULL, NULL); 4563c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4564c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie loader = _dbus_message_loader_new (); 4565c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4566c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (loader == NULL) 4567c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return NULL; 4568c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4569c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_get_buffer (loader, &buffer); 4570c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_string_append_len (buffer, str, len); 4571c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_return_buffer (loader, buffer, len); 4572c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4573c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!_dbus_message_loader_queue_messages (loader)) 4574c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail_oom; 4575c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4576c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (_dbus_message_loader_get_is_corrupted (loader)) 4577c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail_corrupt; 4578c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4579c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie msg = _dbus_message_loader_pop_message (loader); 4580c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4581c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie if (!msg) 4582c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie goto fail_oom; 4583c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4584c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_unref (loader); 4585c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return msg; 4586c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4587c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie fail_corrupt: 45886b240a12e21b5f4bf8a58b12d445f6e0b756a3c1Will Thompson dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, "Message is corrupted (%s)", 45896b240a12e21b5f4bf8a58b12d445f6e0b756a3c1Will Thompson _dbus_validity_to_error_message (loader->corruption_reason)); 4590c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_unref (loader); 4591c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return NULL; 4592c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 4593c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie fail_oom: 4594c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _DBUS_SET_OOM (error); 4595c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie _dbus_message_loader_unref (loader); 4596c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie return NULL; 4597c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie} 4598c4a5da3e597e5ff782b52e48bc8ed2996ea90fa0Simon McVittie 459916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance/** 460016a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * Returns the number of bytes required to be in the buffer to demarshal a 460116a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * D-Bus message. 460216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * 460316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * Generally, this function is only useful for encapsulating D-Bus messages in 460416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * a different protocol. 460516a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * 460616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * @param str data to be marshalled 460716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * @param len the length of str 460816a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * @param error the location to save errors to 460916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * @returns -1 if there was no valid data to be demarshalled, 0 if there wasn't enough data to determine how much should be demarshalled. Otherwise returns the number of bytes to be demarshalled 461016a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance * 461116a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance */ 461216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachanceint 461316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachancedbus_message_demarshal_bytes_needed(const char *buf, 461416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance int len) 461516a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance{ 461616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance DBusString str; 461716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance int byte_order, fields_array_len, header_len, body_len; 461816a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance DBusValidity validity = DBUS_VALID; 461916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance int have_message; 462016a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance 462116a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance if (!buf || len < DBUS_MINIMUM_HEADER_SIZE) 462216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance return 0; 462316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance 462416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance if (len > DBUS_MAXIMUM_MESSAGE_LENGTH) 462516a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance len = DBUS_MAXIMUM_MESSAGE_LENGTH; 462616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance _dbus_string_init_const_len (&str, buf, len); 462716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance 462816a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance validity = DBUS_VALID; 462916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance have_message 463016a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance = _dbus_header_have_message_untrusted(DBUS_MAXIMUM_MESSAGE_LENGTH, 463116a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance &validity, &byte_order, 463216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance &fields_array_len, 463316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance &header_len, 463416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance &body_len, 463516a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance &str, 0, 463616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance len); 463716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance _dbus_string_free (&str); 463816a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance 463916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance if (validity == DBUS_VALID) 464016a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance { 464116a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance _dbus_assert(have_message); 464216a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance return header_len + body_len; 464316a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance } 464416a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance else 464516a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance { 464616a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance return -1; /* broken! */ 464716a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance } 464816a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance} 464916a947eedb7f7f2951fff4ebbf301af7776aa8dfWilliam Lachance 46509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/** @} */ 46511b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson 46527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/* tests in dbus-message-util.c */ 4653