connection.c revision e55fd2c6706e41f6933e1656ac3da7527ee2514f
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" 2596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "loop.h" 26a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington#include "policy.h" 2796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "services.h" 2829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington#include "utils.h" 2996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include <dbus/dbus-list.h> 3096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection); 3229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 336ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections 346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington int refcount; 366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *list; /**< List of all the connections */ 376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}; 396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 406ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic int connection_data_slot = -1; 41f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic int connection_data_slot_refcount = 0; 4296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct 4496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 4629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 4796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusList *services_owned; 48aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson char *name; 4929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */ 5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *oom_message; 5129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *oom_preallocated; 52a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long *group_ids; 53a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 54a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusPolicy *policy; 5596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData; 5696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 5796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) 5896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 59f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic dbus_bool_t 60f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_ref (void) 61f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 62f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot < 0) 63f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 64f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot = dbus_connection_allocate_data_slot (); 65f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 66f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot < 0) 67f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return FALSE; 68f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 69f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot_refcount == 0); 70f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 71f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 72f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_refcount += 1; 73f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 74f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return TRUE; 75f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 76f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 77f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 78f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 79f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_unref (void) 80f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 81f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot_refcount > 0); 82f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 83f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_refcount -= 1; 84f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 85f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (connection_data_slot_refcount == 0) 86f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 87f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_connection_free_data_slot (connection_data_slot); 88f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot = -1; 89f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 90f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 91f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 92fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 9329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection) 9496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 9596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 9696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service; 9796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 9896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 99d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_assert (d != NULL); 10096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 101d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n", 102d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington d->name ? d->name : "(inactive)"); 103d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 10429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Drop any service ownership. FIXME Unfortunately, this requires 10529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * memory allocation and there doesn't seem to be a good way to 10629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * handle it other than sleeping; we can't "fail" the operation of 10729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * disconnecting a client, and preallocating a broadcast "service is 10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * now gone" message for every client-service pair seems kind of 10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * involved. Probably we need to do that though, and also 11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * extend BusTransaction to be able to revert generic 11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * stuff, not just sending a message (so we can e.g. revert 11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * removal of service owners). 11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 114ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((service = _dbus_list_get_last (&d->services_owned))) 115ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 116ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington BusTransaction *transaction; 117ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 118ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 119ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry: 120ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 121ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 122ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 123ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = NULL; 124ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (transaction == NULL) 125ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 126ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = bus_transaction_new (d->connections->context); 127ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_wait_for_memory (); 128ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 129ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 130ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_service_remove_owner (service, connection, 131ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction, &error)) 132ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 133ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 134ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 135ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 136ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_cancel_and_free (transaction); 137ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_wait_for_memory (); 138ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry; 139ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 140ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 141ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason"); 142ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 143ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 144ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_execute_and_free (transaction); 145ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 14696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 14739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_dispatch_remove_connection (connection); 148aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 14996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* no more watching */ 1503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 151f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 1523bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 1533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 1543bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 1553bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 1563bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 157f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 1583bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 1593bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 1603bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 1613bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 16244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 16344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 16444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_remove_transactions (connection); 1666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_list_remove (&d->connections->list, connection); 1686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington /* frees "d" as side effect */ 17096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_set_data (connection, 17196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 17296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington NULL, NULL); 1736ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 17496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_unref (connection); 17596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 17696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 177b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 17896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch *watch, 17996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington unsigned int condition, 18096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington void *data) 18196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 18296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusConnection *connection = data; 183b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington dbus_bool_t retval; 18496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 18539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson dbus_connection_ref (connection); 18639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 187b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington retval = dbus_connection_handle_watch (connection, watch, condition); 188aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 189ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington bus_connection_dispatch_all_messages (connection); 190ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 19139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson dbus_connection_unref (connection); 192b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 193b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington return retval; 19496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 19596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 1963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 19796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch *watch, 19896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusConnection *connection) 19996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2003bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington return bus_loop_add_watch (watch, connection_watch_callback, connection, 2013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL); 20296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 20396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 20496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 20596a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch *watch, 20696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusConnection *connection) 20796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 20896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington bus_loop_remove_watch (watch, connection_watch_callback, connection); 20996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 21096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 21196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 2123bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout *timeout, 2133bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington void *data) 2143bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2154c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington DBusConnection *connection = data; 2164c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 2174c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington dbus_connection_ref (connection); 218b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington 219b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 2203bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_timeout_handle (timeout); 2214c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 222ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington bus_connection_dispatch_all_messages (connection); 223ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington 2244c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington dbus_connection_unref (connection); 2253bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2263bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2273bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 2283bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout *timeout, 2293bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusConnection *connection) 2303bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2313bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington return bus_loop_add_timeout (timeout, connection_timeout_callback, connection, NULL); 2323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2343bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 2353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout *timeout, 2363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusConnection *connection) 2373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington bus_loop_remove_timeout (timeout, connection_timeout_callback, connection); 2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 241a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t 242a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonallow_user_function (DBusConnection *connection, 243a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long uid, 244a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington void *data) 245a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 246a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 247a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 248a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 249a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 250a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 25144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 25244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington return TRUE; /* FIXME - this is just until we can parse a config file */ 253a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 254a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return bus_context_allow_user (d->connections->context, uid); 255a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 256a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 2573bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 25896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data) 25996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 26096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d = data; 26196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 26296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* services_owned should be NULL since we should be disconnected */ 26396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d->services_owned == NULL); 26429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* similarly */ 26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->transaction_messages == NULL); 266aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated) 26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); 269f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_message) 27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 272a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 273a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy) 274a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington bus_policy_unref (d->policy); 275a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 276a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington dbus_free (d->group_ids); 27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 278aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson dbus_free (d->name); 27996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 28096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 28196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 28296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 2836ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 2846ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context) 28596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 28796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 288f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (!connection_data_slot_ref ()) 289f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return NULL; 29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 2916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = dbus_new0 (BusConnections, 1); 2926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections == NULL) 293f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 294f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_unref (); 295f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return NULL; 296f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 2976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 2986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount = 1; 2996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->context = context; 3006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections; 3026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 3036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3046ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 3056ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections) 3066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 3076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 3086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount += 1; 3096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3116ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 3126ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections) 3136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 3146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 3156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount -= 1; 3166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections->refcount == 0) 3176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 318ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (connections->list != NULL) 319ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 320ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection; 321ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 322ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection = connections->list->data; 323ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 324ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 325ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_disconnect (connection); 326ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_connection_disconnected (connection); 327ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 328ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 3296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_list_clear (&connections->list); 3316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 332f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_free (connections); 333f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 334f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot_unref (); 3356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 33696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 33796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 33896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 3396ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections, 3406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection) 34196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 34296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 343ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t retval; 344ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 3451b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson d = dbus_new0 (BusConnectionData, 1); 3461b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 34796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (d == NULL) 34896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 3506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d->connections = connections; 35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->connection = connection; 352f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 353f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot >= 0); 35496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 35596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!dbus_connection_set_data (connection, 35696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 35796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d, free_connection_data)) 35896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington { 35996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 36096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 36196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington } 362ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 363ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = FALSE; 364a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 365a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->n_group_ids = 0; 366a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->group_ids = NULL; 36796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3683bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 3693bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington (DBusAddWatchFunction) add_connection_watch, 3703bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington (DBusRemoveWatchFunction) remove_connection_watch, 371f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 3723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 3733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 374ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 3753bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3763bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 3773bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington (DBusAddTimeoutFunction) add_connection_timeout, 3783bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington (DBusRemoveTimeoutFunction) remove_connection_timeout, 379f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 3803bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, NULL)) 381ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 3823bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 38344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 38444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 38544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington allow_user_function, 38644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL); 38796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 38839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Setup the connection with the dispatcher */ 38939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (!bus_dispatch_add_connection (connection)) 390ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 391ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 392ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!_dbus_list_append (&connections->list, connection)) 3933bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington { 394ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_dispatch_remove_connection (connection); 395ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 3963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington } 397ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 3983bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_connection_ref (connection); 399ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = TRUE; 400ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 401ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 402ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!retval) 403ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 404f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (!dbus_connection_set_data (connection, 405f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington connection_data_slot, 406f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington NULL, NULL)) 407f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert_not_reached ("failed to set connection data to null"); 408f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 409ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 410ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 411ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 412ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 413ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 414ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 415ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_timeout_functions (connection, 416ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 417ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 418ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 419ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 42044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 42144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 42244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 423ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 424aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 425ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 42696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 42796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 428a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 429a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_groups (DBusConnection *connection, 430a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington const unsigned long **groups, 431a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int *n_groups) 432a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 433a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 434a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 435a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 436a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 437a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 438a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 439a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = NULL; 440a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = 0; 441a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 442a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* we do a lazy lookup on groups a user is in for two reasons: 443a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * 1) we can't do it on connection setup since the user 444a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * hasn't authenticated and 2) it might be expensive 445a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * and we don't need to do it if there are no group-based 446a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * rules in the config file 447a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 448a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 449a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->n_group_ids == 0) 450a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 451a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long uid; 452a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 453a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 454a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 455a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!_dbus_get_groups (uid, &d->group_ids, &d->n_group_ids)) 456a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 457a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_verbose ("Did not get any groups for UID %lu\n", 458a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington uid); 459a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 460a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 461a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 462a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 463a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 464a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = d->group_ids; 465a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = d->n_group_ids; 466a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 467a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return TRUE; 468a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 469a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 470a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 471a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_is_in_group (DBusConnection *connection, 472a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long gid) 473a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 474a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int i; 475a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington const unsigned long *group_ids; 476a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 477a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 478a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!bus_connection_get_groups (connection, &group_ids, &n_group_ids)) 479a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 480a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 481a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington i = 0; 482a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington while (i < n_group_ids) 483a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 484a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (group_ids[i] == gid) 485a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return TRUE; 486a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington ++i; 487a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 488a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 489a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 490a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 491a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 492a26607ab68bf0878f23d2dbddec781b4b760d034Havoc PenningtonBusPolicy* 493a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_policy (DBusConnection *connection) 494a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 495a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 496a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 497a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 498a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 499a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 500a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 501a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (!dbus_connection_get_is_authenticated (connection)) 502a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 503a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_verbose ("Tried to get policy for unauthenticated connection!\n"); 504a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return NULL; 505a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 506a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 507a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* We do lazy creation of the policy because 508a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * it can only be done post-authentication. 509a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 510a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy == NULL) 511a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 512a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d->policy = 513a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington bus_context_create_connection_policy (d->connections->context, 514a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington connection); 515a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 516a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington /* we may have a NULL policy on OOM or error getting list of 517a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * groups for a user. In the latter case we don't handle it so 518a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * well currently, just keep pretending we're out of memory, 519a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington * which is kind of bizarre. 520a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington */ 521a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 522a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 523a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return d->policy; 524a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 5256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/** 5276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns 5286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating. 5296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * 5306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object 5316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function 5326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg 5336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */ 5346ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 5356ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections *connections, 5366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionForeachFunction function, 5376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington void *data) 5386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *link; 5406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington link = _dbus_list_get_first_link (&connections->list); 5426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington while (link != NULL) 5436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 5446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection = link->data; 5456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->list, link); 5466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!(* function) (connection, data)) 5486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington break; 5496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington link = next; 5516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 5526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 5536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5546ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 5556ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections) 5566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections->context; 5586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 5596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5606ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 5616ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection) 5626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 5646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 5666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 5686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections->context; 5706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 5716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5726ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 5736ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection) 5746ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 5766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 5786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 5806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections; 5826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 5836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5846ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry* 5856ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection) 5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 5886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 5906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 5926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_registry (d->connections->context); 5946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 5956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5966ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation* 5976ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection) 5986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 5996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 6006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 6046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_activation (d->connections->context); 6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 6076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus. 61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * 61129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection 61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant 61329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 61429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection) 61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 61929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 62029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 62129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return d != NULL && d->name != NULL; 62229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 62329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 62429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 62529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection) 62629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 63229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 63329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 63429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 63529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated != NULL) 63629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 63729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 63829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington preallocated = dbus_connection_preallocate_send (connection); 63929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (preallocated == NULL) 64029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 642056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington /* d->name may be NULL, but that should be OK */ 643056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington message = dbus_message_new (d->name, 64429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_ERROR_NO_MEMORY); 64529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 64629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 64729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 64829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 64929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 651f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington dbus_message_set_is_error (message, TRUE); 652056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 653056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington if (!dbus_message_set_sender (message, 654056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington DBUS_SERVICE_DBUS)) 655056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington { 656056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 657056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_message_unref (message); 658056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 659056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington } 660f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* set reply serial to placeholder value just so space is already allocated 66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for it. 66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (message, 14)) 66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = message; 67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = preallocated; 67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection, 67929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 68429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 68629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->oom_message != NULL); 68729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* should always succeed since we set it to a placeholder earlier */ 68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (d->oom_message, 69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_get_serial (in_reply_to))) 69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message"); 69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 693056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL); 694056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 69529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, d->oom_preallocated, 69629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message, NULL); 69729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 69829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 69929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = NULL; 70029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = NULL; 70129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 70229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 70396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 70496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_add_owned_service (DBusConnection *connection, 70596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 70696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 70796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 70896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 70996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 71096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 71196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 71296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!_dbus_list_append (&d->services_owned, 71396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington service)) 71496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 71596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 71696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return TRUE; 71796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 71896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 71996a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid 72096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection, 72196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 72296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 72396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 72496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 72596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 72696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 72796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 72896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_list_remove_last (&d->services_owned, service); 72996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 730aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 731aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t 732aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_set_name (DBusConnection *connection, 733aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const DBusString *name) 734aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 735aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 736aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 737aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 738aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 739aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d->name == NULL); 740aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 741fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_copy_data (name, &d->name)) 742aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return FALSE; 743aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 744fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_assert (d->name != NULL); 745fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington 746d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("Name %s assigned to %p\n", d->name, connection); 747d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 748aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 749aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 750aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 751aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char * 752aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection) 753aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 754aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 755aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 756aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 757aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 758aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 759aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return d->name; 760aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 761a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 76229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct 76329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 76429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 76529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 76629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 76729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend; 76829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 76929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction 77029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 77129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *connections; 7726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 77329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 77429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 77529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 77629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection, 77729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send) 77829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 77929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->message) 78029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (to_send->message); 78129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 78229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated) 78329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, to_send->preallocated); 78429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 78529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 78629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 78729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 78829560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction* 7896ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context) 79029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 79129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 79229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 79329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = dbus_new0 (BusTransaction, 1); 79429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 79529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return NULL; 79629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 7976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction->context = context; 7986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 79929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return transaction; 80029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 80129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8026ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 8036ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction *transaction) 8046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 8056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return transaction->context; 8066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 8076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8086ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 8096ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction *transaction) 8106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 8116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_connections (transaction->context); 8126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 8136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 81429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 81529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_message (BusTransaction *transaction, 81629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 81729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message) 81829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 81929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 82029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 82129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 82229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 823ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose (" trying to add message %s to transaction%s\n", 824ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_get_name (message), 825ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_get_is_connected (connection) ? 826ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington "" : " (disconnected)"); 827056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 828056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 829f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 83029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 83129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; /* silently ignore disconnected connections */ 83229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 83329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 83429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 83529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 83629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send = dbus_new (MessageToSend, 1); 83729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send == NULL) 83829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 83929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 84029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 84129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 84229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->preallocated = dbus_connection_preallocate_send (connection); 84329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated == NULL) 84429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 84529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 84629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 84729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 84829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 84929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_ref (message); 85029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->message = message; 85129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->transaction = transaction; 85229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 853d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("about to prepend message\n"); 854d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 85529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&d->transaction_messages, to_send)) 85629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 85729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 85829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 85929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 860d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 861d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("prepended message\n"); 86229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 86329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* See if we already had this connection in the list 86429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for this transaction. If we have a pending message, 86529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then we should already be in transaction->connections 86629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 86729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 86829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (link->data == to_send); 86929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_next_link (&d->transaction_messages, link); 87029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 87129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 87229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 87329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 87429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 87529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 87629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington break; 87729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 87829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 87929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 88029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 88129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (link == NULL) 88229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 88329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&transaction->connections, connection)) 88429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 88529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 88629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 88729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 88829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 88929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 89029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 89129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 89229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 89329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 89429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 89529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection, 89629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 89729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 89829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 89929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 90029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 90129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 90229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 90329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 90429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 90529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 90629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 90729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 90829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 90929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 91029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 91129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 91229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 91329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 91429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 91529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 91629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 91729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 91829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 91929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 92029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 92129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 92229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 92329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction) 92429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 92529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 926ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 927ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: cancelled\n"); 92829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 92929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 93029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_cancel_transaction (connection, transaction); 93129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 93229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 93329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 93429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 93529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 93629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 93729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 93829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection, 93929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 94029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 94129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 94229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 94329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 94429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 94529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 94629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 94729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Send the queue in order (FIFO) */ 94829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_last_link (&d->transaction_messages); 94929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 95029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 95129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 95229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link); 95329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 95529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 95629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 95729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 95829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 959056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (m->message) != NULL); 960056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 96129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, 96229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated, 96329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->message, 96429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL); 96529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 96629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated = NULL; /* so we don't double-free it */ 96729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 96829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 96929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 97029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 97129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = prev; 97229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 97329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 97429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 97529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 97629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction) 97729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 97829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* For each connection in transaction->connections 97929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * send the messages 98029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 98129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 982ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 983ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: executing\n"); 98429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 98529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 98629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_execute_transaction (connection, transaction); 98729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 98829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 98929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 99129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 99229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 99429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection) 99529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 99629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 99729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 99829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 100029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 100129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((to_send = _dbus_list_get_first (&d->transaction_messages))) 100329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 100429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* only has an effect for the first MessageToSend listing this transaction */ 100529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&to_send->transaction->connections, 100629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection); 100729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 100929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 101029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 101129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 101229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 101329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 101429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply 101529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 101629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 101729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction *transaction, 101829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 101929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const DBusError *error, 102029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 102129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 102229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *reply; 102390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 102429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (error != NULL); 102529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 102629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 102729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_error_reply (in_reply_to, 102829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->name, 102929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->message); 103029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 103129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 103229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1033e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS) || 1034e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington !bus_transaction_send_message (transaction, connection, reply)) 103529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 103629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 103729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 103829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 103929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1040e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (reply); 1041e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 104229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 1043a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 1044