connection.c revision 6be547d32f018c23ba56426a0bccd08baa2cf440
196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/* connection.c Client connections 396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Copyright (C) 2003 Red Hat, Inc. 596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Licensed under the Academic Free License version 1.2 796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * This program is free software; you can redistribute it and/or modify 996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * it under the terms of the GNU General Public License as published by 1096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 1196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * (at your option) any later version. 1296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 1396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * This program is distributed in the hope that it will be useful, 1496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 1596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * GNU General Public License for more details. 1796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 1896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * You should have received a copy of the GNU General Public License 1996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * along with this program; if not, write to the Free Software 2096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 2196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 2296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington */ 2396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "connection.h" 2439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h" 25a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington#include "policy.h" 2696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "services.h" 2729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington#include "utils.h" 2896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include <dbus/dbus-list.h> 2996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection); 3129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 326ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections 336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington int refcount; 356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *list; /**< List of all the connections */ 366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}; 386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 396ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic int connection_data_slot = -1; 40f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic int connection_data_slot_refcount = 0; 4196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct 4396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 4529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 4696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusList *services_owned; 47aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson char *name; 4829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */ 4929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *oom_message; 5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *oom_preallocated; 51a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long *group_ids; 52a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 53a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusPolicy *policy; 5496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData; 5596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 5696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) 5796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 58f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic dbus_bool_t 59f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_ref (void) 60f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 61f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot < 0) 62f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 63f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot = dbus_connection_allocate_data_slot (); 64f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 65f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot < 0) 66f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return FALSE; 67f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 68f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot_refcount == 0); 69f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 70f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 71f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_refcount += 1; 72f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 73f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return TRUE; 74f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 75f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 76f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 77f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 78f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_unref (void) 79f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 80f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot_refcount > 0); 81f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 82f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_refcount -= 1; 83f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 84f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot_refcount == 0) 85f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 86f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_connection_free_data_slot (connection_data_slot); 87f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot = -1; 88f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 89f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 90f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 91df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop* 921b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonconnection_get_loop (DBusConnection *connection) 931b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 941b08036103a70159e7a67b2349306710edcd6654Havoc Pennington BusConnectionData *d; 951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington d = BUS_CONNECTION_DATA (connection); 971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 981b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_context_get_loop (d->connections->context); 991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 1001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 101fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 10229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection) 10396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 10496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 10596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service; 10696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 10796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 108d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_assert (d != NULL); 10996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 110d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n", 111d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington d->name ? d->name : "(inactive)"); 112d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Drop any service ownership. FIXME Unfortunately, this requires 11429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * memory allocation and there doesn't seem to be a good way to 11529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * handle it other than sleeping; we can't "fail" the operation of 11629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * disconnecting a client, and preallocating a broadcast "service is 11729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * now gone" message for every client-service pair seems kind of 11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * involved. Probably we need to do that though, and also 11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * extend BusTransaction to be able to revert generic 12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * stuff, not just sending a message (so we can e.g. revert 12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * removal of service owners). 12229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 123ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((service = _dbus_list_get_last (&d->services_owned))) 124ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 125ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington BusTransaction *transaction; 126ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 127ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 128ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry: 129ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 130ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 131ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 132ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = NULL; 133ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (transaction == NULL) 134ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 135ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = bus_transaction_new (d->connections->context); 136df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 137ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 138ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 139ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_service_remove_owner (service, connection, 140ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction, &error)) 141ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 1426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 1436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 144ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 145ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 146ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 147ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_cancel_and_free (transaction); 148df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 149ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry; 150ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 151ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 1526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 1536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Failed to remove service owner: %s %s\n", 1546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error.name, error.message); 1556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason"); 1566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 157ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 158ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 159ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_execute_and_free (transaction); 160ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 16196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 16239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_dispatch_remove_connection (connection); 163aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 16496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* no more watching */ 1653bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 166f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 1673bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 1683bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 1693bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 1703bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 1713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 172f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 1733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 1743bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 1753bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 1763bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 17744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 17844fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 1797caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 1807caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 1817caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 18244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 18329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_remove_transactions (connection); 1846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_list_remove (&d->connections->list, connection); 1866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington /* frees "d" as side effect */ 18896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_set_data (connection, 18996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 19096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington NULL, NULL); 1916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 19296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_unref (connection); 19396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 19496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 195b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 19696a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch *watch, 19796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington unsigned int condition, 19896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington void *data) 19996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 20096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusConnection *connection = data; 201b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington dbus_bool_t retval; 20251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 20351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#if 0 20451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Calling handle_watch\n"); 20551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#endif 206b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington retval = dbus_connection_handle_watch (connection, watch, condition); 207aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 208b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return retval; 20996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 21096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 2113bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 21296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch *watch, 2131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 21496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2151b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 217df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_watch (connection_get_loop (connection), 218df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection, 219df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington NULL); 22096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 22196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 22296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 22396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch *watch, 2241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 22596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2271b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 228df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_watch (connection_get_loop (connection), 229df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection); 23096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 23196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 23296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 2333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout *timeout, 2343bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington void *data) 2353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2364c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington DBusConnection *connection = data; 2374c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 238b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_timeout_handle (timeout); 2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2423bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 2433bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout *timeout, 2441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 2453bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2461b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2471b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 248df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_timeout (connection_get_loop (connection), 249df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection, NULL); 2503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2523bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 2533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout *timeout, 2541b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 2553bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2561b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2571b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 258df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_timeout (connection_get_loop (connection), 259df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection); 2603bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2613bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2627caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtonstatic void 2637caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtondispatch_status_function (DBusConnection *connection, 2647caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusDispatchStatus new_status, 2657caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington void *data) 2667caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington{ 2677caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusLoop *loop = data; 2687caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 2697caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (new_status != DBUS_DISPATCH_COMPLETE) 2707caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 2717caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington while (!_dbus_loop_queue_dispatch (loop, connection)) 2727caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington _dbus_wait_for_memory (); 2737caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 2747caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington} 2757caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 276a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t 277a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonallow_user_function (DBusConnection *connection, 278a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long uid, 279a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington void *data) 280a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 281a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 282a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 283a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 284a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 285a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 28644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 28744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington return TRUE; /* FIXME - this is just until we can parse a config file */ 288a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 289a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return bus_context_allow_user (d->connections->context, uid); 290a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 291a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 2923bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 29396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data) 29496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 29596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d = data; 29696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 29796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* services_owned should be NULL since we should be disconnected */ 29896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d->services_owned == NULL); 29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* similarly */ 30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->transaction_messages == NULL); 301aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated) 30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); 304f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_message) 30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 307a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 308a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy) 309a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington bus_policy_unref (d->policy); 310a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 311a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington dbus_free (d->group_ids); 31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 313aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson dbus_free (d->name); 31496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 31596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 31696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 31796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3186ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 3196ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context) 32096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 32296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 323f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (!connection_data_slot_ref ()) 324f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return NULL; 32596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = dbus_new0 (BusConnections, 1); 3276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections == NULL) 328f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 329f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_unref (); 330f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return NULL; 331f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 3326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount = 1; 3346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->context = context; 3356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections; 3376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 3386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3396ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 3406ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections) 3416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 3426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 3436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount += 1; 3446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 3456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3466ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 3476ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections) 3486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 3496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 3506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount -= 1; 3516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections->refcount == 0) 3526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 353ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (connections->list != NULL) 354ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 355ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection; 356ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 357ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection = connections->list->data; 358ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 359ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 360ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_disconnect (connection); 361ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_connection_disconnected (connection); 362ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 363ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 3646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_list_clear (&connections->list); 3666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 367f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_free (connections); 368f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 369f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_unref (); 3706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 37196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 37296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 37396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 3746ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections, 3756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection) 37696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 37796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 378ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t retval; 379ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 3801b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson d = dbus_new0 (BusConnectionData, 1); 3811b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 38296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (d == NULL) 38396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 38429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 3856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d->connections = connections; 38629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->connection = connection; 387f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 388f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot >= 0); 38996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 39096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!dbus_connection_set_data (connection, 39196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 39296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d, free_connection_data)) 39396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington { 39496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 39596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 39696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington } 397ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 398ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = FALSE; 399a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 400a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->n_group_ids = 0; 401a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->group_ids = NULL; 40296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4033bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 4041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_watch, 4051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_watch, 406f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 4073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 4083bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 409ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 4103bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 4113bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 4121b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_timeout, 4131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_timeout, 414f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 4153bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, NULL)) 416ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 4173bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 41844fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 41944fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 42044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington allow_user_function, 42144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL); 4227caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 4237caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 4247caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dispatch_status_function, 4257caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_context_get_loop (connections->context), 4267caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL); 42796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 42839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Setup the connection with the dispatcher */ 42939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (!bus_dispatch_add_connection (connection)) 430ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 431ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 432ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!_dbus_list_append (&connections->list, connection)) 4333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington { 434ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_dispatch_remove_connection (connection); 435ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 4363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington } 4377caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 4387caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) 4397caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 4407caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection)) 4417caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 4427caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_dispatch_remove_connection (connection); 4437caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington goto out; 4447caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 4457caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 446ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4473bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_connection_ref (connection); 448ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = TRUE; 449ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 450ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 451ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!retval) 4521b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 453ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 454ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 455ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 456ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 457ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 458ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 459ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_timeout_functions (connection, 460ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 461ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 462ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 463ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 46444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 46544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 46644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 4671b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 4687caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 4697caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 4707caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 4711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (!dbus_connection_set_data (connection, 4721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington connection_data_slot, 4731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington NULL, NULL)) 4741b08036103a70159e7a67b2349306710edcd6654Havoc Pennington _dbus_assert_not_reached ("failed to set connection data to null"); 475ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 476aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 477ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 47896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 47996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 480a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 481a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_groups (DBusConnection *connection, 482a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington const unsigned long **groups, 483a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int *n_groups) 484a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 485a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 486a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 487a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 488a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 489a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 490a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 491a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = NULL; 492a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = 0; 493a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 494a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* we do a lazy lookup on groups a user is in for two reasons: 495a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * 1) we can't do it on connection setup since the user 496a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * hasn't authenticated and 2) it might be expensive 497a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * and we don't need to do it if there are no group-based 498a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * rules in the config file 499a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 500a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 501a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->n_group_ids == 0) 502a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 503a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long uid; 504a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 505a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 506a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 507a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!_dbus_get_groups (uid, &d->group_ids, &d->n_group_ids)) 508a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 509a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_verbose ("Did not get any groups for UID %lu\n", 510a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington uid); 511a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 512a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 513a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 514a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 515a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 516a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = d->group_ids; 517a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = d->n_group_ids; 518a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 519a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return TRUE; 520a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 521a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 522a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 523a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_is_in_group (DBusConnection *connection, 524a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long gid) 525a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 526a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int i; 527a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington const unsigned long *group_ids; 528a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 529a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 530a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!bus_connection_get_groups (connection, &group_ids, &n_group_ids)) 531a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 532a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 533a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington i = 0; 534a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington while (i < n_group_ids) 535a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 536a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (group_ids[i] == gid) 537a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return TRUE; 538a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington ++i; 539a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 540a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 541a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 542a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 543a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 544a26607ab68bf0878f23d2dbddec781b4b760d034Havoc PenningtonBusPolicy* 545a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_policy (DBusConnection *connection) 546a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 547a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 548a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 549a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 550a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 551a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 552a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 553a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!dbus_connection_get_is_authenticated (connection)) 554a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 555a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_verbose ("Tried to get policy for unauthenticated connection!\n"); 556a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return NULL; 557a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 558a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 559a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* We do lazy creation of the policy because 560a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * it can only be done post-authentication. 561a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 562a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy == NULL) 563a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 564a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->policy = 565a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington bus_context_create_connection_policy (d->connections->context, 566a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington connection); 567a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 568a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* we may have a NULL policy on OOM or error getting list of 569a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * groups for a user. In the latter case we don't handle it so 570a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * well currently, just keep pretending we're out of memory, 571a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * which is kind of bizarre. 572a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 573a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 574a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 575a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return d->policy; 576a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 5776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/** 5796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns 5806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating. 5816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * 5826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object 5836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function 5846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg 5856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */ 5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 5876ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections *connections, 5886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionForeachFunction function, 5896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington void *data) 5906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *link; 5926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington link = _dbus_list_get_first_link (&connections->list); 5946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington while (link != NULL) 5956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 5966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection = link->data; 5976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->list, link); 5986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!(* function) (connection, data)) 6006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington break; 6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington link = next; 6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 6046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6066ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 6076ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections) 6086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections->context; 6106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6126ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 6136ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection) 6146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections->context; 6226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6246ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 6256ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection) 6266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections; 6346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6366ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry* 6376ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection) 6386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_registry (d->connections->context); 6466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6486ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation* 6496ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection) 6506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6546ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6556ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_activation (d->connections->context); 6586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 66029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus. 66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * 66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection 66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant 66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection) 66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return d != NULL && d->name != NULL; 67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection) 67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 67929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 68429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 68629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated != NULL) 68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington preallocated = dbus_connection_preallocate_send (connection); 69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (preallocated == NULL) 69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 69329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 694056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington /* d->name may be NULL, but that should be OK */ 695056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington message = dbus_message_new (d->name, 69629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_ERROR_NO_MEMORY); 69729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 69829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 69929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 70029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 70129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 70229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 703f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington dbus_message_set_is_error (message, TRUE); 704056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 705056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington if (!dbus_message_set_sender (message, 706056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington DBUS_SERVICE_DBUS)) 707056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington { 708056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 709056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_message_unref (message); 710056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 711056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington } 712f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 71329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* set reply serial to placeholder value just so space is already allocated 71429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for it. 71529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 71629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (message, 14)) 71729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 71829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 71929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 72029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 72129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 72229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = message; 72429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = preallocated; 72529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 72729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 72829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 73029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection, 73129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 73229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 73329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 73429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 73529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 73629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 73729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 73829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->oom_message != NULL); 73929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 74029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* should always succeed since we set it to a placeholder earlier */ 74129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (d->oom_message, 74229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_get_serial (in_reply_to))) 74329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message"); 74429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 745056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL); 746056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 74729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, d->oom_preallocated, 74829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message, NULL); 74929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 75029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 75129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = NULL; 75229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = NULL; 75329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 75429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 7556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonvoid 7566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service_link (DBusConnection *connection, 7576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link) 75896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 75996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 76096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 76196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 76296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 76396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 7646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_append_link (&d->services_owned, link); 7656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 7666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 7676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 7686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service (DBusConnection *connection, 7696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusService *service) 7706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 7716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link; 7726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 7736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington link = _dbus_list_alloc_link (service); 7746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 7756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (link == NULL) 77696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 77796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 7786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington bus_connection_add_owned_service_link (connection, link); 7796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 78096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return TRUE; 78196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 78296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 78396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid 78496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection, 78596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 78696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 78796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 78896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 78996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 79096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 79196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 79296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_list_remove_last (&d->services_owned, service); 79396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 794aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 795aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t 796aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_set_name (DBusConnection *connection, 797aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const DBusString *name) 798aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 799aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 800aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 801aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 802aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 803aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d->name == NULL); 804aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 805fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_copy_data (name, &d->name)) 806aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return FALSE; 807aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 808fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_assert (d->name != NULL); 809fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington 810d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("Name %s assigned to %p\n", d->name, connection); 811d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 812aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 813aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 814aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 815aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char * 816aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection) 817aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 818aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 819aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 820aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 821aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 822aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 823aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return d->name; 824aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 825a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 8266be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington/** 8276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Transactions 8286be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * 8296be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Note that this is fairly fragile; in particular, don't try to use 8306be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * one transaction across any main loop iterations. 8316be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 8326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 83329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct 83429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 83529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 83629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 83729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 83829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend; 83929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtontypedef struct 8416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function; 8436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function; 8446be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data; 8456be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} CancelHook; 8466be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 84729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction 84829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 84929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *connections; 8506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 8516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *cancel_hooks; 85229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 85329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 85429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 85529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection, 85629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send) 85729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 85829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->message) 85929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (to_send->message); 86029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 86129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated) 86229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, to_send->preallocated); 86329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 86429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 86529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 86629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 8686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_cancel (void *element, 8696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 8706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 8726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Running transaction cancel hook\n"); 8746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->cancel_function) 8766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->cancel_function) (ch->data); 8776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 8786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 8806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_free (void *element, 8816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 8826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 8846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->free_data_function) 8866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->free_data_function) (ch->data); 8876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 8896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 8906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 8926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonfree_cancel_hooks (BusTransaction *transaction) 8936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 8956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_free, NULL); 8966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_clear (&transaction->cancel_hooks); 8986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 8996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 90029560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction* 9016ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context) 90229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 90329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 90429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 90529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = dbus_new0 (BusTransaction, 1); 90629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 90729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return NULL; 90829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 9096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction->context = context; 9106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 91129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return transaction; 91229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 91329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 9146ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 9156ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction *transaction) 9166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return transaction->context; 9186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9206ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 9216ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction *transaction) 9226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_connections (transaction->context); 9246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 92629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 92729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_message (BusTransaction *transaction, 92829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 92929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message) 93029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 93129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 93229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 93329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 93429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 93551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose (" trying to add %s %s to transaction%s\n", 93651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_get_is_error (message) ? "error" : 93751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_get_reply_serial (message) != 0 ? "reply" : 93851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington "message", 939ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_get_name (message), 940ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_get_is_connected (connection) ? 941ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington "" : " (disconnected)"); 942056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 943056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 944f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 94529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 94629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; /* silently ignore disconnected connections */ 94729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 94829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 94929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 95029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send = dbus_new (MessageToSend, 1); 95229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send == NULL) 95329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 95429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 95529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 95629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->preallocated = dbus_connection_preallocate_send (connection); 95829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated == NULL) 95929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 96029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 96129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 96229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 96329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 96429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_ref (message); 96529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->message = message; 96629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->transaction = transaction; 96729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 968d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("about to prepend message\n"); 969d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 97029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&d->transaction_messages, to_send)) 97129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 97229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 97329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 97429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 975d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 976d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("prepended message\n"); 97729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 97829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* See if we already had this connection in the list 97929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for this transaction. If we have a pending message, 98029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then we should already be in transaction->connections 98129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 98229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 98329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (link->data == to_send); 98429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_next_link (&d->transaction_messages, link); 98529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 98629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 98729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 98829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 98929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 99129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington break; 99229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 99429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 99529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (link == NULL) 99729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 99829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&transaction->connections, connection)) 99929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 100029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 100129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 100229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 100329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 100429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 100529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 100729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 100829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 101029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection, 101129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 101229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 101329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 101429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 101529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 101629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 101729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 101829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 101929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 102029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 102129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 102229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 102329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 102429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 102529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 102629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 102729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 102829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 102929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 103029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 103129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 103229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 103329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 103429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 103529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 103629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 103729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 103829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction) 103929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 104029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 1041ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1042ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: cancelled\n"); 104329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 104429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 104529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_cancel_transaction (connection, transaction); 104629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 104729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 104829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 10496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 10506be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_cancel, NULL); 10516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 10526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 10536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 105629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 105729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 105829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection, 105929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 106029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 106129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 106229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 106329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 106529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 106629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Send the queue in order (FIFO) */ 106829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_last_link (&d->transaction_messages); 106929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 107029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 107129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 107229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link); 107329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 107429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 107529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 107629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 107729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 107829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1079056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (m->message) != NULL); 1080056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 108129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, 108229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated, 108329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->message, 108429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL); 108529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 108629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated = NULL; /* so we don't double-free it */ 108729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 108829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 108929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 109029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 109129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = prev; 109229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 109329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 109429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 109529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 109629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction) 109729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 109829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* For each connection in transaction->connections 109929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * send the messages 110029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 110129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 1102ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1103ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: executing\n"); 110429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 110529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 110629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_execute_transaction (connection, transaction); 110729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 110829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 110929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 11106be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 11116be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 111229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 111329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 111429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 111529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 111629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection) 111729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 111829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 111929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 112029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 112129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 112229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 112329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 112429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((to_send = _dbus_list_get_first (&d->transaction_messages))) 112529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 112629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* only has an effect for the first MessageToSend listing this transaction */ 112729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&to_send->transaction->connections, 112829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection); 112929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 113029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 113129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 113229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 113329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 113429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 113529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 113629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply 113729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 113829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 113929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction *transaction, 114029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 114129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const DBusError *error, 114229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 114329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 114429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *reply; 114590ed1d84588a84697051e643175452c50d682eceHavoc Pennington 114629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (error != NULL); 114729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 114829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 114929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_error_reply (in_reply_to, 115029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->name, 115129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->message); 115229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 115329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 115429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1155e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS) || 1156e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington !bus_transaction_send_message (transaction, connection, reply)) 115729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 115829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 115929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 116029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 116129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1162e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (reply); 1163e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 116429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 1165a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 11666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 11686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_transaction_add_cancel_hook (BusTransaction *transaction, 11696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function, 11706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data, 11716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function) 11726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 11736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch; 11746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch = dbus_new (CancelHook, 1); 11766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch == NULL) 11776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 11786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->cancel_function = cancel_function; 11806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->data = data; 11816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->free_data_function = free_data_function; 11826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington /* It's important that the hooks get run in reverse order that they 11846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * were added 11856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 11866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!_dbus_list_prepend (&transaction->cancel_hooks, ch)) 11876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 11886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 11896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 11906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 11916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return TRUE; 11936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 1194