connection.c revision a37404111be4912cd8b51080bcbe219edded35f5
1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/* connection.c Client connections 396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Copyright (C) 2003 Red Hat, Inc. 596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 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" 28a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h" 2940751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington#include "expirelist.h" 301e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington#include "selinux.h" 3196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include <dbus/dbus-list.h> 32983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington#include <dbus/dbus-hash.h> 331820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington#include <dbus/dbus-timeout.h> 3496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection); 3629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 374097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Penningtontypedef struct 384097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington{ 394097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington BusExpireItem expire_item; 404097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 414097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington DBusConnection *will_get_reply; 424097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington DBusConnection *will_send_reply; 434097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 444097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington dbus_uint32_t reply_serial; 454097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 464097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington} BusPendingReply; 474097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 486ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections 496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington int refcount; 51983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *completed; /**< List of all completed connections */ 52983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int n_completed; /**< Length of completed list */ 53983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *incomplete; /**< List of all not-yet-active connections */ 54983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int n_incomplete; /**< Length of incomplete list */ 556ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 56983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusHashTable *completed_by_user; /**< Number of completed connections for each UID */ 571820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington DBusTimeout *expire_timeout; /**< Timeout for expiring incomplete connections. */ 58d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington int stamp; /**< Incrementing number */ 5964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusExpireList *pending_replies; /**< List of pending replies */ 606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}; 616ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 626843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Penningtonstatic dbus_int32_t connection_data_slot = -1; 6396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 6496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct 6596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 67983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link_in_connection_list; 6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 6996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusList *services_owned; 70b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington int n_services_owned; 71a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *match_rules; 72a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington int n_match_rules; 73aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson char *name; 7429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */ 7529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *oom_message; 7629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *oom_preallocated; 77bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington BusClientPolicy *policy; 781820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 791e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BusSELinuxID *selinux_id; 801e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 811820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington long connection_tv_sec; /**< Time when we connected (seconds component) */ 821820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington long connection_tv_usec; /**< Time when we connected (microsec component) */ 83a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington int stamp; /**< connections->stamp last time we were traversed */ 8496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData; 8596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 86bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Penningtonstatic dbus_bool_t bus_pending_reply_expired (BusExpireList *list, 87bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington DBusList *link, 88bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington void *data); 8964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 9064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void bus_connection_drop_pending_replies (BusConnections *connections, 9164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *connection); 9264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 931820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic dbus_bool_t expire_incomplete_timeout (void *data); 941820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 9596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) 9696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 97df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop* 981b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonconnection_get_loop (DBusConnection *connection) 991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 1001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington BusConnectionData *d; 1011b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 1021b08036103a70159e7a67b2349306710edcd6654Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 1041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_context_get_loop (d->connections->context); 1051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 1061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 107983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 108983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic int 109983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonget_connections_for_uid (BusConnections *connections, 110983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_uid_t uid) 111983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 112983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *val; 113983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int current_count; 114983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 115983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* val is NULL is 0 when it isn't in the hash yet */ 116983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 117983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington val = _dbus_hash_table_lookup_ulong (connections->completed_by_user, 118983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid); 119983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 120983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count = _DBUS_POINTER_TO_INT (val); 121983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 122983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return current_count; 123983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 124983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 125983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 126983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonadjust_connections_for_uid (BusConnections *connections, 127983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_uid_t uid, 128983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int adjustment) 129983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 130983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int current_count; 131983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 132983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count = get_connections_for_uid (connections, uid); 133983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 134983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_verbose ("Adjusting connection count for UID " DBUS_UID_FORMAT 135983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington ": was %d adjustment %d making %d\n", 136983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, current_count, adjustment, current_count + adjustment); 137983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 138983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (current_count >= 0); 139983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 140983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count += adjustment; 141983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 142983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (current_count >= 0); 143983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 144983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (current_count == 0) 145983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 146983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_hash_table_remove_ulong (connections->completed_by_user, uid); 147983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 148983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 149983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington else 150983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 151983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_bool_t retval; 152983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 153983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington retval = _dbus_hash_table_insert_ulong (connections->completed_by_user, 154983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, _DBUS_INT_TO_POINTER (current_count)); 155983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 156983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* only positive adjustment can fail as otherwise 157983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * a hash entry should already exist 158983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 159983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (adjustment > 0 || 160983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington (adjustment <= 0 && retval)); 161983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 162983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return retval; 163983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 164983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 165983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 166fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 16729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection) 16896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 16996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 17096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service; 171a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 172a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 17396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 174d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_assert (d != NULL); 17596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 176d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n", 177d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington d->name ? d->name : "(inactive)"); 178a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 179a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* Delete our match rules */ 180a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (d->n_match_rules > 0) 181a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 182a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_context_get_matchmaker (d->connections->context); 183a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_matchmaker_disconnected (matchmaker, connection); 184a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 185d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 18615c60238853f2896738c23b53e574b5d9cae1635John (J /* Drop any service ownership. Unfortunately, this requires 18729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * memory allocation and there doesn't seem to be a good way to 18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * handle it other than sleeping; we can't "fail" the operation of 18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * disconnecting a client, and preallocating a broadcast "service is 19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * now gone" message for every client-service pair seems kind of 19115c60238853f2896738c23b53e574b5d9cae1635John (J * involved. 19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 193ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((service = _dbus_list_get_last (&d->services_owned))) 194ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 195ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington BusTransaction *transaction; 196ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 197ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 198ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry: 199ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 200ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 201ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 202e3fa86b54a0bdc6a8eaf5def43b1947ddef59c85Havoc Pennington while ((transaction = bus_transaction_new (d->connections->context)) == NULL) 203e3fa86b54a0bdc6a8eaf5def43b1947ddef59c85Havoc Pennington _dbus_wait_for_memory (); 204ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 205ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_service_remove_owner (service, connection, 206ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction, &error)) 207ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 2086be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 2096be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 210ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 211ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 212ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 213ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_cancel_and_free (transaction); 214df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 215ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry; 216ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 217ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 2186be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 2196be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Failed to remove service owner: %s %s\n", 2206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error.name, error.message); 2216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason"); 2226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 223ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 224ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 225ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_execute_and_free (transaction); 226ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 22796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 22839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_dispatch_remove_connection (connection); 229aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 23096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* no more watching */ 2313bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 232f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 2333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 2343bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 2353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 2363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 238f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 2413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 2423bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 24344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 24444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 2457be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_connection_set_windows_user_function (connection, 2467be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington NULL, NULL, NULL); 2477be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 2487caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 2497caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 25044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 25129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_remove_transactions (connection); 2526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 253983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list != NULL) 254983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 255983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->name != NULL) 256983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 257983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 258983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 259983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_remove_link (&d->connections->completed, d->link_in_connection_list); 260983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = NULL; 261983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_completed -= 1; 2626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 264983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!adjust_connections_for_uid (d->connections, 266983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, -1)) 267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert_not_reached ("adjusting downward should never fail"); 268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington else 271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_remove_link (&d->connections->incomplete, d->link_in_connection_list); 273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = NULL; 274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_incomplete -= 1; 275983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 276983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 277983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_incomplete >= 0); 278983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_completed >= 0); 279983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 28064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 28164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_connection_drop_pending_replies (d->connections, connection); 282983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 2836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington /* frees "d" as side effect */ 28496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_set_data (connection, 28596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 28696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington NULL, NULL); 28764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 28896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_unref (connection); 28996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 291b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 29296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch *watch, 29396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington unsigned int condition, 29496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington void *data) 29596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 2963df260c07102745c5606c313af862558f105f83eHavoc Pennington /* FIXME this can be done in dbus-mainloop.c 297ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington * if the code in activation.c for the babysitter 298ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington * watch handler is fixed. 299ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington */ 3003df260c07102745c5606c313af862558f105f83eHavoc Pennington 30151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#if 0 30251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Calling handle_watch\n"); 30351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#endif 3043df260c07102745c5606c313af862558f105f83eHavoc Pennington return dbus_watch_handle (watch, condition); 30596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 30696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 30896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch *watch, 3091b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 31096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3111b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3121b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 313df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_watch (connection_get_loop (connection), 314df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection, 315df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington NULL); 31696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 31796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 31896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 31996a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch *watch, 3201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 32196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3231b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 324df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_watch (connection_get_loop (connection), 325df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection); 32696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 32796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 32896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 3293bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout *timeout, 3303bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington void *data) 3313bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3323df260c07102745c5606c313af862558f105f83eHavoc Pennington /* DBusConnection *connection = data; */ 3334c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 334b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 3353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_timeout_handle (timeout); 3363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 3393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout *timeout, 3401b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 3413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3421b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3431b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 344df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_timeout (connection_get_loop (connection), 345df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection, NULL); 3463bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3473bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3483bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 3493bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout *timeout, 3501b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 3513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3521b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3531b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 354df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_timeout (connection_get_loop (connection), 355df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection); 3563bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3573bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3587caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtonstatic void 3597caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtondispatch_status_function (DBusConnection *connection, 3607caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusDispatchStatus new_status, 3617caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington void *data) 3627caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington{ 3637caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusLoop *loop = data; 3647caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 3657caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (new_status != DBUS_DISPATCH_COMPLETE) 3667caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 3677caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington while (!_dbus_loop_queue_dispatch (loop, connection)) 3687caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington _dbus_wait_for_memory (); 3697caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 3707caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington} 3717caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 372a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t 3737be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonallow_unix_user_function (DBusConnection *connection, 3747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unsigned long uid, 3757be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington void *data) 376a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 377a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 378a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 379a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 380a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 381a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 382a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 3837be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return bus_context_allow_unix_user (d->connections->context, uid); 384a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 385a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 3863bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 38796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data) 38896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 38996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d = data; 39096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 39196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* services_owned should be NULL since we should be disconnected */ 39296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d->services_owned == NULL); 393b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d->n_services_owned == 0); 39429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* similarly */ 39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->transaction_messages == NULL); 396aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated) 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); 399f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 40029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_message) 40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 402a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 403a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy) 404bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington bus_client_policy_unref (d->policy); 4051e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 4061e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (d->selinux_id) 4071e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington bus_selinux_id_unref (d->selinux_id); 408a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 409aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson dbus_free (d->name); 41096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 41196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 41296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 41396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4141820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic void 4151820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtoncall_timeout_callback (DBusTimeout *timeout, 4161820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington void *data) 4171820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 4181820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 4191820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington dbus_timeout_handle (timeout); 4201820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 4211820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4226ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 4236ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context) 42496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 4256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 42696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4276843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington if (!dbus_connection_allocate_data_slot (&connection_data_slot)) 4281820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_0; 42996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = dbus_new0 (BusConnections, 1); 4316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections == NULL) 4321820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_1; 433983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 434983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections->completed_by_user = _dbus_hash_table_new (DBUS_HASH_ULONG, 435983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington NULL, NULL); 436983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->completed_by_user == NULL) 4371820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_2; 4381820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4391820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout = _dbus_timeout_new (100, /* irrelevant */ 4401820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington expire_incomplete_timeout, 4411820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections, NULL); 4421820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (connections->expire_timeout == NULL) 4431820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_3; 4441820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4451820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_set_enabled (connections->expire_timeout, FALSE); 4461820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 44764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington connections->pending_replies = bus_expire_list_new (bus_context_get_loop (context), 44864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_context_get_reply_timeout (context), 44964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_pending_reply_expired, 45064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington connections); 45164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (connections->pending_replies == NULL) 45264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto failed_4; 45364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 4541820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (!_dbus_loop_add_timeout (bus_context_get_loop (context), 4551820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout, 4561820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington call_timeout_callback, NULL, NULL)) 45764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto failed_5; 4586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount = 1; 4606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->context = context; 4616ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections; 4631820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 46464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington failed_5: 46564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_expire_list_free (connections->pending_replies); 4661820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_4: 4671820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_unref (connections->expire_timeout); 4681820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_3: 4691820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_hash_table_unref (connections->completed_by_user); 4701820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_2: 4711820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington dbus_free (connections); 4721820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_1: 4736843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&connection_data_slot); 4741820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_0: 4751820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington return NULL; 4766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 4776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4789f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalBusConnections * 4796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections) 4806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 4816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 4826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount += 1; 4839f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 4849f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return connections; 4856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 4866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4876ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 4886ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections) 4896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 4906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 4916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount -= 1; 4926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections->refcount == 0) 4936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 494983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* drop all incomplete */ 495983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (connections->incomplete != NULL) 496ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 497ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection; 498ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 499983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connection = connections->incomplete->data; 500ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 501ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 50211fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 503ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_connection_disconnected (connection); 504ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 505ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 506983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 507983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->n_incomplete == 0); 5086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 509983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* drop all real connections */ 510983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (connections->completed != NULL) 511983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 512983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection; 513983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 514983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connection = connections->completed->data; 515983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 516983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_connection_ref (connection); 51711fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 518983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_connection_disconnected (connection); 51964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_connection_unref (connection); 520983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 521983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 522983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->n_completed == 0); 523983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 52464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_expire_list_free (connections->pending_replies); 52564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 5261820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_loop_remove_timeout (bus_context_get_loop (connections->context), 5271820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout, 5281820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington call_timeout_callback, NULL); 5291820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 5301820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_unref (connections->expire_timeout); 5311820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 532983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_hash_table_unref (connections->completed_by_user); 5336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 534f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_free (connections); 535f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 5366843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&connection_data_slot); 5376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 53896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 53996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 54096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 5416ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections, 5426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection) 54396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 54496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 545ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t retval; 5461e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington DBusError error; 547ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 5481b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson d = dbus_new0 (BusConnectionData, 1); 5491b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 55096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (d == NULL) 55196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 5536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d->connections = connections; 55429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->connection = connection; 555d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 5561820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_get_current_time (&d->connection_tv_sec, 5571820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington &d->connection_tv_usec); 5581820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 559f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot >= 0); 56096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 56196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!dbus_connection_set_data (connection, 56296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 56396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d, free_connection_data)) 56496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington { 56596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 56696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 56796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington } 568ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 569d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_connection_set_route_peer_messages (connection, TRUE); 570d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 571ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = FALSE; 5721e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 5731e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_error_init (&error); 5741e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington d->selinux_id = bus_selinux_init_connection_id (connection, 5751e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington &error); 5761e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (dbus_error_is_set (&error)) 5771e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 5781e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington /* This is a bit bogus because we pretend all errors 5791e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * are OOM; this is done because we know that in bus.c 5801e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * an OOM error disconnects the connection, which is 5811e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * the same thing we want on any other error. 5821e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington */ 5831e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_error_free (&error); 5841e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington goto out; 5851e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 58696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 5873bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 5881b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_watch, 5891b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_watch, 590f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 5913bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 5923bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 593ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 5943bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 5953bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 5961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_timeout, 5971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_timeout, 598f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 5993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, NULL)) 600ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 6017be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6027be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* For now we don't need to set a Windows user function because 6037be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * there are no policies in the config file controlling what 6047be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * Windows users can connect. The default 'same user that owns the 6057be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * bus can connect' behavior of DBusConnection is fine on Windows. 6067be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */ 60744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 6087be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow_unix_user_function, 60944fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL); 6107caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 6117caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 6127caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dispatch_status_function, 6137caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_context_get_loop (connections->context), 6147caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL); 615983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 616983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = _dbus_list_alloc_link (connection); 617983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list == NULL) 618983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington goto out; 61996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 62039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Setup the connection with the dispatcher */ 62139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (!bus_dispatch_add_connection (connection)) 622ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 6237caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 6247caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) 6257caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 6267caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection)) 6277caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 6287caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_dispatch_remove_connection (connection); 6297caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington goto out; 6307caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 6317caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 632983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 633983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_append_link (&connections->incomplete, d->link_in_connection_list); 634983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections->n_incomplete += 1; 635ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 6363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_connection_ref (connection); 637983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 638983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Note that we might disconnect ourselves here, but it only takes 6391820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * effect on return to the main loop. We call this to free up 6401820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * expired connections if possible, and to queue the timeout for our 6411820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * own expiration. 6421820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington */ 6431820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington bus_connections_expire_incomplete (connections); 6441820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 6451820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* And we might also disconnect ourselves here, but again it 6461820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * only takes effect on return to main loop. 647983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 648983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->n_incomplete > 649983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_incomplete_connections (connections->context)) 650983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 651983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_verbose ("Number of incomplete connections exceeds max, dropping oldest one\n"); 652983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 653983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->incomplete != NULL); 654983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Disconnect the oldest unauthenticated connection. FIXME 655983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * would it be more secure to drop a *random* connection? This 656983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * algorithm seems to mean that if someone can create new 657983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * connections quickly enough, they can keep anyone else from 658983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * completing authentication. But random may or may not really 659983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * help with that, a more elaborate solution might be required. 660983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 66111fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connections->incomplete->data); 662983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 663983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 664ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = TRUE; 665ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 666ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 667ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!retval) 6681e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 6691e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (d->selinux_id) 6701e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington bus_selinux_id_unref (d->selinux_id); 6711e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington d->selinux_id = NULL; 6721e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 673ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 674ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 675ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 676ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 677ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 678ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 679ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_timeout_functions (connection, 680ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 681ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 682ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 683ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 68444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 68544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 68644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 6871b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 6887be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_connection_set_windows_user_function (connection, 6897be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington NULL, NULL, NULL); 6907be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6917caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 6927caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 693983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 694983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list != NULL) 695983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 696983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->link_in_connection_list->next == NULL); 697983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->link_in_connection_list->prev == NULL); 698983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_free_link (d->link_in_connection_list); 699d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington d->link_in_connection_list = NULL; 700983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 701d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 702d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington if (!dbus_connection_set_data (connection, 703d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington connection_data_slot, 704d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington NULL, NULL)) 705d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington _dbus_assert_not_reached ("failed to set connection data to null"); 706d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 707d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington /* "d" has now been freed */ 708ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 709aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 710ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 71196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 71296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 7131820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonvoid 7141820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonbus_connections_expire_incomplete (BusConnections *connections) 7151820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 7161820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington int next_interval; 7171820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7181820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington next_interval = -1; 7191820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 720b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington if (connections->incomplete != NULL) 7211820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington { 722b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington long tv_sec, tv_usec; 723b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusList *link; 724b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington int auth_timeout; 7251820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 726b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_get_current_time (&tv_sec, &tv_usec); 727b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington auth_timeout = bus_context_get_auth_timeout (connections->context); 728b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 729b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington link = _dbus_list_get_first_link (&connections->incomplete); 730b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington while (link != NULL) 731b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 732b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link); 733b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusConnection *connection; 734b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington BusConnectionData *d; 735b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington double elapsed; 7361820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 737b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington connection = link->data; 7381820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 739b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d = BUS_CONNECTION_DATA (connection); 7401820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 741b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d != NULL); 742b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 74340751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington elapsed = ELAPSED_MILLISECONDS_SINCE (d->connection_tv_sec, 74440751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington d->connection_tv_usec, 74540751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington tv_sec, tv_usec); 7461820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 747b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington if (elapsed >= (double) auth_timeout) 748b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 749b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Timing out authentication for connection %p\n", connection); 75011fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 751b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 752b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington else 753b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 754b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* We can end the loop, since the connections are in oldest-first order */ 755b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington next_interval = ((double)auth_timeout) - elapsed; 756b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Connection %p authentication expires in %d milliseconds\n", 757b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington connection, next_interval); 7581820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 759b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington break; 760b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 7611820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 762b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington link = next; 763b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 7641820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington } 7651820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 76640751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington bus_expire_timeout_set_interval (connections->expire_timeout, 76740751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington next_interval); 7681820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 7691820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7701820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic dbus_bool_t 7711820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonexpire_incomplete_timeout (void *data) 7721820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 7731820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington BusConnections *connections = data; 7741820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 775b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Running %s\n", _DBUS_FUNCTION_NAME); 776b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 7771820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* note that this may remove the timeout */ 7781820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington bus_connections_expire_incomplete (connections); 7791820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7801820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington return TRUE; 7811820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 7821820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 783a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 7847be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonbus_connection_get_unix_groups (DBusConnection *connection, 7857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unsigned long **groups, 7867be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington int *n_groups, 7877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusError *error) 788a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 789a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 7907c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long uid; 7917c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington 792a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 793a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 794a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 795a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 796a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = NULL; 797a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = 0; 798a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 7997c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 800a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 8017be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (!_dbus_unix_groups_from_uid (uid, groups, n_groups)) 802a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 8037c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Did not get any groups for UID %lu\n", 8047c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington uid); 8057c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return FALSE; 8067c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 8077c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 8087c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 8097c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Got %d groups for UID %lu\n", 8107c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington *n_groups, uid); 8117c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 812a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 813a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 8147c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 8157c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; /* successfully got 0 groups */ 816a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 817a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 818a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 8197be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonbus_connection_is_in_unix_group (DBusConnection *connection, 8207be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unsigned long gid) 821a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 822a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int i; 8237c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long *group_ids; 824a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 825a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 8267be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (!bus_connection_get_unix_groups (connection, &group_ids, &n_group_ids, 8277be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington NULL)) 828a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 829a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 830a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington i = 0; 831a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington while (i < n_group_ids) 832a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 833a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (group_ids[i] == gid) 8347c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 8357c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 8367c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 8377c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 838a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington ++i; 839a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 840a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 8417c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 842a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 843a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 844a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 845bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy* 846e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Penningtonbus_connection_get_policy (DBusConnection *connection) 847a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 848a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 849a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 850a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 851a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 852a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 853e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_assert (d->policy != NULL); 854b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 855a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return d->policy; 856a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 8576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 858983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 859983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonforeach_active (BusConnections *connections, 860983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 861983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 862983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 863983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link; 864983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 865983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = _dbus_list_get_first_link (&connections->completed); 866983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (link != NULL) 867983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 868983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection = link->data; 869983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->completed, link); 870983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 871983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!(* function) (connection, data)) 872983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 873983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 874983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = next; 875983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 876983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 877983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 878983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 879983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 880983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 881983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonforeach_inactive (BusConnections *connections, 882983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 883983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 884983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 885983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link; 886983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 887983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = _dbus_list_get_first_link (&connections->incomplete); 888983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (link != NULL) 889983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 890983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection = link->data; 891983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link); 892983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 893983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!(* function) (connection, data)) 894983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 895983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 896983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = next; 897983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 898983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 899983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 900983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 901983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 902983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington/** 903983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * Calls function on each active connection; if the function returns 904983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * #FALSE, stops iterating. Active connections are authenticated 905983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * and have sent a Hello message. 906983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * 907983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param connections the connections object 908983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param function the function 909983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param data data to pass to it as a second arg 910983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 911983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonvoid 912983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_connections_foreach_active (BusConnections *connections, 913983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 914983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 915983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 916983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington foreach_active (connections, function, data); 917983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 918983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 9196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/** 9206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns 9216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating. 9226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * 9236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object 9246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function 9256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg 9266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */ 9276ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 9286ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections *connections, 9296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionForeachFunction function, 930983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 9316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 932983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!foreach_active (connections, function, data)) 933983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return; 9346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 935983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington foreach_inactive (connections, function, data); 9366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9386ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 9396ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections) 9406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections->context; 9426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 944a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington/* 945a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * This is used to avoid covering the same connection twice when 946a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * traversing connections. Note that it assumes we will 947a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * bus_connection_mark_stamp() each connection at least once per 948a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * INT_MAX increments of the global stamp, or wraparound would break 949a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * things. 950a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 951a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonvoid 952a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connections_increment_stamp (BusConnections *connections) 953a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 954a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington connections->stamp += 1; 955a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 956a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 957a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington/* Mark connection with current stamp, return TRUE if it 958a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * didn't already have that stamp 959a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 960a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtondbus_bool_t 961a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_mark_stamp (DBusConnection *connection) 962a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 963a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 964a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 965a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 966a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 967a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 968a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 969a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (d->stamp == d->connections->stamp) 970a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 971a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else 972a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 973a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d->stamp = d->connections->stamp; 974a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 975a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 976a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 977a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 9786ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 9796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection) 9806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 9826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 9846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 9866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections->context; 9886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 9896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9906ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 9916ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection) 9926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 9936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 9946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 9966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 9986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 9996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections; 10006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10026ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry* 10036ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection) 10046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 10066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 10106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_registry (d->connections->context); 10126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10146ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation* 10156ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection) 10166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 10186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 10226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_activation (d->connections->context); 10246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1026a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc PenningtonBusMatchmaker* 1027a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_get_matchmaker (DBusConnection *connection) 1028a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1029a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1030a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1031a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1032a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1033a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1034a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1035a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return bus_context_get_matchmaker (d->connections->context); 1036a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1037a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 10381e9b185b0c274ef0d684b1e43418388225321e72Havoc PenningtonBusSELinuxID* 10391e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtonbus_connection_get_selinux_id (DBusConnection *connection) 10401e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{ 10411e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BusConnectionData *d; 10421e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 10431e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10441e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 10451e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington _dbus_assert (d != NULL); 10461e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 10471e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return d->selinux_id; 10481e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington} 10491e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 105029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 105129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus. 105229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * 105329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection 105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant 105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 105629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 105729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection) 105829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 105929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 106029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 106229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return d != NULL && d->name != NULL; 106429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 106529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 106629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 106729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection) 106829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 106929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 107029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 107129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 107229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 107329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 107429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 107529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 107629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 107729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated != NULL) 107829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 107929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 108029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington preallocated = dbus_connection_preallocate_send (connection); 108129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (preallocated == NULL) 108229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 108329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1084b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR); 1085b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 108629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 108729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 108829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 108929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 109029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 109129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1092b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington /* d->name may be NULL, but that is OK */ 109395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (!dbus_message_set_error_name (message, DBUS_ERROR_NO_MEMORY) || 1094b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_set_destination (message, d->name) || 1095b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_set_sender (message, 1096248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_SERVICE_DBUS)) 1097056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington { 1098056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 1099056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_message_unref (message); 1100056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 1101056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington } 1102f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 110329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* set reply serial to placeholder value just so space is already allocated 110429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for it. 110529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 110629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (message, 14)) 110729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 110829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 110929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 111029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 111129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 111229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 111329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = message; 111429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = preallocated; 111529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 111629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 111729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 111829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 111929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 112029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection, 112129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 112229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 112329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 112429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 112529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 112629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 112729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 112829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->oom_message != NULL); 112929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 113029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* should always succeed since we set it to a placeholder earlier */ 113129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (d->oom_message, 113229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_get_serial (in_reply_to))) 113329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message"); 113429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1135056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL); 1136056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 113729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, d->oom_preallocated, 113829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message, NULL); 113929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 114029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 114129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = NULL; 114229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = NULL; 114329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 114429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 11456be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonvoid 1146a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_add_match_rule_link (DBusConnection *connection, 1147a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *link) 1148a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1149a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1150a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1151a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1152a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1153a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1154a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_list_append_link (&d->match_rules, link); 1155a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1156a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d->n_match_rules += 1; 1157a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1158a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1159a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtondbus_bool_t 1160a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_add_match_rule (DBusConnection *connection, 1161a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule) 1162a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1163a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *link; 1164a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1165a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington link = _dbus_list_alloc_link (rule); 1166a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1167a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (link == NULL) 1168a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 1169a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1170a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_add_match_rule_link (connection, link); 1171a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1172a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1173a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1174a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1175a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonvoid 1176a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_remove_match_rule (DBusConnection *connection, 1177a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule) 1178a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1179a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1180a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1181a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1182a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1183a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1184a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_list_remove_last (&d->match_rules, rule); 1185a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1186a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d->n_match_rules -= 1; 1187a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d->n_match_rules >= 0); 1188a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1189a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1190a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonint 1191a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_get_n_match_rules (DBusConnection *connection) 1192a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1193a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1194a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1195a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1196a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1197a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1198a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return d->n_match_rules; 1199a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1200a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1201a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonvoid 12026be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service_link (DBusConnection *connection, 12036be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link) 120496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 120596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 120696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 120796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 120896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 120996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 12106be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_append_link (&d->services_owned, link); 1211b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1212b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d->n_services_owned += 1; 12136be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 12146be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12156be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 12166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service (DBusConnection *connection, 12176be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusService *service) 12186be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 12196be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link; 12206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington link = _dbus_list_alloc_link (service); 12226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12236be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (link == NULL) 122496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 122596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 12266be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington bus_connection_add_owned_service_link (connection, link); 12276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 122896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return TRUE; 122996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 123096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 123196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid 123296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection, 123396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 123496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 123596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 123696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 123796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 123896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 123996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 124096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_list_remove_last (&d->services_owned, service); 1241b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1242b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d->n_services_owned -= 1; 1243b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d->n_services_owned >= 0); 1244b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington} 1245b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1246b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint 1247b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_connection_get_n_services_owned (DBusConnection *connection) 1248b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{ 1249b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington BusConnectionData *d; 1250b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1251b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1252b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d != NULL); 1253b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1254b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington return d->n_services_owned; 125596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 1256aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1257aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t 1258e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Penningtonbus_connection_complete (DBusConnection *connection, 1259e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington const DBusString *name, 1260e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington DBusError *error) 1261aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 1262aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 1263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 1264aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1265aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 1266aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 1267aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d->name == NULL); 1268e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_assert (d->policy == NULL); 1269a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1270a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (!bus_connection_is_active (connection)); 1271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1272fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_copy_data (name, &d->name)) 1273e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 1274e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington BUS_SET_OOM (error); 1275e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington return FALSE; 1276e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 1277aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1278fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_assert (d->name != NULL); 1279fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington 1280d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("Name %s assigned to %p\n", d->name, connection); 1281983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1282e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington d->policy = bus_context_create_client_policy (d->connections->context, 1283e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington connection, 1284e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error); 1285e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1286e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington /* we may have a NULL policy on OOM or error getting list of 1287e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington * groups for a user. In the latter case we don't handle it so 1288e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington * well currently, as it will just keep failing over and over. 1289e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington */ 1290e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1291e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (d->policy == NULL) 1292e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 1293e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Failed to create security policy for connection %p\n", 1294e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington connection); 1295e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 1296e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington dbus_free (d->name); 1297e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington d->name = NULL; 1298e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington return FALSE; 1299e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 1300e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1301983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 1302983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1303983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!adjust_connections_for_uid (d->connections, 1304983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, 1)) 1305983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1306e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington BUS_SET_OOM (error); 1307983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_free (d->name); 1308983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->name = NULL; 1309fec58d8d78765342ba09e77c8742bb2e8b214ff1John (J bus_client_policy_unref (d->policy); 1310fec58d8d78765342ba09e77c8742bb2e8b214ff1John (J d->policy = NULL; 1311983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1312983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1313983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1314983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1315983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Now the connection is active, move it between lists */ 1316983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_unlink (&d->connections->incomplete, 1317983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list); 1318983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_incomplete -= 1; 1319983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_append_link (&d->connections->completed, 1320983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list); 1321983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_completed += 1; 1322983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1323983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_incomplete >= 0); 1324983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_completed > 0); 1325b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1326b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* See if we can remove the timeout */ 1327b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington bus_connections_expire_incomplete (d->connections); 1328a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1329a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (bus_connection_is_active (connection)); 1330d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 1331aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 1332aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 1333aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1334aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char * 1335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection) 1336aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 1337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 1338aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1339aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 1340aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 1341aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1342aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return d->name; 1343aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 1344a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 1345983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington/** 1346983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * Check whether completing the passed-in connection would 1347983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * exceed limits, and if so set error and return #FALSE 1348983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 1349983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtondbus_bool_t 1350983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_connections_check_limits (BusConnections *connections, 1351983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *requesting_completion, 1352983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusError *error) 1353983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 1354983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionData *d; 1355983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 1356983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1357983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d = BUS_CONNECTION_DATA (requesting_completion); 1358983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d != NULL); 1359983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1360983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->name == NULL); 1361983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1362983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->n_completed >= 1363983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_completed_connections (connections->context)) 1364983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1365983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1366983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington "The maximum number of active connections has been reached"); 1367983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1368983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1369983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1370983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (requesting_completion, &uid)) 1371983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1372983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (get_connections_for_uid (connections, uid) >= 1373983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_connections_per_user (connections->context)) 1374983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1375983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1376983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington "The maximum number of active connections for UID %lu has been reached", 1377983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid); 1378983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1379983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1380983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1381983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1382983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 1383983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 1384983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1385d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Penningtonstatic void 1386d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Penningtonbus_pending_reply_free (BusPendingReply *pending) 1387d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington{ 1388d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Freeing pending reply %p, replier %p receiver %p serial %u\n", 1389d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1390d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1391d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1392d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1393d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1394d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington dbus_free (pending); 1395d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington} 1396d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 139764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic dbus_bool_t 139864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_pending_reply_send_no_reply (BusConnections *connections, 139964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction, 140064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending) 140164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 140264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessage *message; 140364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessageIter iter; 140464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_bool_t retval; 14059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *errmsg; 140664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 140764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington retval = FALSE; 140864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 140964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR); 141064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (message == NULL) 141164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 141264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 141364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_message_set_no_reply (message, TRUE); 141464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 141564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!dbus_message_set_reply_serial (message, 141664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->reply_serial)) 141764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 141864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 141964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!dbus_message_set_error_name (message, 142064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBUS_ERROR_NO_REPLY)) 142164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 14229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 14239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington errmsg = "Message did not receive a reply (timeout by message bus)"; 142431988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (message, &iter); 14259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &errmsg)) 142664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 142764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 142864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_transaction_send_from_driver (transaction, pending->will_get_reply, 142964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington message)) 143064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 143164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 143264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington retval = TRUE; 143364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 143464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington out: 143564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_message_unref (message); 143664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return retval; 143764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 143864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1439bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Penningtonstatic dbus_bool_t 144064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_pending_reply_expired (BusExpireList *list, 144164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link, 144264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington void *data) 144364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 144464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending = link->data; 144564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusConnections *connections = data; 144664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction; 144764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 144864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* No reply is forthcoming. So nuke it if we can. If not, 144964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * leave it in the list to try expiring again later when we 145064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * get more memory. 145164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 1452d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1453d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Expiring pending reply %p, replier %p receiver %p serial %u\n", 1454d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1455d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1456d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1457d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1458d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 145964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington transaction = bus_transaction_new (connections->context); 146064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (transaction == NULL) 1461bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return FALSE; 146264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1463d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington if (!bus_pending_reply_send_no_reply (connections, 1464d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington transaction, 1465d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending)) 146664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 146764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_transaction_cancel_and_free (transaction); 1468bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return FALSE; 146964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 1470a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 1471a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove_link (connections->pending_replies, link); 1472a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 1473d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 147464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_transaction_execute_and_free (transaction); 1475bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington 1476bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return TRUE; 147764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 147864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 147964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 148064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_connection_drop_pending_replies (BusConnections *connections, 148164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *connection) 148264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 148364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* The DBusConnection is almost 100% finalized here, so you can't 148464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * do anything with it except check for pointer equality 148564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 148664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 1487d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1488d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Dropping pending replies that involve connection %p\n", 1489d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington connection); 149064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1491a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_first_link (connections->pending_replies); 149264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington while (link != NULL) 149364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 149464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *next; 149564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending; 149664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1497a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington next = bus_expire_list_get_next_link (connections->pending_replies, 1498a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 149964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending = link->data; 150064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 150164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending->will_get_reply == connection) 150264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 150364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* We don't need to track this pending reply anymore */ 150464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1505d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Dropping pending reply %p, replier %p receiver %p serial %u\n", 1506d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1507d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1508d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1509d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1510d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1511a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove_link (connections->pending_replies, 1512a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 1513d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 151464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 151564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington else if (pending->will_send_reply == connection) 151664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 151764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* The reply isn't going to be sent, so set things 151864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * up so it will be expired right away 151964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 1520d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Will expire pending reply %p, replier %p receiver %p serial %u\n", 1521d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1522d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1523d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1524d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1525d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 152664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_send_reply = NULL; 152764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->expire_item.added_tv_sec = 0; 152864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->expire_item.added_tv_usec = 0; 152964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1530a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_recheck_immediately (connections->pending_replies); 153164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 153264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 153364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington link = next; 153464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 153564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 153664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 153764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 153864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtontypedef struct 153964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 154064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending; 154164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusConnections *connections; 154264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} CancelPendingReplyData; 154364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 154464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 154564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncancel_pending_reply (void *data) 154664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 154764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CancelPendingReplyData *d = data; 154864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1549d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1550d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1551a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington if (!bus_expire_list_remove (d->connections->pending_replies, 1552a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington &d->pending->expire_item)) 155364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert_not_reached ("pending reply did not exist to be cancelled"); 155464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1555d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (d->pending); /* since it's been cancelled */ 155664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 155764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 155864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 155964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncancel_pending_reply_data_free (void *data) 156064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 156164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CancelPendingReplyData *d = data; 156264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1563d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1564d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 156564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* d->pending should be either freed or still 156664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * in the list of pending replies (owned by someone 156764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * else) 156864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 156964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 157064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (d); 157164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 157264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 157364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington/* 157464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * Record that a reply is allowed; return TRUE on success. 157564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 157664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtondbus_bool_t 157764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_connections_expect_reply (BusConnections *connections, 157864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction, 157964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *will_get_reply, 158064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *will_send_reply, 158164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessage *reply_to_this, 158264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusError *error) 158364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 158464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending; 158564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_uint32_t reply_serial; 158664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 158764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CancelPendingReplyData *cprd; 1588df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg int count; 158964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 159064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (will_get_reply != NULL); 159164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (will_send_reply != NULL); 159264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (reply_to_this != NULL); 159364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 159464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (dbus_message_get_no_reply (reply_to_this)) 159564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return TRUE; /* we won't allow a reply, since client doesn't care for one. */ 159664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 15973251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington reply_serial = dbus_message_get_serial (reply_to_this); 159864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1599a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_first_link (connections->pending_replies); 1600df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg count = 0; 160164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington while (link != NULL) 160264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 160364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending = link->data; 160464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 160564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending->reply_serial == reply_serial && 160664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_get_reply == will_get_reply && 160764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_send_reply == will_send_reply) 160864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 160964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 161064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington "Message has the same reply serial as a currently-outstanding existing method call"); 161164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 161264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 161364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1614a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_next_link (connections->pending_replies, 1615a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 161634bb5b690b6d8d79edcb7dbd9abda4c1ab2bdc5eJohn (J if (pending->will_get_reply == will_get_reply) 161734bb5b690b6d8d79edcb7dbd9abda4c1ab2bdc5eJohn (J ++count; 161864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 161964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1620df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg if (count >= 1621df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg bus_context_get_max_replies_per_connection (connections->context)) 1622df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg { 1623df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1624df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg "The maximum number of pending replies per connection has been reached"); 1625df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg return FALSE; 1626df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg } 1627df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg 162864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending = dbus_new0 (BusPendingReply, 1); 162964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending == NULL) 163064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 163164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 163264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 163364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 163464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1635d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE 1636d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington /* so we can see a not-yet-added pending reply */ 1637d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->expire_item.added_tv_sec = 1; 1638d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->expire_item.added_tv_usec = 1; 1639d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington#endif 1640d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1641d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply = will_get_reply; 1642d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply = will_send_reply; 1643d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial = reply_serial; 1644d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 164564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd = dbus_new0 (CancelPendingReplyData, 1); 164664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (cprd == NULL) 164764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 164864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 1649d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 165064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 165164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 165264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1653a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington if (!bus_expire_list_add (connections->pending_replies, 1654a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington &pending->expire_item)) 165564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 165664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 165764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (cprd); 1658d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 165964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 166064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 166164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 166264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_transaction_add_cancel_hook (transaction, 166364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cancel_pending_reply, 166464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd, 166564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cancel_pending_reply_data_free)) 166664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 166764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 1668a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove (connections->pending_replies, &pending->expire_item); 166964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (cprd); 1670d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 167164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 167264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 167364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 167464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->pending = pending; 167564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->connections = connections; 167664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 167764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_get_current_time (&pending->expire_item.added_tv_sec, 167864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington &pending->expire_item.added_tv_usec); 167964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1680d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Added pending reply %p, replier %p receiver %p serial %u\n", 1681d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1682d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1683d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1684d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1685d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 168664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return TRUE; 168764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 168864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 168964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtontypedef struct 169064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 169164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 169264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusConnections *connections; 169364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} CheckPendingReplyData; 169464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 169564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 169664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncancel_check_pending_reply (void *data) 169764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 169864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CheckPendingReplyData *d = data; 169964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1700d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1701a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 1702a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_add_link (d->connections->pending_replies, 1703a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington d->link); 170464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington d->link = NULL; 170564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 170664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 170764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 170864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncheck_pending_reply_data_free (void *data) 170964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 171064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CheckPendingReplyData *d = data; 171164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1712d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1713d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 171464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (d->link != NULL) 171564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 171664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending = d->link->data; 1717d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1718a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_assert (!bus_expire_list_contains_item (d->connections->pending_replies, 1719a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington &pending->expire_item)); 1720d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1721d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 172264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_list_free_link (d->link); 172364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 172464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 172564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (d); 172664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 172764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 172864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington/* 172964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * Check whether a reply is allowed, remove BusPendingReply 173064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * if so, return TRUE if so. 173164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 173264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtondbus_bool_t 173364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_connections_check_reply (BusConnections *connections, 173464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction, 173564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *sending_reply, 173664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *receiving_reply, 173764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessage *reply, 173864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusError *error) 173964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 174064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CheckPendingReplyData *cprd; 174164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 174264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_uint32_t reply_serial; 174364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 174464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (sending_reply != NULL); 174564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (receiving_reply != NULL); 174664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 174764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington reply_serial = dbus_message_get_reply_serial (reply); 174864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1749a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_first_link (connections->pending_replies); 175064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington while (link != NULL) 175164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 175264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending = link->data; 175364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 175464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending->reply_serial == reply_serial && 175564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_get_reply == receiving_reply && 175664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_send_reply == sending_reply) 175764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 1758d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Found pending reply with serial %u\n", reply_serial); 175964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington break; 176064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 176164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1762a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_next_link (connections->pending_replies, 1763a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 176464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 176564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 176664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (link == NULL) 176764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 17683251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("No pending reply expected\n"); 17693251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 177064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 177164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 177264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 177364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd = dbus_new0 (CheckPendingReplyData, 1); 177464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (cprd == NULL) 177564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 177664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 177764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 177864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 177964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 178064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_transaction_add_cancel_hook (transaction, 178164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cancel_check_pending_reply, 178264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd, 178364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington check_pending_reply_data_free)) 178464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 178564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 178664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (cprd); 178764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 178864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 178964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 179064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->link = link; 179164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->connections = connections; 179264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1793a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_unlink (connections->pending_replies, 1794a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 1795d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1796a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_assert (!bus_expire_list_contains_item (connections->pending_replies, link->data)); 179764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 179864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return TRUE; 179964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 1800983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 18013df260c07102745c5606c313af862558f105f83eHavoc Pennington/* 18026be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Transactions 18036be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * 18046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Note that this is fairly fragile; in particular, don't try to use 18056be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * one transaction across any main loop iterations. 18066be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 18076be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 180829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct 180929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 181029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 181129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 181229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 181329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend; 181429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 18156be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtontypedef struct 18166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 18176be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function; 18186be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function; 18196be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data; 18206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} CancelHook; 18216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 182229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction 182329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 182429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *connections; 18256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 18266be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *cancel_hooks; 182729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 182829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 182929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 183029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection, 183129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send) 183229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 183329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->message) 183429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (to_send->message); 183529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 183629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated) 183729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, to_send->preallocated); 183829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 183929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 184029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 184129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 18426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 18436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_cancel (void *element, 18446be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 18456be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 18466be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 18476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18486be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Running transaction cancel hook\n"); 18496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18506be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->cancel_function) 18516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->cancel_function) (ch->data); 18526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 18536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 18556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_free (void *element, 18566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 18576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 18586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 18596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->free_data_function) 18616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->free_data_function) (ch->data); 18626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 18646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 18656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 18676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonfree_cancel_hooks (BusTransaction *transaction) 18686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 18696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 18706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_free, NULL); 18716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 18726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_clear (&transaction->cancel_hooks); 18736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 18746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 187529560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction* 18766ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context) 187729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 187829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 187929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 188029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = dbus_new0 (BusTransaction, 1); 188129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 188229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return NULL; 188329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 18846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction->context = context; 18856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 188629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return transaction; 188729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 188829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 18896ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 18906ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction *transaction) 18916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 18926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return transaction->context; 18936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 18946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 18956ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 18966ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction *transaction) 18976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 18986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_connections (transaction->context); 18996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 19006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 190129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 1902777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send_from_driver (BusTransaction *transaction, 1903777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 1904777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 1905777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{ 1906777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* We have to set the sender to the driver, and have 1907777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * to check security policy since it was not done in 1908777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * dispatch.c 1909777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 191095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_verbose ("Sending %s %s %s from driver\n", 191195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) ? 191295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) : "(no interface)", 191395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) ? 191495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) : "(no member)", 191595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) ? 191695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) : "(no error name)"); 191795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 1918248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 1919777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return FALSE; 1920777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1921eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington if (bus_connection_is_active (connection)) 1922eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington { 1923eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington if (!dbus_message_set_destination (message, 1924eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington bus_connection_get_name (connection))) 1925eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington return FALSE; 1926eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington } 1927eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington 19283251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington /* bus driver never wants a reply */ 19293251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington dbus_message_set_no_reply (message, TRUE); 19303251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 1931777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* If security policy doesn't allow the message, we silently 1932777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * eat it; the driver doesn't care about getting a reply. 1933777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 1934777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_context_check_security_policy (bus_transaction_get_context (transaction), 193564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington transaction, 1936a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington NULL, connection, connection, message, NULL)) 1937777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return TRUE; 1938777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1939777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return bus_transaction_send (transaction, connection, message); 1940777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington} 1941777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 1942777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t 1943777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send (BusTransaction *transaction, 1944777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 1945777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 194629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 194729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 194829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 194929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 195029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 195195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_verbose (" trying to add %s interface=%s member=%s error=%s to transaction%s\n", 1952b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? "error" : 1953dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington dbus_message_get_reply_serial (message) != 0 ? "reply" : 195451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington "message", 195595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) ? 195695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) : "(unset)", 195795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) ? 195895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) : "(unset)", 195995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) ? 196095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) : "(unset)", 1961ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_get_is_connected (connection) ? 1962ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington "" : " (disconnected)"); 1963056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 1964056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 1965f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 196629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 196729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; /* silently ignore disconnected connections */ 196829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 196929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 197029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 197129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 197229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send = dbus_new (MessageToSend, 1); 197329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send == NULL) 197429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 197529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 197629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 197729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 197829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->preallocated = dbus_connection_preallocate_send (connection); 197929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated == NULL) 198029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 198129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 198229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 198329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 198429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 198529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_ref (message); 198629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->message = message; 198729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->transaction = transaction; 198829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1989d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("about to prepend message\n"); 1990d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 199129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&d->transaction_messages, to_send)) 199229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 199329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 199429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 199529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 1996d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 1997d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("prepended message\n"); 199829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 199929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* See if we already had this connection in the list 200029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for this transaction. If we have a pending message, 200129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then we should already be in transaction->connections 200229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 200329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 200429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (link->data == to_send); 200529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_next_link (&d->transaction_messages, link); 200629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 200729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 200829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 200929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 201029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 201129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 201229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington break; 201329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 201429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 201529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 201629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 201729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (link == NULL) 201829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 201929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&transaction->connections, connection)) 202029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 202129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 202229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 202329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 202429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 202529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 202629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 202729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 202829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 202929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 203029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 203129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection, 203229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 203329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 203429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 203529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 203629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 203729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 203829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 203929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 204029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 204129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 204229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 204329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 204429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 204529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 204629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 204729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 204829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 204929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 205029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 205129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 205229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 205329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 205429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 205529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 205629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 205729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 205829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 205929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction) 206029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 206129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 2062ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 2063ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: cancelled\n"); 206429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 206529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 206629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_cancel_transaction (connection, transaction); 206729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 206829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 206929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 20706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 20716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_cancel, NULL); 20726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 20736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 20746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 207529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 207629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 207729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 207829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 207929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection, 208029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 208129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 208229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 208329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 208429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 208529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 208629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 208729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 208829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Send the queue in order (FIFO) */ 208929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_last_link (&d->transaction_messages); 209029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 209129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 209229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 209329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link); 209429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 209529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 209629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 209729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 209829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 209929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2100056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (m->message) != NULL); 2101056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 210229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, 210329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated, 210429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->message, 210529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL); 210629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 210729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated = NULL; /* so we don't double-free it */ 210829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 210929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 211029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 211129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 211229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = prev; 211329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 211429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 211529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 211629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 211729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction) 211829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 211929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* For each connection in transaction->connections 212029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * send the messages 212129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 212229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 2123ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 2124ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: executing\n"); 212529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 212629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 212729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_execute_transaction (connection, transaction); 212829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 212929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 213029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 21316be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 21326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 213329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 213429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 213529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 213629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 213729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection) 213829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 213929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 214029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 214129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 214229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 214329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 214429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 214529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((to_send = _dbus_list_get_first (&d->transaction_messages))) 214629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 214729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* only has an effect for the first MessageToSend listing this transaction */ 214829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&to_send->transaction->connections, 214929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection); 215029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 215129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 215229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 215329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 215429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 215529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 215629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 215729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply 215829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 215929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 216029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction *transaction, 216129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 216229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const DBusError *error, 216329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 216429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 216529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *reply; 216690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 216729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (error != NULL); 216829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 216968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 2170e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Sending error reply %s \"%s\"\n", 2171e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error->name, error->message); 2172e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 2173b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_error (in_reply_to, 2174b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington error->name, 2175b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington error->message); 217629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 217729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 217829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2179777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 218029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 218129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 218229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 218329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 218429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2185e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (reply); 2186e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 218729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 2188a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 21896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 21906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 21916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_transaction_add_cancel_hook (BusTransaction *transaction, 21926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function, 21936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data, 21946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function) 21956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 21966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch; 21976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 21986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch = dbus_new (CancelHook, 1); 21996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch == NULL) 22006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 2201d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 2202d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose (" adding cancel hook function = %p data = %p\n", 2203d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington cancel_function, data); 22046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22056be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->cancel_function = cancel_function; 22066be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->data = data; 22076be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->free_data_function = free_data_function; 22086be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22096be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington /* It's important that the hooks get run in reverse order that they 22106be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * were added 22116be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 22126be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!_dbus_list_prepend (&transaction->cancel_hooks, ch)) 22136be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 22146be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 22156be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 22166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 22176be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22186be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return TRUE; 22196be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 2220