connection.c revision 3df260c07102745c5606c313af862558f105f83e
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; 51bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington BusClientPolicy *policy; 5296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData; 5396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 5496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) 5596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 56f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic dbus_bool_t 57f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_ref (void) 58f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 59f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot < 0) 60f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 61f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot = dbus_connection_allocate_data_slot (); 62f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 63f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot < 0) 64f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return FALSE; 65f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 66f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot_refcount == 0); 67f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 68f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 69f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_refcount += 1; 70f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 71f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return TRUE; 72f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 73f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 74f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 75f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 76f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_unref (void) 77f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 78f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot_refcount > 0); 79f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 80f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_refcount -= 1; 81f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 82f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot_refcount == 0) 83f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 84f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_connection_free_data_slot (connection_data_slot); 85f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot = -1; 86f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 87f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 88f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 89df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop* 901b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonconnection_get_loop (DBusConnection *connection) 911b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 921b08036103a70159e7a67b2349306710edcd6654Havoc Pennington BusConnectionData *d; 931b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 941b08036103a70159e7a67b2349306710edcd6654Havoc Pennington d = BUS_CONNECTION_DATA (connection); 951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_context_get_loop (d->connections->context); 971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 981b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 99fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 10029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection) 10196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 10296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 10396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service; 10496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 10596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 106d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_assert (d != NULL); 10796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 108d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n", 109d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington d->name ? d->name : "(inactive)"); 110d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Drop any service ownership. FIXME Unfortunately, this requires 11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * memory allocation and there doesn't seem to be a good way to 11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * handle it other than sleeping; we can't "fail" the operation of 11429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * disconnecting a client, and preallocating a broadcast "service is 11529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * now gone" message for every client-service pair seems kind of 11629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * involved. Probably we need to do that though, and also 11729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * extend BusTransaction to be able to revert generic 11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * stuff, not just sending a message (so we can e.g. revert 11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * removal of service owners). 12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 121ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((service = _dbus_list_get_last (&d->services_owned))) 122ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 123ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington BusTransaction *transaction; 124ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 125ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 126ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry: 127ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 128ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 129ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 130ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = NULL; 131ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (transaction == NULL) 132ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 133ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = bus_transaction_new (d->connections->context); 134df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 135ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 136ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 137ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_service_remove_owner (service, connection, 138ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction, &error)) 139ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 1406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 1416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 142ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 143ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 144ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 145ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_cancel_and_free (transaction); 146df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 147ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry; 148ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 149ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 1506be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 1516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Failed to remove service owner: %s %s\n", 1526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error.name, error.message); 1536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason"); 1546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 155ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 156ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 157ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_execute_and_free (transaction); 158ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 15996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 16039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_dispatch_remove_connection (connection); 161aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 16296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* no more watching */ 1633bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 164f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 1653bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 1663bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 1673bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 1683bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 1693bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 170f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 1713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 1723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 1733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 1743bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 17544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 17644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 1777caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 1787caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 1797caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 18044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_remove_transactions (connection); 1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_list_remove (&d->connections->list, connection); 1846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington /* frees "d" as side effect */ 18696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_set_data (connection, 18796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 18896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington NULL, NULL); 1896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 19096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_unref (connection); 19196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 19296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 193b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 19496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch *watch, 19596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington unsigned int condition, 19696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington void *data) 19796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 1983df260c07102745c5606c313af862558f105f83eHavoc Pennington /* FIXME this can be done in dbus-mainloop.c 1993df260c07102745c5606c313af862558f105f83eHavoc Pennington * if the code in activation.c for the babysitter 2003df260c07102745c5606c313af862558f105f83eHavoc Pennington * watch handler is fixed. 2013df260c07102745c5606c313af862558f105f83eHavoc Pennington */ 2023df260c07102745c5606c313af862558f105f83eHavoc Pennington 20351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#if 0 20451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Calling handle_watch\n"); 20551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#endif 2063df260c07102745c5606c313af862558f105f83eHavoc Pennington return dbus_watch_handle (watch, condition); 20796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 20896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 2093bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 21096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch *watch, 2111b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 21296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2141b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 215df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_watch (connection_get_loop (connection), 216df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection, 217df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington NULL); 21896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 21996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 22096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 22196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch *watch, 2221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 22396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 226df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_watch (connection_get_loop (connection), 227df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection); 22896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 22996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 23096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 2313bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout *timeout, 2323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington void *data) 2333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2343df260c07102745c5606c313af862558f105f83eHavoc Pennington /* DBusConnection *connection = data; */ 2354c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 236b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 2373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_timeout_handle (timeout); 2383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 2413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout *timeout, 2421b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 2433bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2451b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 246df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_timeout (connection_get_loop (connection), 247df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection, NULL); 2483bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2493bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 2513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout *timeout, 2521b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 2533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2541b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 256df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_timeout (connection_get_loop (connection), 257df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection); 2583bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2593bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2607caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtonstatic void 2617caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtondispatch_status_function (DBusConnection *connection, 2627caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusDispatchStatus new_status, 2637caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington void *data) 2647caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington{ 2657caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusLoop *loop = data; 2667caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 2677caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (new_status != DBUS_DISPATCH_COMPLETE) 2687caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 2697caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington while (!_dbus_loop_queue_dispatch (loop, connection)) 2707caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington _dbus_wait_for_memory (); 2717caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 2727caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington} 2737caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 274a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t 275a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonallow_user_function (DBusConnection *connection, 276a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long uid, 277a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington void *data) 278a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 279a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 280a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 281a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 282a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 283a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 284a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 285a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return bus_context_allow_user (d->connections->context, uid); 286a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 287a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 2883bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 28996a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data) 29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 29196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d = data; 29296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 29396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* services_owned should be NULL since we should be disconnected */ 29496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d->services_owned == NULL); 29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* similarly */ 29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->transaction_messages == NULL); 297aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated) 29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); 300f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_message) 30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 303a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 304a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy) 305bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington bus_client_policy_unref (d->policy); 306a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 307aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson dbus_free (d->name); 30896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 30996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 31096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 31196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3126ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 3136ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context) 31496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 31696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 317f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (!connection_data_slot_ref ()) 318f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return NULL; 31996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = dbus_new0 (BusConnections, 1); 3216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections == NULL) 322f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 323f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_unref (); 324f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return NULL; 325f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 3266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount = 1; 3286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->context = context; 3296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections; 3316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 3326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3336ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 3346ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections) 3356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 3366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 3376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount += 1; 3386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 3396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3406ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 3416ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections) 3426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 3436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 3446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount -= 1; 3456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections->refcount == 0) 3466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 347ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (connections->list != NULL) 348ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 349ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection; 350ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 351ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection = connections->list->data; 352ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 353ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 354ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_disconnect (connection); 355ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_connection_disconnected (connection); 356ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 357ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 3586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_list_clear (&connections->list); 3606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 361f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_free (connections); 362f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 363f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_unref (); 3646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 36596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 36696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 36796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 3686ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections, 3696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection) 37096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 37196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 372ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t retval; 373ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 3741b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson d = dbus_new0 (BusConnectionData, 1); 3751b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 37696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (d == NULL) 37796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 3796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d->connections = connections; 38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->connection = connection; 381f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 382f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot >= 0); 38396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 38496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!dbus_connection_set_data (connection, 38596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 38696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d, free_connection_data)) 38796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington { 38896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 38996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 39096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington } 391ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 392ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = FALSE; 39396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3943bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 3951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_watch, 3961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_watch, 397f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 3983bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 3993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 400ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 4013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 4023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 4031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_timeout, 4041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_timeout, 405f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 4063bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, NULL)) 407ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 4083bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 40944fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 41044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 41144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington allow_user_function, 41244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL); 4137caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 4147caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 4157caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dispatch_status_function, 4167caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_context_get_loop (connections->context), 4177caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL); 41896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 41939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Setup the connection with the dispatcher */ 42039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (!bus_dispatch_add_connection (connection)) 421ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 422ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 423ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!_dbus_list_append (&connections->list, connection)) 4243bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington { 425ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_dispatch_remove_connection (connection); 426ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 4273bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington } 4287caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 4297caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) 4307caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 4317caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection)) 4327caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 4337caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_dispatch_remove_connection (connection); 4347caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington goto out; 4357caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 4367caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 437ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_connection_ref (connection); 439ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = TRUE; 440ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 441ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 442ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!retval) 4431b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 444ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 445ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 446ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 447ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 448ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 449ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 450ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_timeout_functions (connection, 451ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 452ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 453ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 454ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 45544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 45644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 45744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 4581b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 4597caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 4607caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 4617caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 4621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (!dbus_connection_set_data (connection, 4631b08036103a70159e7a67b2349306710edcd6654Havoc Pennington connection_data_slot, 4641b08036103a70159e7a67b2349306710edcd6654Havoc Pennington NULL, NULL)) 4651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington _dbus_assert_not_reached ("failed to set connection data to null"); 466ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 467aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 468ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 46996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 47096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 471a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 4727c022a80c9b8c5b085514ea49f983c0489e945abHavoc Penningtonbus_connection_get_groups (DBusConnection *connection, 4737c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long **groups, 4747c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington int *n_groups) 475a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 476a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 4777c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long uid; 4787c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington DBusUserDatabase *user_database; 4797c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington 480a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 481a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 482a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 483a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 4847c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington user_database = bus_context_get_user_database (d->connections->context); 4857c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington 486a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = NULL; 487a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = 0; 488a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 4897c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 490a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 4917c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington if (!_dbus_user_database_get_groups (user_database, 4927c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington uid, groups, n_groups, 4937c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington NULL)) 494a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 4957c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Did not get any groups for UID %lu\n", 4967c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington uid); 4977c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return FALSE; 4987c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 4997c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 5007c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 5017c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Got %d groups for UID %lu\n", 5027c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington *n_groups, uid); 5037c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 504a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 505a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 5067c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 5077c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; /* successfully got 0 groups */ 508a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 509a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 510a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 511a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_is_in_group (DBusConnection *connection, 512a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long gid) 513a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 514a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int i; 5157c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long *group_ids; 516a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 517a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 518a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!bus_connection_get_groups (connection, &group_ids, &n_group_ids)) 519a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 520a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 521a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington i = 0; 522a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington while (i < n_group_ids) 523a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 524a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (group_ids[i] == gid) 5257c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 5267c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 5277c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 5287c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 529a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington ++i; 530a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 531a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 5327c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 533a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 534a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 535a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 536bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy* 537a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_policy (DBusConnection *connection) 538a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 539a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 540a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 541a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 542a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 543a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 544a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 545a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!dbus_connection_get_is_authenticated (connection)) 546a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 547a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_verbose ("Tried to get policy for unauthenticated connection!\n"); 548a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return NULL; 549a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 550a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 551a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* We do lazy creation of the policy because 552a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * it can only be done post-authentication. 553a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 554a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy == NULL) 555a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 556a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->policy = 557bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington bus_context_create_client_policy (d->connections->context, 558bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington connection); 559a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 560a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* we may have a NULL policy on OOM or error getting list of 561a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * groups for a user. In the latter case we don't handle it so 562a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * well currently, just keep pretending we're out of memory, 563a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * which is kind of bizarre. 564a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 565a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 566a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 567a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return d->policy; 568a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 5696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/** 5716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns 5726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating. 5736ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * 5746ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object 5756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function 5766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg 5776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */ 5786ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 5796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections *connections, 5806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionForeachFunction function, 5816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington void *data) 5826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *link; 5846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington link = _dbus_list_get_first_link (&connections->list); 5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington while (link != NULL) 5876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 5886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection = link->data; 5896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->list, link); 5906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!(* function) (connection, data)) 5926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington break; 5936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington link = next; 5956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 5966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 5976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5986ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 5996ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections) 6006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections->context; 6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6046ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection) 6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections->context; 6146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6166ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 6176ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection) 6186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections; 6266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6286ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry* 6296ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection) 6306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_registry (d->connections->context); 6386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6406ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation* 6416ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection) 6426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 6436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_activation (d->connections->context); 6506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 65229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 65329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus. 65429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * 65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection 65629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant 65729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 65829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection) 66029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return d != NULL && d->name != NULL; 66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection) 67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated != NULL) 68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington preallocated = dbus_connection_preallocate_send (connection); 68329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (preallocated == NULL) 68429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 686056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington /* d->name may be NULL, but that should be OK */ 687056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington message = dbus_message_new (d->name, 68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_ERROR_NO_MEMORY); 68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 69329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 69429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 695f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington dbus_message_set_is_error (message, TRUE); 696056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 697056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington if (!dbus_message_set_sender (message, 698056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington DBUS_SERVICE_DBUS)) 699056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington { 700056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 701056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_message_unref (message); 702056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 703056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington } 704f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 70529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* set reply serial to placeholder value just so space is already allocated 70629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for it. 70729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 70829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (message, 14)) 70929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 71029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 71129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 71229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 71329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 71429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 71529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = message; 71629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = preallocated; 71729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 71829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 71929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 72029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 72229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection, 72329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 72429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 72529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 72629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 72829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 73029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->oom_message != NULL); 73129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 73229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* should always succeed since we set it to a placeholder earlier */ 73329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (d->oom_message, 73429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_get_serial (in_reply_to))) 73529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message"); 73629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 737056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL); 738056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 73929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, d->oom_preallocated, 74029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message, NULL); 74129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 74229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 74329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = NULL; 74429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = NULL; 74529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 74629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 7476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonvoid 7486be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service_link (DBusConnection *connection, 7496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link) 75096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 75196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 75296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 75396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 75496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 75596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 7566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_append_link (&d->services_owned, link); 7576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 7586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 7596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 7606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service (DBusConnection *connection, 7616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusService *service) 7626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 7636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link; 7646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 7656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington link = _dbus_list_alloc_link (service); 7666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 7676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (link == NULL) 76896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 76996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 7706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington bus_connection_add_owned_service_link (connection, link); 7716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 77296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return TRUE; 77396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 77496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 77596a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid 77696a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection, 77796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 77896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 77996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 78096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 78196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 78296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 78396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 78496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_list_remove_last (&d->services_owned, service); 78596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 786aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 787aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t 788aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_set_name (DBusConnection *connection, 789aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const DBusString *name) 790aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 791aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 792aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 793aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 794aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 795aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d->name == NULL); 796aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 797fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_copy_data (name, &d->name)) 798aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return FALSE; 799aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 800fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_assert (d->name != NULL); 801fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington 802d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("Name %s assigned to %p\n", d->name, connection); 803d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 804aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 805aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 806aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 807aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char * 808aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection) 809aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 810aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 811aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 812aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 813aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 814aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 815aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return d->name; 816aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 817a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 8183df260c07102745c5606c313af862558f105f83eHavoc Pennington/* 8196be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Transactions 8206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * 8216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Note that this is fairly fragile; in particular, don't try to use 8226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * one transaction across any main loop iterations. 8236be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 8246be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 82529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct 82629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 82729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 82829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 82929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 83029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend; 83129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtontypedef struct 8336be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8346be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function; 8356be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function; 8366be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data; 8376be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} CancelHook; 8386be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 83929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction 84029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 84129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *connections; 8426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 8436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *cancel_hooks; 84429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 84529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 84629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 84729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection, 84829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send) 84929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 85029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->message) 85129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (to_send->message); 85229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 85329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated) 85429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, to_send->preallocated); 85529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 85629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 85729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 85829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 8606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_cancel (void *element, 8616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 8626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 8646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Running transaction cancel hook\n"); 8666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->cancel_function) 8686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->cancel_function) (ch->data); 8696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 8706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 8726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_free (void *element, 8736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 8746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 8766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->free_data_function) 8786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->free_data_function) (ch->data); 8796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 8816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 8826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 8846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonfree_cancel_hooks (BusTransaction *transaction) 8856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 8866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 8876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_free, NULL); 8886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 8896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_clear (&transaction->cancel_hooks); 8906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 8916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 89229560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction* 8936ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context) 89429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 89529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 89629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 89729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = dbus_new0 (BusTransaction, 1); 89829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 89929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return NULL; 90029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 9016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction->context = context; 9026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 90329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return transaction; 90429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 90529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 9066ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 9076ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction *transaction) 9086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return transaction->context; 9106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9126ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 9136ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction *transaction) 9146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_connections (transaction->context); 9166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 91829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 919777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send_from_driver (BusTransaction *transaction, 920777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 921777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 922777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{ 923777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* We have to set the sender to the driver, and have 924777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * to check security policy since it was not done in 925777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * dispatch.c 926777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 927777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington _dbus_verbose ("Sending %s from driver\n", 928777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_message_get_name (message)); 929777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 930777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 931777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return FALSE; 932777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 933777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* If security policy doesn't allow the message, we silently 934777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * eat it; the driver doesn't care about getting a reply. 935777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 936777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_context_check_security_policy (bus_transaction_get_context (transaction), 937777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington NULL, connection, message, NULL)) 938777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return TRUE; 939777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 940777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return bus_transaction_send (transaction, connection, message); 941777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington} 942777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 943777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t 944777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send (BusTransaction *transaction, 945777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 946777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 94729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 94829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 94929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 95029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 95129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose (" trying to add %s %s to transaction%s\n", 95351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_get_is_error (message) ? "error" : 954dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington dbus_message_get_reply_serial (message) != 0 ? "reply" : 95551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington "message", 956ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_get_name (message), 957ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_get_is_connected (connection) ? 958ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington "" : " (disconnected)"); 959056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 960056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 961f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 96229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 96329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; /* silently ignore disconnected connections */ 96429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 96529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 96629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 96729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 96829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send = dbus_new (MessageToSend, 1); 96929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send == NULL) 97029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 97129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 97229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 97329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 97429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->preallocated = dbus_connection_preallocate_send (connection); 97529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated == NULL) 97629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 97729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 97829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 97929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 98029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 98129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_ref (message); 98229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->message = message; 98329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->transaction = transaction; 98429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 985d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("about to prepend message\n"); 986d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 98729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&d->transaction_messages, to_send)) 98829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 98929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 99029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 99129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 992d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 993d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("prepended message\n"); 99429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* See if we already had this connection in the list 99629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for this transaction. If we have a pending message, 99729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then we should already be in transaction->connections 99829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 99929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 100029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (link->data == to_send); 100129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_next_link (&d->transaction_messages, link); 100229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 100329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 100429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 100529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 100629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 100829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington break; 100929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 101029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 101129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 101229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 101329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (link == NULL) 101429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 101529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&transaction->connections, connection)) 101629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 101729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 101829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 101929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 102029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 102129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 102229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 102329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 102429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 102529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 102629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 102729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection, 102829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 102929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 103029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 103129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 103229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 103329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 103429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 103529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 103629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 103729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 103829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 103929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 104029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 104129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 104229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 104329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 104429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 104529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 104629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 104729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 104829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 104929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 105029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 105129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 105229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 105329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction) 105629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 105729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 1058ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1059ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: cancelled\n"); 106029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 106229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_cancel_transaction (connection, transaction); 106329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 106529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 10666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 10676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_cancel, NULL); 10686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 10696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 10706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 107129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 107229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 107329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 107429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 107529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection, 107629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 107729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 107829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 107929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 108029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 108129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 108229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 108329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 108429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Send the queue in order (FIFO) */ 108529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_last_link (&d->transaction_messages); 108629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 108729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 108829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 108929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link); 109029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 109129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 109229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 109329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 109429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 109529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1096056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (m->message) != NULL); 1097056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 109829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, 109929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated, 110029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->message, 110129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL); 110229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 110329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated = NULL; /* so we don't double-free it */ 110429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 110529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 110629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 110729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 110829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = prev; 110929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 111029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 111129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 111229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 111329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction) 111429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 111529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* For each connection in transaction->connections 111629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * send the messages 111729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 111829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 1119ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1120ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: executing\n"); 112129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 112229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 112329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_execute_transaction (connection, transaction); 112429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 112529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 112629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 11276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 11286be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 112929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 113029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 113129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 113229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 113329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection) 113429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 113529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 113629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 113729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 113829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 113929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 114029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 114129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((to_send = _dbus_list_get_first (&d->transaction_messages))) 114229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 114329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* only has an effect for the first MessageToSend listing this transaction */ 114429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&to_send->transaction->connections, 114529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection); 114629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 114729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 114829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 114929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 115029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 115129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 115229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 115329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply 115429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 115529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 115629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction *transaction, 115729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 115829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const DBusError *error, 115929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 116029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 116129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *reply; 116290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 116329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (error != NULL); 116429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 116529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 116629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_error_reply (in_reply_to, 116729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->name, 116829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->message); 116929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 117029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 117129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1172777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 117329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 117429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 117529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 117629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 117729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1178e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (reply); 1179e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 118029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 1181a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 11826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 11846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_transaction_add_cancel_hook (BusTransaction *transaction, 11856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function, 11866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data, 11876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function) 11886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 11896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch; 11906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch = dbus_new (CancelHook, 1); 11926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch == NULL) 11936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 11946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->cancel_function = cancel_function; 11966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->data = data; 11976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->free_data_function = free_data_function; 11986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 11996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington /* It's important that the hooks get run in reverse order that they 12006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * were added 12016be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 12026be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!_dbus_list_prepend (&transaction->cancel_hooks, ch)) 12036be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 12046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 12056be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 12066be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 12076be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12086be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return TRUE; 12096be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 1210