connection.c revision 6843ad31769c088ca259020fd9ea8dfb3a51f68e
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> 29983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington#include <dbus/dbus-hash.h> 301820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington#include <dbus/dbus-timeout.h> 3196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection); 3329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 346ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections 356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington int refcount; 37983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *completed; /**< List of all completed connections */ 38983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int n_completed; /**< Length of completed list */ 39983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *incomplete; /**< List of all not-yet-active connections */ 40983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int n_incomplete; /**< Length of incomplete list */ 416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 42983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusHashTable *completed_by_user; /**< Number of completed connections for each UID */ 431820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington DBusTimeout *expire_timeout; /**< Timeout for expiring incomplete connections. */ 446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}; 456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 466843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Penningtonstatic dbus_int32_t connection_data_slot = -1; 4796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct 4996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 51983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link_in_connection_list; 5229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 5396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusList *services_owned; 54b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington int n_services_owned; 55aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson char *name; 5629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */ 5729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *oom_message; 5829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *oom_preallocated; 59bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington BusClientPolicy *policy; 601820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 611820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington long connection_tv_sec; /**< Time when we connected (seconds component) */ 621820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington long connection_tv_usec; /**< Time when we connected (microsec component) */ 6396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData; 6496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 651820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic dbus_bool_t expire_incomplete_timeout (void *data); 661820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 6796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) 6896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 69df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop* 701b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonconnection_get_loop (DBusConnection *connection) 711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington BusConnectionData *d; 731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 741b08036103a70159e7a67b2349306710edcd6654Havoc Pennington d = BUS_CONNECTION_DATA (connection); 751b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 761b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_context_get_loop (d->connections->context); 771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 781b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 79983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 80983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic int 81983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonget_connections_for_uid (BusConnections *connections, 82983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_uid_t uid) 83983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 84983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *val; 85983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int current_count; 86983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 87983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* val is NULL is 0 when it isn't in the hash yet */ 88983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 89983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington val = _dbus_hash_table_lookup_ulong (connections->completed_by_user, 90983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid); 91983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 92983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count = _DBUS_POINTER_TO_INT (val); 93983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 94983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return current_count; 95983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 96983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 97983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 98983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonadjust_connections_for_uid (BusConnections *connections, 99983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_uid_t uid, 100983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int adjustment) 101983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 102983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int current_count; 103983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 104983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count = get_connections_for_uid (connections, uid); 105983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 106983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_verbose ("Adjusting connection count for UID " DBUS_UID_FORMAT 107983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington ": was %d adjustment %d making %d\n", 108983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, current_count, adjustment, current_count + adjustment); 109983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 110983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (current_count >= 0); 111983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 112983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count += adjustment; 113983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 114983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (current_count >= 0); 115983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 116983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (current_count == 0) 117983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 118983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_hash_table_remove_ulong (connections->completed_by_user, uid); 119983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 120983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 121983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington else 122983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 123983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_bool_t retval; 124983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 125983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington retval = _dbus_hash_table_insert_ulong (connections->completed_by_user, 126983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, _DBUS_INT_TO_POINTER (current_count)); 127983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 128983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* only positive adjustment can fail as otherwise 129983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * a hash entry should already exist 130983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 131983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (adjustment > 0 || 132983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington (adjustment <= 0 && retval)); 133983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 134983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return retval; 135983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 136983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 137983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 138fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 13929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection) 14096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 14196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 14296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service; 14396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 14496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 145d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_assert (d != NULL); 14696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 147d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n", 148d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington d->name ? d->name : "(inactive)"); 149d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 15029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Drop any service ownership. FIXME Unfortunately, this requires 15129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * memory allocation and there doesn't seem to be a good way to 15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * handle it other than sleeping; we can't "fail" the operation of 15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * disconnecting a client, and preallocating a broadcast "service is 15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * now gone" message for every client-service pair seems kind of 1551820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * involved. Probably we need to do that though. 15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 157ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((service = _dbus_list_get_last (&d->services_owned))) 158ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 159ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington BusTransaction *transaction; 160ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 161ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 162ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry: 163ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 164ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 165ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 166ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = NULL; 167ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while (transaction == NULL) 168ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 169ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction = bus_transaction_new (d->connections->context); 170df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 171ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 172ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 173ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_service_remove_owner (service, connection, 174ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction, &error)) 175ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 1766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 1776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 178ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 179ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 180ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 181ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_cancel_and_free (transaction); 182df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 183ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry; 184ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 185ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 1866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 1876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Failed to remove service owner: %s %s\n", 1886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error.name, error.message); 1896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason"); 1906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 191ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 192ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 193ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_execute_and_free (transaction); 194ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 19596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 19639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_dispatch_remove_connection (connection); 197aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 19896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* no more watching */ 1993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 200f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 2013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 2023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 2033bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 2043bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2053bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 206f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 2073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 2083bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 2093bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 2103bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 21144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 21244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 2137caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 2147caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 2157caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 21644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 21729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_remove_transactions (connection); 2186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 219983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list != NULL) 220983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 221983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->name != NULL) 222983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 223983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 224983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 225983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_remove_link (&d->connections->completed, d->link_in_connection_list); 226983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = NULL; 227983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_completed -= 1; 2286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 229983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 230983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 231983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!adjust_connections_for_uid (d->connections, 232983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, -1)) 233983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert_not_reached ("adjusting downward should never fail"); 234983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 235983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 236983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington else 237983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 238983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_remove_link (&d->connections->incomplete, d->link_in_connection_list); 239983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = NULL; 240983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_incomplete -= 1; 241983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 242983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 243983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_incomplete >= 0); 244983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_completed >= 0); 245983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 246983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 2476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington /* frees "d" as side effect */ 24896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_set_data (connection, 24996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 25096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington NULL, NULL); 2516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 25296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_unref (connection); 25396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 25496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 255b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 25696a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch *watch, 25796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington unsigned int condition, 25896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington void *data) 25996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2603df260c07102745c5606c313af862558f105f83eHavoc Pennington /* FIXME this can be done in dbus-mainloop.c 261ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington * if the code in activation.c for the babysitter 262ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington * watch handler is fixed. 263ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington */ 2643df260c07102745c5606c313af862558f105f83eHavoc Pennington 26551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#if 0 26651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Calling handle_watch\n"); 26751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#endif 2683df260c07102745c5606c313af862558f105f83eHavoc Pennington return dbus_watch_handle (watch, condition); 26996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 27096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 2713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 27296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch *watch, 2731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 27496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2751b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2761b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 277df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_watch (connection_get_loop (connection), 278df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection, 279df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington NULL); 28096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 28196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 28296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 28396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch *watch, 2841b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 28596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2861b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 2871b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 288df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_watch (connection_get_loop (connection), 289df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection); 29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 29196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 29296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 2933bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout *timeout, 2943bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington void *data) 2953bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 2963df260c07102745c5606c313af862558f105f83eHavoc Pennington /* DBusConnection *connection = data; */ 2974c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 298b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 2993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_timeout_handle (timeout); 3003bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 3033bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout *timeout, 3041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 3053bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 308df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_timeout (connection_get_loop (connection), 309df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection, NULL); 3103bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3113bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3123bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 3133bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout *timeout, 3141b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 3153bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 318df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_timeout (connection_get_loop (connection), 319df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection); 3203bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3213bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3227caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtonstatic void 3237caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtondispatch_status_function (DBusConnection *connection, 3247caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusDispatchStatus new_status, 3257caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington void *data) 3267caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington{ 3277caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusLoop *loop = data; 3287caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 3297caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (new_status != DBUS_DISPATCH_COMPLETE) 3307caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 3317caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington while (!_dbus_loop_queue_dispatch (loop, connection)) 3327caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington _dbus_wait_for_memory (); 3337caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 3347caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington} 3357caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 336a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t 337a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonallow_user_function (DBusConnection *connection, 338a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long uid, 339a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington void *data) 340a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 341a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 342a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 343a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 344a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 345a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 346a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 347a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return bus_context_allow_user (d->connections->context, uid); 348a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 349a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 3503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 35196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data) 35296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 35396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d = data; 35496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 35596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* services_owned should be NULL since we should be disconnected */ 35696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d->services_owned == NULL); 357b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d->n_services_owned == 0); 35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* similarly */ 35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->transaction_messages == NULL); 360aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated) 36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); 363f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_message) 36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 366a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 367a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy) 368bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington bus_client_policy_unref (d->policy); 369a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 370aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson dbus_free (d->name); 37196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 37296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 37396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 37496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3751820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic void 3761820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtoncall_timeout_callback (DBusTimeout *timeout, 3771820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington void *data) 3781820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 3791820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 3801820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington dbus_timeout_handle (timeout); 3811820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 3821820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 3836ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 3846ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context) 38596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 38796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3886843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington if (!dbus_connection_allocate_data_slot (&connection_data_slot)) 3891820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_0; 39096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = dbus_new0 (BusConnections, 1); 3926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections == NULL) 3931820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_1; 394983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 395983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections->completed_by_user = _dbus_hash_table_new (DBUS_HASH_ULONG, 396983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington NULL, NULL); 397983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->completed_by_user == NULL) 3981820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_2; 3991820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4001820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout = _dbus_timeout_new (100, /* irrelevant */ 4011820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington expire_incomplete_timeout, 4021820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections, NULL); 4031820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (connections->expire_timeout == NULL) 4041820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_3; 4051820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4061820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_set_enabled (connections->expire_timeout, FALSE); 4071820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4081820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (!_dbus_loop_add_timeout (bus_context_get_loop (context), 4091820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout, 4101820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington call_timeout_callback, NULL, NULL)) 4111820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_4; 4126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount = 1; 4146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->context = context; 4156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections; 4171820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4181820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_4: 4191820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_unref (connections->expire_timeout); 4201820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_3: 4211820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_hash_table_unref (connections->completed_by_user); 4221820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_2: 4231820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington dbus_free (connections); 4241820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_1: 4256843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&connection_data_slot); 4261820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_0: 4271820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington return NULL; 4286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 4296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4306ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 4316ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections) 4326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 4336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 4346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount += 1; 4356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 4366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4376ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 4386ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections) 4396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 4406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 4416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount -= 1; 4426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections->refcount == 0) 4436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 444983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* drop all incomplete */ 445983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (connections->incomplete != NULL) 446ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 447ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection; 448ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 449983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connection = connections->incomplete->data; 450ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 451ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 452ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_disconnect (connection); 453ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_connection_disconnected (connection); 454ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 455ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 456983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 457983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->n_incomplete == 0); 4586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 459983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* drop all real connections */ 460983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (connections->completed != NULL) 461983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 462983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection; 463983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 464983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connection = connections->completed->data; 465983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 466983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_connection_ref (connection); 467983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_connection_disconnect (connection); 468983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_connection_disconnected (connection); 469983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_connection_unref (connection); 470983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 471983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 472983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->n_completed == 0); 473983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 4741820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_loop_remove_timeout (bus_context_get_loop (connections->context), 4751820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout, 4761820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington call_timeout_callback, NULL); 4771820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4781820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_unref (connections->expire_timeout); 4791820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 480983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_hash_table_unref (connections->completed_by_user); 4816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 482f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_free (connections); 483f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 4846843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&connection_data_slot); 4856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 48696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 48796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 48896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 4896ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections, 4906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection) 49196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 49296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 493ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t retval; 494ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4951b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson d = dbus_new0 (BusConnectionData, 1); 4961b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 49796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (d == NULL) 49896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 49929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 5006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d->connections = connections; 50129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->connection = connection; 502d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 5031820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_get_current_time (&d->connection_tv_sec, 5041820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington &d->connection_tv_usec); 5051820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 506f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot >= 0); 50796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 50896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!dbus_connection_set_data (connection, 50996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 51096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d, free_connection_data)) 51196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington { 51296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 51396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 51496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington } 515ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 516ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = FALSE; 51796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 5183bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 5191b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_watch, 5201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_watch, 521f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 5223bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 5233bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 524ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 5253bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 5263bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 5271b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_timeout, 5281b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_timeout, 529f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 5303bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, NULL)) 531ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 532983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 53344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 53444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington allow_user_function, 53544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL); 5367caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 5377caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 5387caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dispatch_status_function, 5397caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_context_get_loop (connections->context), 5407caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL); 541983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 542983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = _dbus_list_alloc_link (connection); 543983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list == NULL) 544983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington goto out; 54596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 54639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Setup the connection with the dispatcher */ 54739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (!bus_dispatch_add_connection (connection)) 548ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 5497caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 5507caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) 5517caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 5527caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection)) 5537caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 5547caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_dispatch_remove_connection (connection); 5557caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington goto out; 5567caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 5577caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 558983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 559983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_append_link (&connections->incomplete, d->link_in_connection_list); 560983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections->n_incomplete += 1; 561ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 5623bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_connection_ref (connection); 563983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 564983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Note that we might disconnect ourselves here, but it only takes 5651820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * effect on return to the main loop. We call this to free up 5661820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * expired connections if possible, and to queue the timeout for our 5671820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * own expiration. 5681820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington */ 5691820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington bus_connections_expire_incomplete (connections); 5701820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 5711820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* And we might also disconnect ourselves here, but again it 5721820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * only takes effect on return to main loop. 573983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 574983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->n_incomplete > 575983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_incomplete_connections (connections->context)) 576983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 577983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_verbose ("Number of incomplete connections exceeds max, dropping oldest one\n"); 578983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 579983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->incomplete != NULL); 580983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Disconnect the oldest unauthenticated connection. FIXME 581983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * would it be more secure to drop a *random* connection? This 582983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * algorithm seems to mean that if someone can create new 583983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * connections quickly enough, they can keep anyone else from 584983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * completing authentication. But random may or may not really 585983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * help with that, a more elaborate solution might be required. 586983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 587983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_connection_disconnect (connections->incomplete->data); 588983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 589983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 590ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = TRUE; 591ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 592ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 593ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!retval) 594983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 595ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 596ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 597ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 598ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 599ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 600ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 601ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_timeout_functions (connection, 602ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 603ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 604ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 605ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 60644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 60744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 60844fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 6091b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 6107caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 6117caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 612983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 613983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list != NULL) 614983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 615983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->link_in_connection_list->next == NULL); 616983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->link_in_connection_list->prev == NULL); 617983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_free_link (d->link_in_connection_list); 618d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington d->link_in_connection_list = NULL; 619983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 620d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 621d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington if (!dbus_connection_set_data (connection, 622d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington connection_data_slot, 623d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington NULL, NULL)) 624d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington _dbus_assert_not_reached ("failed to set connection data to null"); 625d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 626d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington /* "d" has now been freed */ 627ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 628aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 629ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 63096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 63196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 6321820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonvoid 6331820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonbus_connections_expire_incomplete (BusConnections *connections) 6341820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 6351820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington int next_interval; 6361820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 6371820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington next_interval = -1; 6381820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 639b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington if (connections->incomplete != NULL) 6401820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington { 641b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington long tv_sec, tv_usec; 642b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusList *link; 643b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington int auth_timeout; 6441820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 645b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_get_current_time (&tv_sec, &tv_usec); 646b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington auth_timeout = bus_context_get_auth_timeout (connections->context); 647b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 648b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington link = _dbus_list_get_first_link (&connections->incomplete); 649b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington while (link != NULL) 650b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 651b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link); 652b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusConnection *connection; 653b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington BusConnectionData *d; 654b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington double elapsed; 6551820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 656b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington connection = link->data; 6571820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 658b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d = BUS_CONNECTION_DATA (connection); 6591820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 660b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d != NULL); 661b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 662b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington elapsed = ((double) tv_sec - (double) d->connection_tv_sec) * 1000.0 + 663b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington ((double) tv_usec - (double) d->connection_tv_usec) / 1000.0; 6641820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 665b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington if (elapsed >= (double) auth_timeout) 666b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 667b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Timing out authentication for connection %p\n", connection); 668b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington dbus_connection_disconnect (connection); 669b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 670b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington else 671b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 672b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* We can end the loop, since the connections are in oldest-first order */ 673b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington next_interval = ((double)auth_timeout) - elapsed; 674b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Connection %p authentication expires in %d milliseconds\n", 675b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington connection, next_interval); 6761820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 677b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington break; 678b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 6791820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 680b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington link = next; 681b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 6821820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington } 683b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 6841820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (next_interval >= 0) 6851820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington { 6861820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_set_interval (connections->expire_timeout, 6871820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington next_interval); 6881820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_set_enabled (connections->expire_timeout, TRUE); 6891820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 6901820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_verbose ("Enabled incomplete connections timeout with interval %d, %d incomplete connections\n", 6911820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington next_interval, connections->n_incomplete); 6921820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington } 693b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington else if (dbus_timeout_get_enabled (connections->expire_timeout)) 6941820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington { 6951820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_set_enabled (connections->expire_timeout, FALSE); 6961820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 6971820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_verbose ("Disabled incomplete connections timeout, %d incomplete connections\n", 6981820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->n_incomplete); 6991820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington } 700b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington else 701b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("No need to disable incomplete connections timeout\n"); 7021820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 7031820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7041820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic dbus_bool_t 7051820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonexpire_incomplete_timeout (void *data) 7061820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 7071820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington BusConnections *connections = data; 7081820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 709b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Running %s\n", _DBUS_FUNCTION_NAME); 710b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 7111820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* note that this may remove the timeout */ 7121820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington bus_connections_expire_incomplete (connections); 7131820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7141820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington return TRUE; 7151820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 7161820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 717a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 7187c022a80c9b8c5b085514ea49f983c0489e945abHavoc Penningtonbus_connection_get_groups (DBusConnection *connection, 7197c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long **groups, 720e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington int *n_groups, 721e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington DBusError *error) 722a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 723a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 7247c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long uid; 7257c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington DBusUserDatabase *user_database; 7267c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington 727a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 728a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 729a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 730a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 7317c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington user_database = bus_context_get_user_database (d->connections->context); 7327c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington 733a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = NULL; 734a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = 0; 735a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 7367c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 737a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 7387c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington if (!_dbus_user_database_get_groups (user_database, 7397c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington uid, groups, n_groups, 740e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error)) 741a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 742e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 7437c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Did not get any groups for UID %lu\n", 7447c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington uid); 7457c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return FALSE; 7467c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 7477c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 7487c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 7497c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Got %d groups for UID %lu\n", 7507c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington *n_groups, uid); 7517c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 752a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 753a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 7547c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 7557c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; /* successfully got 0 groups */ 756a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 757a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 758a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 759a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_is_in_group (DBusConnection *connection, 760a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington unsigned long gid) 761a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 762a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int i; 7637c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long *group_ids; 764a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 765a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 766e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (!bus_connection_get_groups (connection, &group_ids, &n_group_ids, 767e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington NULL)) 768a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 769a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 770a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington i = 0; 771a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington while (i < n_group_ids) 772a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 773a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (group_ids[i] == gid) 7747c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 7757c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 7767c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 7777c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 778a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington ++i; 779a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 780a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 7817c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 782a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 783a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 784a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 785bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy* 786e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Penningtonbus_connection_get_policy (DBusConnection *connection) 787a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 788a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 789a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 790a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 791a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 792a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 793e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_assert (d->policy != NULL); 794b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 795a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return d->policy; 796a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 7976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 798983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 799983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonforeach_active (BusConnections *connections, 800983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 801983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 802983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 803983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link; 804983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 805983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = _dbus_list_get_first_link (&connections->completed); 806983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (link != NULL) 807983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 808983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection = link->data; 809983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->completed, link); 810983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 811983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!(* function) (connection, data)) 812983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 813983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 814983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = next; 815983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 816983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 817983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 818983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 819983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 820983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 821983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonforeach_inactive (BusConnections *connections, 822983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 823983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 824983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 825983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link; 826983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 827983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = _dbus_list_get_first_link (&connections->incomplete); 828983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (link != NULL) 829983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 830983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection = link->data; 831983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link); 832983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 833983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!(* function) (connection, data)) 834983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 835983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 836983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = next; 837983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 838983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 839983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 840983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 841983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 842983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington/** 843983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * Calls function on each active connection; if the function returns 844983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * #FALSE, stops iterating. Active connections are authenticated 845983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * and have sent a Hello message. 846983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * 847983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param connections the connections object 848983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param function the function 849983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param data data to pass to it as a second arg 850983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 851983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonvoid 852983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_connections_foreach_active (BusConnections *connections, 853983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 854983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 855983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 856983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington foreach_active (connections, function, data); 857983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 858983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 8596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/** 8606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns 8616ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating. 8626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * 8636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object 8646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function 8656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg 8666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */ 8676ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 8686ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections *connections, 8696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionForeachFunction function, 870983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 8716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 872983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!foreach_active (connections, function, data)) 873983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return; 8746ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 875983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington foreach_inactive (connections, function, data); 8766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 8776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8786ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 8796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections) 8806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 8816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections->context; 8826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 8836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8846ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 8856ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection) 8866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 8876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 8886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 8906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 8926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections->context; 8946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 8956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 8966ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 8976ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection) 8986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 8996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 9006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 9026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 9046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections; 9066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9086ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry* 9096ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection) 9106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 9126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 9146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 9166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_registry (d->connections->context); 9186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9206ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation* 9216ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection) 9226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 9246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 9266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 9286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_activation (d->connections->context); 9306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 93229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 93329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus. 93429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * 93529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection 93629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant 93729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 93829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 93929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection) 94029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 94129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 94229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 94329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 94429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 94529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return d != NULL && d->name != NULL; 94629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 94729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 94829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 94929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection) 95029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 95129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 95229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 95329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 95429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 95629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 95829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 95929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated != NULL) 96029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 96129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 96229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington preallocated = dbus_connection_preallocate_send (connection); 96329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (preallocated == NULL) 96429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 96529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 966c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington /* d->name may be NULL, but that is OK */ 967c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington message = dbus_message_new (DBUS_ERROR_NO_MEMORY, 968c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington d->name); 96929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 97029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 97129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 97229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 97329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 97429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 975f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington dbus_message_set_is_error (message, TRUE); 976056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 977056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington if (!dbus_message_set_sender (message, 978056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington DBUS_SERVICE_DBUS)) 979056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington { 980056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 981056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_message_unref (message); 982056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 983056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington } 984f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 98529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* set reply serial to placeholder value just so space is already allocated 98629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for it. 98729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 98829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (message, 14)) 98929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 99029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 99129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 99229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 99329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 99429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = message; 99629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = preallocated; 99729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 99829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 99929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 100029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 100229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection, 100329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 100429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 100529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 100629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 100829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 100929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 101029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->oom_message != NULL); 101129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 101229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* should always succeed since we set it to a placeholder earlier */ 101329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (d->oom_message, 101429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_get_serial (in_reply_to))) 101529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message"); 101629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1017056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL); 1018056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 101929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, d->oom_preallocated, 102029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message, NULL); 102129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 102229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 102329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = NULL; 102429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = NULL; 102529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 102629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 10276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonvoid 10286be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service_link (DBusConnection *connection, 10296be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link) 103096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 103196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 103296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 103396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 103496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 103596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 10366be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_append_link (&d->services_owned, link); 1037b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1038b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d->n_services_owned += 1; 10396be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 10406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 10416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 10426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service (DBusConnection *connection, 10436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusService *service) 10446be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 10456be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link; 10466be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 10476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington link = _dbus_list_alloc_link (service); 10486be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 10496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (link == NULL) 105096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 105196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 10526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington bus_connection_add_owned_service_link (connection, link); 10536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 105496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return TRUE; 105596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 105696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 105796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid 105896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection, 105996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 106096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 106196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 106296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 106396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 106496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 106596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 106696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_list_remove_last (&d->services_owned, service); 1067b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1068b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d->n_services_owned -= 1; 1069b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d->n_services_owned >= 0); 1070b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington} 1071b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1072b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint 1073b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_connection_get_n_services_owned (DBusConnection *connection) 1074b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{ 1075b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington BusConnectionData *d; 1076b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1077b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1078b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d != NULL); 1079b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1080b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington return d->n_services_owned; 108196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 1082aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1083aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t 1084e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Penningtonbus_connection_complete (DBusConnection *connection, 1085e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington const DBusString *name, 1086e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington DBusError *error) 1087aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 1088aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 1089983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 1090aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1091aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 1092aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 1093aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d->name == NULL); 1094e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_assert (d->policy == NULL); 1095983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1096fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_copy_data (name, &d->name)) 1097e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 1098e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington BUS_SET_OOM (error); 1099e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington return FALSE; 1100e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 1101aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1102fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_assert (d->name != NULL); 1103fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington 1104d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("Name %s assigned to %p\n", d->name, connection); 1105983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1106e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington d->policy = bus_context_create_client_policy (d->connections->context, 1107e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington connection, 1108e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error); 1109e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1110e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington /* we may have a NULL policy on OOM or error getting list of 1111e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington * groups for a user. In the latter case we don't handle it so 1112e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington * well currently, as it will just keep failing over and over. 1113e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington */ 1114e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1115e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (d->policy == NULL) 1116e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 1117e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Failed to create security policy for connection %p\n", 1118e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington connection); 1119e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 1120e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington dbus_free (d->name); 1121e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington d->name = NULL; 1122e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington return FALSE; 1123e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 1124e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1125983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 1126983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1127983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!adjust_connections_for_uid (d->connections, 1128983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, 1)) 1129983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1130e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington BUS_SET_OOM (error); 1131983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_free (d->name); 1132983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->name = NULL; 1133983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1134983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1135983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1136983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1137983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Now the connection is active, move it between lists */ 1138983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_unlink (&d->connections->incomplete, 1139983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list); 1140983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_incomplete -= 1; 1141983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_append_link (&d->connections->completed, 1142983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list); 1143983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_completed += 1; 1144983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1145983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_incomplete >= 0); 1146983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_completed > 0); 1147b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1148b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* See if we can remove the timeout */ 1149b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington bus_connections_expire_incomplete (d->connections); 1150d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 1151aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 1152aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 1153aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1154aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char * 1155aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection) 1156aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 1157aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 1158aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1159aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 1160aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 1161aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1162aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return d->name; 1163aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 1164a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 1165983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington/** 1166983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * Check whether completing the passed-in connection would 1167983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * exceed limits, and if so set error and return #FALSE 1168983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 1169983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtondbus_bool_t 1170983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_connections_check_limits (BusConnections *connections, 1171983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *requesting_completion, 1172983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusError *error) 1173983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 1174983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionData *d; 1175983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 1176983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1177983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d = BUS_CONNECTION_DATA (requesting_completion); 1178983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d != NULL); 1179983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1180983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->name == NULL); 1181983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1182983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->n_completed >= 1183983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_completed_connections (connections->context)) 1184983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1185983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1186983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington "The maximum number of active connections has been reached"); 1187983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1188983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1189983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1190983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (requesting_completion, &uid)) 1191983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1192983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (get_connections_for_uid (connections, uid) >= 1193983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_connections_per_user (connections->context)) 1194983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1195983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1196983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington "The maximum number of active connections for UID %lu has been reached", 1197983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid); 1198983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1199983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1200983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1201983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1202983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 1203983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 1204983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1205983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 12063df260c07102745c5606c313af862558f105f83eHavoc Pennington/* 12076be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Transactions 12086be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * 12096be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Note that this is fairly fragile; in particular, don't try to use 12106be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * one transaction across any main loop iterations. 12116be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 12126be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 121329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct 121429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 121529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 121629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 121729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 121829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend; 121929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 12206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtontypedef struct 12216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 12226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function; 12236be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function; 12246be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data; 12256be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} CancelHook; 12266be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 122729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction 122829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 122929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *connections; 12306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 12316be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *cancel_hooks; 123229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 123329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 123429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 123529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection, 123629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send) 123729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 123829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->message) 123929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (to_send->message); 124029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 124129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated) 124229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, to_send->preallocated); 124329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 124429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 124529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 124629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 12476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 12486be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_cancel (void *element, 12496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 12506be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 12516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 12526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Running transaction cancel hook\n"); 12546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->cancel_function) 12566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->cancel_function) (ch->data); 12576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 12586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 12606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_free (void *element, 12616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 12626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 12636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 12646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->free_data_function) 12666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->free_data_function) (ch->data); 12676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 12696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 12706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 12726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonfree_cancel_hooks (BusTransaction *transaction) 12736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 12746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 12756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_free, NULL); 12766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_clear (&transaction->cancel_hooks); 12786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 12796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 128029560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction* 12816ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context) 128229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 128329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 128429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 128529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = dbus_new0 (BusTransaction, 1); 128629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 128729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return NULL; 128829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 12896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction->context = context; 12906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 129129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return transaction; 129229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 129329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 12946ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 12956ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction *transaction) 12966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 12976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return transaction->context; 12986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 12996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 13006ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 13016ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction *transaction) 13026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 13036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_connections (transaction->context); 13046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 13056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 130629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 1307777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send_from_driver (BusTransaction *transaction, 1308777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 1309777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 1310777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{ 1311777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* We have to set the sender to the driver, and have 1312777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * to check security policy since it was not done in 1313777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * dispatch.c 1314777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 1315777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington _dbus_verbose ("Sending %s from driver\n", 1316777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_message_get_name (message)); 1317777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1318777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 1319777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return FALSE; 1320777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1321777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* If security policy doesn't allow the message, we silently 1322777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * eat it; the driver doesn't care about getting a reply. 1323777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 1324777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_context_check_security_policy (bus_transaction_get_context (transaction), 1325777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington NULL, connection, message, NULL)) 1326777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return TRUE; 1327777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1328777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return bus_transaction_send (transaction, connection, message); 1329777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington} 1330777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1331777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t 1332777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send (BusTransaction *transaction, 1333777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 1334777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 133529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 133629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 133729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 133829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 133929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 134051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose (" trying to add %s %s to transaction%s\n", 134151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_get_is_error (message) ? "error" : 1342dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington dbus_message_get_reply_serial (message) != 0 ? "reply" : 134351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington "message", 1344ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_get_name (message), 1345ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_get_is_connected (connection) ? 1346ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington "" : " (disconnected)"); 1347056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 1348056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 1349f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 135029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 135129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; /* silently ignore disconnected connections */ 135229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 135329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 135429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 135529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 135629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send = dbus_new (MessageToSend, 1); 135729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send == NULL) 135829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 135929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 136029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 136129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 136229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->preallocated = dbus_connection_preallocate_send (connection); 136329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated == NULL) 136429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 136529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 136629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 136729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 136829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 136929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_ref (message); 137029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->message = message; 137129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->transaction = transaction; 137229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1373d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("about to prepend message\n"); 1374d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 137529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&d->transaction_messages, to_send)) 137629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 137729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 137829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 137929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 1380d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 1381d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("prepended message\n"); 138229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 138329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* See if we already had this connection in the list 138429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for this transaction. If we have a pending message, 138529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then we should already be in transaction->connections 138629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 138729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 138829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (link->data == to_send); 138929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_next_link (&d->transaction_messages, link); 139029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 139129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 139229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 139329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 139429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 139529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 139629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington break; 139729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 139829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 139929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 140029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 140129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (link == NULL) 140229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 140329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&transaction->connections, connection)) 140429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 140529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 140629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 140729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 140829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 140929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 141029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 141129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 141229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 141329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 141429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 141529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection, 141629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 141729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 141829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 141929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 142029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 142129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 142229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 142329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 142429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 142529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 142629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 142729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 142829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 142929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 143029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 143129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 143229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 143329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 143429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 143529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 143629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 143729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 143829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 143929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 144029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 144129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 144229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 144329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction) 144429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 144529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 1446ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1447ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: cancelled\n"); 144829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 144929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 145029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_cancel_transaction (connection, transaction); 145129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 145229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 145329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 14546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 14556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_cancel, NULL); 14566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 14576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 14586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 145929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 146029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 146129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 146229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 146329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection, 146429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 146529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 146629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 146729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 146829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 146929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 147029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 147129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 147229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Send the queue in order (FIFO) */ 147329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_last_link (&d->transaction_messages); 147429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 147529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 147629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 147729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link); 147829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 147929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 148029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 148129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 148229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 148329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1484056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (m->message) != NULL); 1485056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 148629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, 148729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated, 148829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->message, 148929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL); 149029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 149129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated = NULL; /* so we don't double-free it */ 149229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 149329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 149429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 149529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 149629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = prev; 149729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 149829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 149929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 150029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 150129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction) 150229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 150329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* For each connection in transaction->connections 150429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * send the messages 150529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 150629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 1507ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 1508ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: executing\n"); 150929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 151029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 151129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_execute_transaction (connection, transaction); 151229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 151329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 151429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 15156be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 15166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 151729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 151829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 151929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 152029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 152129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection) 152229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 152329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 152429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 152529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 152629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 152729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 152829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 152929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((to_send = _dbus_list_get_first (&d->transaction_messages))) 153029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 153129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* only has an effect for the first MessageToSend listing this transaction */ 153229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&to_send->transaction->connections, 153329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection); 153429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 153529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 153629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 153729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 153829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 153929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 154029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 154129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply 154229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 154329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 154429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction *transaction, 154529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 154629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const DBusError *error, 154729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 154829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 154929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *reply; 155090ed1d84588a84697051e643175452c50d682eceHavoc Pennington 155129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (error != NULL); 155229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 1553e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1554e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Sending error reply %s \"%s\"\n", 1555e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error->name, error->message); 1556e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 155729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_error_reply (in_reply_to, 155829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->name, 155929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error->message); 156029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 156129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 156229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1563777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 156429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 156529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 156629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 156729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 156829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1569e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (reply); 1570e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 157129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 1572a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 15736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 15746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 15756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_transaction_add_cancel_hook (BusTransaction *transaction, 15766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function, 15776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data, 15786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function) 15796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 15806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch; 15816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 15826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch = dbus_new (CancelHook, 1); 15836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch == NULL) 15846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 15856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 15866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->cancel_function = cancel_function; 15876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->data = data; 15886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->free_data_function = free_data_function; 15896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 15906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington /* It's important that the hooks get run in reverse order that they 15916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * were added 15926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 15936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!_dbus_list_prepend (&transaction->cancel_hooks, ch)) 15946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 15956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 15966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 15976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 15986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 15996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return TRUE; 16006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 1601