connection.c revision e6bbcbd903f9989cf9fe69ca4efa807848a6c11c
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 35e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters/* Trim executed commands to this length; we want to keep logs readable */ 36e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters#define MAX_LOG_COMMAND_LEN 50 37e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection); 3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 404097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Penningtontypedef struct 414097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington{ 424097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington BusExpireItem expire_item; 434097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 444097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington DBusConnection *will_get_reply; 454097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington DBusConnection *will_send_reply; 464097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 474097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington dbus_uint32_t reply_serial; 484097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 494097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington} BusPendingReply; 504097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington 516ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections 526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington int refcount; 54983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *completed; /**< List of all completed connections */ 55983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int n_completed; /**< Length of completed list */ 56983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *incomplete; /**< List of all not-yet-active connections */ 57983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int n_incomplete; /**< Length of incomplete list */ 586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 59983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusHashTable *completed_by_user; /**< Number of completed connections for each UID */ 601820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington DBusTimeout *expire_timeout; /**< Timeout for expiring incomplete connections. */ 61d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington int stamp; /**< Incrementing number */ 6264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusExpireList *pending_replies; /**< List of pending replies */ 636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}; 646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 656843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Penningtonstatic dbus_int32_t connection_data_slot = -1; 6696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 6796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct 6896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 70983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link_in_connection_list; 7129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 7296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington DBusList *services_owned; 73b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington int n_services_owned; 74a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *match_rules; 75a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington int n_match_rules; 76aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson char *name; 7729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */ 7829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *oom_message; 7929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *oom_preallocated; 80bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington BusClientPolicy *policy; 811820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 82e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters char *cached_loginfo_string; 831e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BusSELinuxID *selinux_id; 841e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 851820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington long connection_tv_sec; /**< Time when we connected (seconds component) */ 861820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington long connection_tv_usec; /**< Time when we connected (microsec component) */ 87a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington int stamp; /**< connections->stamp last time we were traversed */ 8896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData; 8996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 90bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Penningtonstatic dbus_bool_t bus_pending_reply_expired (BusExpireList *list, 91bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington DBusList *link, 92bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington void *data); 9364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 9464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void bus_connection_drop_pending_replies (BusConnections *connections, 9564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *connection); 9664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 971820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic dbus_bool_t expire_incomplete_timeout (void *data); 981820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 9996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot)) 10096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 101df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop* 1021b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonconnection_get_loop (DBusConnection *connection) 1031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 1041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington BusConnectionData *d; 1051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 1061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 1081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return bus_context_get_loop (d->connections->context); 1091b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 1101b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 111983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 112983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic int 113983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonget_connections_for_uid (BusConnections *connections, 114983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_uid_t uid) 115983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 116983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *val; 117983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int current_count; 118983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 119983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* val is NULL is 0 when it isn't in the hash yet */ 120983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 121983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington val = _dbus_hash_table_lookup_ulong (connections->completed_by_user, 122983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid); 123983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 124983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count = _DBUS_POINTER_TO_INT (val); 125983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 126983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return current_count; 127983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 128983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 129983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 130983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonadjust_connections_for_uid (BusConnections *connections, 131983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_uid_t uid, 132983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int adjustment) 133983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 134983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington int current_count; 135983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 136983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count = get_connections_for_uid (connections, uid); 137983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 138983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_verbose ("Adjusting connection count for UID " DBUS_UID_FORMAT 139983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington ": was %d adjustment %d making %d\n", 140983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, current_count, adjustment, current_count + adjustment); 141983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 142983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (current_count >= 0); 143983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 144983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington current_count += adjustment; 145983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 146983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (current_count >= 0); 147983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 148983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (current_count == 0) 149983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 150983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_hash_table_remove_ulong (connections->completed_by_user, uid); 151983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 152983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 153983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington else 154983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 155983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_bool_t retval; 156983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 157983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington retval = _dbus_hash_table_insert_ulong (connections->completed_by_user, 158983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, _DBUS_INT_TO_POINTER (current_count)); 159983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 160983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* only positive adjustment can fail as otherwise 161983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * a hash entry should already exist 162983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 163983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (adjustment > 0 || 164983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington (adjustment <= 0 && retval)); 165983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 166983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return retval; 167983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 168983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 169983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 170fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid 17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection) 17296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 17396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 17496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service; 175a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 176a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 17796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 178d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_assert (d != NULL); 17996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 180d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n", 181d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington d->name ? d->name : "(inactive)"); 182a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 183a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* Delete our match rules */ 184a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (d->n_match_rules > 0) 185a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 186a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_context_get_matchmaker (d->connections->context); 187a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_matchmaker_disconnected (matchmaker, connection); 188a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 189d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 19015c60238853f2896738c23b53e574b5d9cae1635John (J /* Drop any service ownership. Unfortunately, this requires 19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * memory allocation and there doesn't seem to be a good way to 19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * handle it other than sleeping; we can't "fail" the operation of 19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * disconnecting a client, and preallocating a broadcast "service is 19429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * now gone" message for every client-service pair seems kind of 19515c60238853f2896738c23b53e574b5d9cae1635John (J * involved. 19629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 197ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((service = _dbus_list_get_last (&d->services_owned))) 198ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 199ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington BusTransaction *transaction; 200ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 201ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 202ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry: 203ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 204ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 205ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 206e3fa86b54a0bdc6a8eaf5def43b1947ddef59c85Havoc Pennington while ((transaction = bus_transaction_new (d->connections->context)) == NULL) 207e3fa86b54a0bdc6a8eaf5def43b1947ddef59c85Havoc Pennington _dbus_wait_for_memory (); 208ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 209ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_service_remove_owner (service, connection, 210ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington transaction, &error)) 211ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 2126be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 2136be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 214ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 215ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 216ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 217ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_cancel_and_free (transaction); 218df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 219ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry; 220ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 221ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 2226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 2236be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Failed to remove service owner: %s %s\n", 2246be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error.name, error.message); 2256be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason"); 2266be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 227ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 228ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 229ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_transaction_execute_and_free (transaction); 230ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 23196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 23239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_dispatch_remove_connection (connection); 233aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 23496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* no more watching */ 2353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 236f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 2373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 2383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 2413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 242f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, NULL, NULL, 2433bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 2443bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 2453bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 2463bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 24744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 24844fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 2497be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_connection_set_windows_user_function (connection, 2507be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington NULL, NULL, NULL); 2517be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 2527caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 2537caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 25444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 25529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_remove_transactions (connection); 2566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 257983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list != NULL) 258983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 259983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->name != NULL) 260983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 261983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 262983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_remove_link (&d->connections->completed, d->link_in_connection_list); 264983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = NULL; 265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_completed -= 1; 2666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!adjust_connections_for_uid (d->connections, 270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, -1)) 271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert_not_reached ("adjusting downward should never fail"); 272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington else 275983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 276983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_remove_link (&d->connections->incomplete, d->link_in_connection_list); 277983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = NULL; 278983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_incomplete -= 1; 279983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 280983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 281983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_incomplete >= 0); 282983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_completed >= 0); 283983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 28464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 28564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_connection_drop_pending_replies (d->connections, connection); 286983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 2876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington /* frees "d" as side effect */ 28896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_set_data (connection, 28996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington NULL, NULL); 29164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 29296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_connection_unref (connection); 29396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 29496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 295b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t 29696a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch *watch, 29796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington unsigned int condition, 29896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington void *data) 29996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3003df260c07102745c5606c313af862558f105f83eHavoc Pennington /* FIXME this can be done in dbus-mainloop.c 301ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington * if the code in activation.c for the babysitter 302ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington * watch handler is fixed. 303ab10ae902d8aa7c2b98fd080a7458127b1b8e648Havoc Pennington */ 3043df260c07102745c5606c313af862558f105f83eHavoc Pennington 30551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#if 0 30651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Calling handle_watch\n"); 30751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#endif 3083df260c07102745c5606c313af862558f105f83eHavoc Pennington return dbus_watch_handle (watch, condition); 30996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 31096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 3113bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 31296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch *watch, 3131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 31496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3151b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 317df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_watch (connection_get_loop (connection), 318df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection, 319df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington NULL); 32096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 32196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 32296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 32396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch *watch, 3241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 32596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 3261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3271b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 328df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_watch (connection_get_loop (connection), 329df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington watch, connection_watch_callback, connection); 33096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 33196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 33296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void 3333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout *timeout, 3343bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington void *data) 3353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3363df260c07102745c5606c313af862558f105f83eHavoc Pennington /* DBusConnection *connection = data; */ 3374c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 338b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 3393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_timeout_handle (timeout); 3403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3423bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 3433bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout *timeout, 3441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 3453bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3461b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3471b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 348df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington return _dbus_loop_add_timeout (connection_get_loop (connection), 349df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection, NULL); 3503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3523bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 3533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout *timeout, 3541b08036103a70159e7a67b2349306710edcd6654Havoc Pennington void *data) 3553bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 3561b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusConnection *connection = data; 3571b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 358df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_loop_remove_timeout (connection_get_loop (connection), 359df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington timeout, connection_timeout_callback, connection); 3603bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 3613bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 3627caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtonstatic void 3637caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtondispatch_status_function (DBusConnection *connection, 3647caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusDispatchStatus new_status, 3657caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington void *data) 3667caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington{ 3677caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington DBusLoop *loop = data; 3687caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 3697caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (new_status != DBUS_DISPATCH_COMPLETE) 3707caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 3717caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington while (!_dbus_loop_queue_dispatch (loop, connection)) 3727caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington _dbus_wait_for_memory (); 3737caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 3747caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington} 3757caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 376a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t 3777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonallow_unix_user_function (DBusConnection *connection, 3787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unsigned long uid, 3797be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington void *data) 380a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 381a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 382a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 383a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 384a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 385a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 386a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 3877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington return bus_context_allow_unix_user (d->connections->context, uid); 388a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 389a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 3903bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void 39196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data) 39296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 39396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d = data; 39496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 39596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington /* services_owned should be NULL since we should be disconnected */ 39696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d->services_owned == NULL); 397b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d->n_services_owned == 0); 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* similarly */ 39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->transaction_messages == NULL); 400aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated) 40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated); 403f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 40429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_message) 40529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 406a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 407a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (d->policy) 408bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington bus_client_policy_unref (d->policy); 4091e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 4101e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (d->selinux_id) 4111e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington bus_selinux_id_unref (d->selinux_id); 412a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 413e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters dbus_free (d->cached_loginfo_string); 414e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 415aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson dbus_free (d->name); 41696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 41796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 41896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 41996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4201820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic void 4211820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtoncall_timeout_callback (DBusTimeout *timeout, 4221820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington void *data) 4231820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 4241820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 4251820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington dbus_timeout_handle (timeout); 4261820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 4271820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4286ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 4296ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context) 43096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 4316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 43296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4336843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington if (!dbus_connection_allocate_data_slot (&connection_data_slot)) 4341820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_0; 43596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 4366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = dbus_new0 (BusConnections, 1); 4376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections == NULL) 4381820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_1; 439983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 440983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections->completed_by_user = _dbus_hash_table_new (DBUS_HASH_ULONG, 441983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington NULL, NULL); 442983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->completed_by_user == NULL) 4431820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_2; 4441820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4451820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout = _dbus_timeout_new (100, /* irrelevant */ 4461820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington expire_incomplete_timeout, 4471820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections, NULL); 4481820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (connections->expire_timeout == NULL) 4491820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington goto failed_3; 4501820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 4511820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_set_enabled (connections->expire_timeout, FALSE); 4521820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 45364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington connections->pending_replies = bus_expire_list_new (bus_context_get_loop (context), 45464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_context_get_reply_timeout (context), 45564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_pending_reply_expired, 45664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington connections); 45764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (connections->pending_replies == NULL) 45864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto failed_4; 45964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 4601820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington if (!_dbus_loop_add_timeout (bus_context_get_loop (context), 4611820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout, 4621820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington call_timeout_callback, NULL, NULL)) 46364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto failed_5; 4646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount = 1; 4666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->context = context; 4676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections; 4691820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 47064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington failed_5: 47164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_expire_list_free (connections->pending_replies); 4721820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_4: 4731820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_unref (connections->expire_timeout); 4741820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_3: 4751820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_hash_table_unref (connections->completed_by_user); 4761820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_2: 4771820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington dbus_free (connections); 4781820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_1: 4796843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&connection_data_slot); 4801820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington failed_0: 4811820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington return NULL; 4826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 4836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4849f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalBusConnections * 4856ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections) 4866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 4876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 4886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount += 1; 4899f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 4909f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return connections; 4916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 4926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4936ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 4946ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections) 4956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 4966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (connections->refcount > 0); 4976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections->refcount -= 1; 4986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (connections->refcount == 0) 4996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington { 500983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* drop all incomplete */ 501983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (connections->incomplete != NULL) 502ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 503ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection; 504ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 505983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connection = connections->incomplete->data; 506ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 507ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 50811fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 509ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_connection_disconnected (connection); 510ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 511ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 512983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 513983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->n_incomplete == 0); 5146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 515983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* drop all real connections */ 516983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (connections->completed != NULL) 517983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 518983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection; 519983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 520983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connection = connections->completed->data; 521983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 522983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_connection_ref (connection); 52311fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 524983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_connection_disconnected (connection); 52564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_connection_unref (connection); 526983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 527983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 528983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->n_completed == 0); 529983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 53064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_expire_list_free (connections->pending_replies); 53164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 5321820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_loop_remove_timeout (bus_context_get_loop (connections->context), 5331820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington connections->expire_timeout, 5341820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington call_timeout_callback, NULL); 5351820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 5361820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_timeout_unref (connections->expire_timeout); 5371820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 538983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_hash_table_unref (connections->completed_by_user); 5396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 540f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_free (connections); 541f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 5426843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington dbus_connection_free_data_slot (&connection_data_slot); 5436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington } 54496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 54596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 546e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters/* Used for logging */ 547e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Waltersstatic dbus_bool_t 548e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walterscache_peer_loginfo_string (BusConnectionData *d, 549e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters DBusConnection *connection) 550e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters{ 551e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters DBusString loginfo_buf; 552e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters unsigned long uid; 553e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters unsigned long pid; 554e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters char *windows_sid; 555e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters dbus_bool_t prev_added; 556e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 557e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_init (&loginfo_buf)) 558e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters return FALSE; 559e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 560e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters prev_added = FALSE; 561e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (dbus_connection_get_unix_user (connection, &uid)) 562e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters { 563e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_append_printf (&loginfo_buf, "uid=%ld", uid)) 564e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto oom; 565e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters else 566e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters prev_added = TRUE; 567e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters } 568e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 569e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (dbus_connection_get_unix_process_id (connection, &pid)) 570e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters { 571e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (prev_added) 572e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters { 573e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_append_byte (&loginfo_buf, ' ')) 574e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto oom; 575e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters } 576e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_append_printf (&loginfo_buf, "pid=%ld comm=\"", pid)) 577e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto oom; 578e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters /* Ignore errors here */ 579e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (_dbus_command_for_pid (pid, &loginfo_buf, MAX_LOG_COMMAND_LEN, NULL)) 580e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters { 581e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_append_byte (&loginfo_buf, '"')) 582e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto oom; 583e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters } 584e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters } 585e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 586e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (dbus_connection_get_windows_user (connection, &windows_sid)) 587e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters { 588e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_append_printf (&loginfo_buf, "sid=\"%s\" ", windows_sid)) 589e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto oom; 590e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters dbus_free (windows_sid); 591e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters } 592e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 593e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!_dbus_string_steal_data (&loginfo_buf, &(d->cached_loginfo_string))) 594e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto oom; 595e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 596e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters _dbus_string_free (&loginfo_buf); 597e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 598e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters return TRUE; 599e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Waltersoom: 600e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters _dbus_string_free (&loginfo_buf); 601e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters return FALSE; 602e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters} 603e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 60496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t 6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections, 6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusConnection *connection) 60796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 608e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 60996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 610ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t retval; 6111e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington DBusError error; 612e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 613ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 6141b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson d = dbus_new0 (BusConnectionData, 1); 6151b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson 61696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (d == NULL) 61796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 6196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d->connections = connections; 62029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->connection = connection; 621d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 6221820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington _dbus_get_current_time (&d->connection_tv_sec, 6231820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington &d->connection_tv_usec); 6241820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 625f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (connection_data_slot >= 0); 62696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 62796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington if (!dbus_connection_set_data (connection, 62896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington connection_data_slot, 62996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d, free_connection_data)) 63096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington { 63196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington dbus_free (d); 63296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 63396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington } 634ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 635d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_connection_set_route_peer_messages (connection, TRUE); 636d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 637ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = FALSE; 6381e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 6391e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_error_init (&error); 6401e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington d->selinux_id = bus_selinux_init_connection_id (connection, 6411e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington &error); 6421e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (dbus_error_is_set (&error)) 6431e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 6441e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington /* This is a bit bogus because we pretend all errors 6451e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * are OOM; this is done because we know that in bus.c 6461e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * an OOM error disconnects the connection, which is 6471e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington * the same thing we want on any other error. 6481e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington */ 6491e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_error_free (&error); 6501e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington goto out; 6511e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 652e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 6533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_watch_functions (connection, 6541b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_watch, 6551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_watch, 656f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 6573bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, 6583bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington NULL)) 659ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 6603bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 6613bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_set_timeout_functions (connection, 6621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington add_connection_timeout, 6631b08036103a70159e7a67b2349306710edcd6654Havoc Pennington remove_connection_timeout, 664f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington NULL, 6653bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington connection, NULL)) 666ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 6677be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 6687be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington /* For now we don't need to set a Windows user function because 6697be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * there are no policies in the config file controlling what 6707be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * Windows users can connect. The default 'same user that owns the 6717be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * bus can connect' behavior of DBusConnection is fine on Windows. 6727be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */ 67344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 6747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington allow_unix_user_function, 67544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL); 6767caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 6777caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 6787caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dispatch_status_function, 6797caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_context_get_loop (connections->context), 6807caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL); 681983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 682983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list = _dbus_list_alloc_link (connection); 683983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list == NULL) 684983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington goto out; 68596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 68639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Setup the connection with the dispatcher */ 68739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (!bus_dispatch_add_connection (connection)) 688ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 6897caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington 6907caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) 6917caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 6927caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection)) 6937caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington { 6947caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington bus_dispatch_remove_connection (connection); 6957caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington goto out; 6967caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 6977caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington } 698983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 699983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_append_link (&connections->incomplete, d->link_in_connection_list); 700983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections->n_incomplete += 1; 701ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 7023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington dbus_connection_ref (connection); 703983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 704983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Note that we might disconnect ourselves here, but it only takes 7051820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * effect on return to the main loop. We call this to free up 7061820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * expired connections if possible, and to queue the timeout for our 7071820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * own expiration. 7081820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington */ 7091820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington bus_connections_expire_incomplete (connections); 7101820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7111820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* And we might also disconnect ourselves here, but again it 7121820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington * only takes effect on return to main loop. 713983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 714983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->n_incomplete > 715983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_incomplete_connections (connections->context)) 716983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 717983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_verbose ("Number of incomplete connections exceeds max, dropping oldest one\n"); 718983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 719983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (connections->incomplete != NULL); 720983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Disconnect the oldest unauthenticated connection. FIXME 721983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * would it be more secure to drop a *random* connection? This 722983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * algorithm seems to mean that if someone can create new 723983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * connections quickly enough, they can keep anyone else from 724983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * completing authentication. But random may or may not really 725983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * help with that, a more elaborate solution might be required. 726983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 72711fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connections->incomplete->data); 728983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 729983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 730ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retval = TRUE; 731ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 732ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 733ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!retval) 7341e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 7351e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (d->selinux_id) 7361e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington bus_selinux_id_unref (d->selinux_id); 7371e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington d->selinux_id = NULL; 7381e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 739ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_watch_functions (connection, 740ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 741ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 742ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 743ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting watch functions to NULL failed"); 744ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 745ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_connection_set_timeout_functions (connection, 746ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL, NULL, NULL, 747ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection, 748ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington NULL)) 749ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 75044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington 75144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington dbus_connection_set_unix_user_function (connection, 75244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington NULL, NULL, NULL); 7531b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 7547be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington dbus_connection_set_windows_user_function (connection, 7557be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington NULL, NULL, NULL); 7567be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington 7577caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington dbus_connection_set_dispatch_status_function (connection, 7587caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington NULL, NULL, NULL); 759983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 760983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (d->link_in_connection_list != NULL) 761983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 762983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->link_in_connection_list->next == NULL); 763983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->link_in_connection_list->prev == NULL); 764983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_free_link (d->link_in_connection_list); 765d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington d->link_in_connection_list = NULL; 766983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 767d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 768d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington if (!dbus_connection_set_data (connection, 769d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington connection_data_slot, 770d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington NULL, NULL)) 771d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington _dbus_assert_not_reached ("failed to set connection data to null"); 772d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington 773d4e80132af03363a2f861cfd611847ee8758aed9Havoc Pennington /* "d" has now been freed */ 774ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 775aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 776ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return retval; 77796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 77896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 7791820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonvoid 7801820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonbus_connections_expire_incomplete (BusConnections *connections) 7811820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 7821820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington int next_interval; 7831820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 7841820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington next_interval = -1; 7851820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 786b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington if (connections->incomplete != NULL) 7871820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington { 788b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington long tv_sec, tv_usec; 789b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusList *link; 790b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington int auth_timeout; 7911820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 792b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_get_current_time (&tv_sec, &tv_usec); 793b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington auth_timeout = bus_context_get_auth_timeout (connections->context); 794b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 795b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington link = _dbus_list_get_first_link (&connections->incomplete); 796b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington while (link != NULL) 797b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 798b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link); 799b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington DBusConnection *connection; 800b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington BusConnectionData *d; 801b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington double elapsed; 8021820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 803b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington connection = link->data; 8041820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 805b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d = BUS_CONNECTION_DATA (connection); 8061820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 807b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d != NULL); 808b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 80940751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington elapsed = ELAPSED_MILLISECONDS_SINCE (d->connection_tv_sec, 81040751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington d->connection_tv_usec, 81140751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington tv_sec, tv_usec); 8121820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 813b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington if (elapsed >= (double) auth_timeout) 814b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 815b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Timing out authentication for connection %p\n", connection); 81611fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 817b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 818b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington else 819b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 820b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* We can end the loop, since the connections are in oldest-first order */ 821b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington next_interval = ((double)auth_timeout) - elapsed; 822b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Connection %p authentication expires in %d milliseconds\n", 823b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington connection, next_interval); 8241820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 825b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington break; 826b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 8271820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 828b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington link = next; 829b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 8301820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington } 8311820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 83240751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington bus_expire_timeout_set_interval (connections->expire_timeout, 83340751c847b18b4861f623fc83fc8742bc463363bHavoc Pennington next_interval); 8341820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 8351820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 8361820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonstatic dbus_bool_t 8371820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Penningtonexpire_incomplete_timeout (void *data) 8381820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington{ 8391820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington BusConnections *connections = data; 8401820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 841b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_verbose ("Running %s\n", _DBUS_FUNCTION_NAME); 842b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 8431820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington /* note that this may remove the timeout */ 8441820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington bus_connections_expire_incomplete (connections); 8451820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 8461820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington return TRUE; 8471820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington} 8481820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington 849a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 8507be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonbus_connection_get_unix_groups (DBusConnection *connection, 8517be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unsigned long **groups, 8527be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington int *n_groups, 8537be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington DBusError *error) 854a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 855a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 8567c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long uid; 8577c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington 858a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 859a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 860a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 861a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 862a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *groups = NULL; 863a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington *n_groups = 0; 864a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 8657c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 866a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 8677be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (!_dbus_unix_groups_from_uid (uid, groups, n_groups)) 868a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 8697c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Did not get any groups for UID %lu\n", 8707c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington uid); 8717c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return FALSE; 8727c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 8737c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 8747c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 8757c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington _dbus_verbose ("Got %d groups for UID %lu\n", 8767c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington *n_groups, uid); 8777c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 878a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 879a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 8807c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington else 8817c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; /* successfully got 0 groups */ 882a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 883a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 884a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t 8857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonbus_connection_is_in_unix_group (DBusConnection *connection, 8867be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington unsigned long gid) 887a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 888a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int i; 8897c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington unsigned long *group_ids; 890a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington int n_group_ids; 891a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 8927be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (!bus_connection_get_unix_groups (connection, &group_ids, &n_group_ids, 8937be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington NULL)) 894a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 895a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 896a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington i = 0; 897a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington while (i < n_group_ids) 898a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington { 899a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington if (group_ids[i] == gid) 9007c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington { 9017c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 9027c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington return TRUE; 9037c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington } 904a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington ++i; 905a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington } 906a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 9077c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington dbus_free (group_ids); 908a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return FALSE; 909a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 910a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 911e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Waltersconst char * 912e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Waltersbus_connection_get_loginfo (DBusConnection *connection) 913e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters{ 914e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters BusConnectionData *d; 915e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 916e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters d = BUS_CONNECTION_DATA (connection); 917e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 918e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!bus_connection_is_active (connection)) 919e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters return "inactive"; 920e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters return d->cached_loginfo_string; 921e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters} 922e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 923bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy* 924e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Penningtonbus_connection_get_policy (DBusConnection *connection) 925a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{ 926a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington BusConnectionData *d; 927a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 928a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington d = BUS_CONNECTION_DATA (connection); 929a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington 930a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington _dbus_assert (d != NULL); 931e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_assert (d->policy != NULL); 932b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 933a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington return d->policy; 934a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington} 9356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 936983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 937983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonforeach_active (BusConnections *connections, 938983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 939983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 940983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 941983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link; 942983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 943983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = _dbus_list_get_first_link (&connections->completed); 944983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (link != NULL) 945983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 946983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection = link->data; 947983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->completed, link); 948983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 949983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!(* function) (connection, data)) 950983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 951983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 952983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = next; 953983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 954983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 955983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 956983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 957983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 958983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonstatic dbus_bool_t 959983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonforeach_inactive (BusConnections *connections, 960983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 961983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 962983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 963983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *link; 964983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 965983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = _dbus_list_get_first_link (&connections->incomplete); 966983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington while (link != NULL) 967983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 968983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *connection = link->data; 969983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link); 970983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 971983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!(* function) (connection, data)) 972983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 973983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 974983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington link = next; 975983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 976983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 977983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 978983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 979983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 980983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington/** 981983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * Calls function on each active connection; if the function returns 982983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * #FALSE, stops iterating. Active connections are authenticated 983983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * and have sent a Hello message. 984983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * 985983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param connections the connections object 986983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param function the function 987983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * @param data data to pass to it as a second arg 988983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 989983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonvoid 990983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_connections_foreach_active (BusConnections *connections, 991983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionForeachFunction function, 992983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 993983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 994983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington foreach_active (connections, function, data); 995983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 996983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 9976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/** 9986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns 9996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating. 10006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * 10016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object 10026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function 10036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg 10046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */ 10056ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid 10066ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections *connections, 10076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionForeachFunction function, 1008983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington void *data) 10096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 1010983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!foreach_active (connections, function, data)) 1011983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return; 10126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1013983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington foreach_inactive (connections, function, data); 10146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10166ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 10176ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections) 10186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return connections->context; 10206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1022a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington/* 1023a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * This is used to avoid covering the same connection twice when 1024a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * traversing connections. Note that it assumes we will 1025a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * bus_connection_mark_stamp() each connection at least once per 1026a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * INT_MAX increments of the global stamp, or wraparound would break 1027a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * things. 1028a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 1029a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonvoid 1030a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connections_increment_stamp (BusConnections *connections) 1031a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1032a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington connections->stamp += 1; 1033a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1034a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1035a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington/* Mark connection with current stamp, return TRUE if it 1036a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * didn't already have that stamp 1037a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 1038a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtondbus_bool_t 1039a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_mark_stamp (DBusConnection *connection) 1040a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1041a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1042a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1043a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1044a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1045a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1046a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1047a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (d->stamp == d->connections->stamp) 1048a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 1049a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else 1050a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1051a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d->stamp = d->connections->stamp; 1052a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1053a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1054a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1055a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 10566ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 10576ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection) 10586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 10606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10616ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 10646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections->context; 10666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10686ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 10696ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection) 10706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 10726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10736ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10746ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 10766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return d->connections; 10786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10806ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry* 10816ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection) 10826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 10846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 10886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_registry (d->connections->context); 10906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 10916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10926ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation* 10936ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection) 10946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 10956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnectionData *d; 10966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington d = BUS_CONNECTION_DATA (connection); 10986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 10996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (d != NULL); 11006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 11016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_activation (d->connections->context); 11026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 11036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 1104a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc PenningtonBusMatchmaker* 1105a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_get_matchmaker (DBusConnection *connection) 1106a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1107a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1108a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1109a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1110a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1111a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1112a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1113a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return bus_context_get_matchmaker (d->connections->context); 1114a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1115a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 11161e9b185b0c274ef0d684b1e43418388225321e72Havoc PenningtonBusSELinuxID* 11171e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtonbus_connection_get_selinux_id (DBusConnection *connection) 11181e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{ 11191e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BusConnectionData *d; 11201e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 11211e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington d = BUS_CONNECTION_DATA (connection); 11221e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 11231e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington _dbus_assert (d != NULL); 11241e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 11251e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return d->selinux_id; 11261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington} 11271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 112829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 112929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus. 113029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * 113129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection 113229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant 113329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 113429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 113529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection) 113629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 113729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 113829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 113929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 114029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 114129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return d != NULL && d->name != NULL; 114229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 114329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 114429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 114529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection) 114629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 114729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 114829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 114929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 115029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 115129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 115229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 115329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 115429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 115529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (d->oom_preallocated != NULL) 115629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 115729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 115829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington preallocated = dbus_connection_preallocate_send (connection); 115929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (preallocated == NULL) 116029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 116129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1162b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR); 1163b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 116429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 116529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 116629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 116729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 116829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 116929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1170b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington /* d->name may be NULL, but that is OK */ 117195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (!dbus_message_set_error_name (message, DBUS_ERROR_NO_MEMORY) || 1172b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_set_destination (message, d->name) || 1173b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_set_sender (message, 1174248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_SERVICE_DBUS)) 1175056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington { 1176056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 1177056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington dbus_message_unref (message); 1178056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington return FALSE; 1179056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington } 1180f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 118129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* set reply serial to placeholder value just so space is already allocated 118229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for it. 118329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 118429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (message, 14)) 118529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 118629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, preallocated); 118729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 118829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 118929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 119029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 119129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = message; 119229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = preallocated; 119329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 119429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 119529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 119629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 119729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 119829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection, 119929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 120029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 120129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 120229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 120329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 120429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 120529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 120629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d->oom_message != NULL); 120729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 120829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* should always succeed since we set it to a placeholder earlier */ 120929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_reply_serial (d->oom_message, 121029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_get_serial (in_reply_to))) 121129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message"); 121229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1213056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL); 1214056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 121529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, d->oom_preallocated, 121629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message, NULL); 121729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 121829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (d->oom_message); 121929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_message = NULL; 122029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d->oom_preallocated = NULL; 122129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 122229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 12236be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonvoid 1224a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_add_match_rule_link (DBusConnection *connection, 1225a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *link) 1226a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1227a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1228a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1229a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1230a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1231a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1232a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_list_append_link (&d->match_rules, link); 1233a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1234a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d->n_match_rules += 1; 1235a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1236a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1237a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtondbus_bool_t 1238a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_add_match_rule (DBusConnection *connection, 1239a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule) 1240a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1241a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *link; 1242a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1243a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington link = _dbus_list_alloc_link (rule); 1244a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1245a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (link == NULL) 1246a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 1247a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1248a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_add_match_rule_link (connection, link); 1249a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1250a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1251a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1252a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1253a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonvoid 1254a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_remove_match_rule (DBusConnection *connection, 1255a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule) 1256a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1257a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1258a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1259a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1260a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1261a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1262a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_list_remove_last (&d->match_rules, rule); 1263a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1264a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d->n_match_rules -= 1; 1265a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d->n_match_rules >= 0); 1266a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1267a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1268a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonint 1269a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_connection_get_n_match_rules (DBusConnection *connection) 1270a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1271a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusConnectionData *d; 1272a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1273a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1274a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (d != NULL); 1275a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1276a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return d->n_match_rules; 1277a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1278a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1279a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonvoid 12806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service_link (DBusConnection *connection, 12816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link) 128296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 128396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 128496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 128596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 128696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 128796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 12886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_append_link (&d->services_owned, link); 1289b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1290b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d->n_services_owned += 1; 12916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 12926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 12946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service (DBusConnection *connection, 12956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusService *service) 12966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 12976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *link; 12986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 12996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington link = _dbus_list_alloc_link (service); 13006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 13016be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (link == NULL) 130296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return FALSE; 130396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 13046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington bus_connection_add_owned_service_link (connection, link); 13056be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 130696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington return TRUE; 130796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 130896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 130996a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid 131096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection, 131196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusService *service) 131296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{ 131396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington BusConnectionData *d; 131496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 131596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington d = BUS_CONNECTION_DATA (connection); 131696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_assert (d != NULL); 131796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington 131896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington _dbus_list_remove_last (&d->services_owned, service); 1319b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1320b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d->n_services_owned -= 1; 1321b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d->n_services_owned >= 0); 1322b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington} 1323b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1324b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint 1325b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_connection_get_n_services_owned (DBusConnection *connection) 1326b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{ 1327b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington BusConnectionData *d; 1328b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1329b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington d = BUS_CONNECTION_DATA (connection); 1330b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington _dbus_assert (d != NULL); 1331b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1332b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington return d->n_services_owned; 133396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} 1334aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t 1336e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Penningtonbus_connection_complete (DBusConnection *connection, 1337e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington const DBusString *name, 1338e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington DBusError *error) 1339aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 1340aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 1341983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 1342aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1343aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 1344aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 1345aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d->name == NULL); 1346e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_assert (d->policy == NULL); 1347a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1348a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (!bus_connection_is_active (connection)); 1349983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1350fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_copy_data (name, &d->name)) 1351e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 1352e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington BUS_SET_OOM (error); 1353e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington return FALSE; 1354e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 1355aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1356fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_assert (d->name != NULL); 1357fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington 1358d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("Name %s assigned to %p\n", d->name, connection); 1359983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1360e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington d->policy = bus_context_create_client_policy (d->connections->context, 1361e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington connection, 1362e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error); 1363e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1364e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington /* we may have a NULL policy on OOM or error getting list of 1365e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington * groups for a user. In the latter case we don't handle it so 1366e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington * well currently, as it will just keep failing over and over. 1367e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington */ 1368e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1369e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (d->policy == NULL) 1370e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 1371e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Failed to create security policy for connection %p\n", 1372e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington connection); 1373e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 1374e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington dbus_free (d->name); 1375e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington d->name = NULL; 1376e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington return FALSE; 1377e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 1378e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 1379983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (connection, &uid)) 1380983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1381983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!adjust_connections_for_uid (d->connections, 1382983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid, 1)) 1383e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto fail; 1384983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1385e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 1386e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters /* Create and cache a string which holds information about the 1387e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters * peer process; used for logging purposes. 1388e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters */ 1389e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (!cache_peer_loginfo_string (d, connection)) 1390e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters goto fail; 1391e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters 1392983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Now the connection is active, move it between lists */ 1393983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_unlink (&d->connections->incomplete, 1394983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list); 1395983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_incomplete -= 1; 1396983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_list_append_link (&d->connections->completed, 1397983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->link_in_connection_list); 1398983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d->connections->n_completed += 1; 1399983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1400983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_incomplete >= 0); 1401983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->connections->n_completed > 0); 1402b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 1403b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* See if we can remove the timeout */ 1404b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington bus_connections_expire_incomplete (d->connections); 1405a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1406a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (bus_connection_is_active (connection)); 1407d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 1408aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 1409e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Waltersfail: 1410e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters BUS_SET_OOM (error); 1411e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters dbus_free (d->name); 1412e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters d->name = NULL; 1413e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters if (d->policy) 1414e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters bus_client_policy_unref (d->policy); 1415e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters d->policy = NULL; 1416e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters return FALSE; 1417aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 1418aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1419aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char * 1420aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection) 1421aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 1422aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusConnectionData *d; 1423aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1424aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson d = BUS_CONNECTION_DATA (connection); 1425aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (d != NULL); 1426aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 1427aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return d->name; 1428aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 1429a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 1430983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington/** 1431983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * Check whether completing the passed-in connection would 1432983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * exceed limits, and if so set error and return #FALSE 1433983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 1434983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtondbus_bool_t 1435983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_connections_check_limits (BusConnections *connections, 1436983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusConnection *requesting_completion, 1437983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington DBusError *error) 1438983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{ 1439983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnectionData *d; 1440983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington unsigned long uid; 1441983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1442983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington d = BUS_CONNECTION_DATA (requesting_completion); 1443983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d != NULL); 1444983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1445983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _dbus_assert (d->name == NULL); 1446983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1447983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (connections->n_completed >= 1448983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_completed_connections (connections->context)) 1449983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1450983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1451983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington "The maximum number of active connections has been reached"); 1452983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1453983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1454983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1455983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (dbus_connection_get_unix_user (requesting_completion, &uid)) 1456983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1457983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (get_connections_for_uid (connections, uid) >= 1458983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington bus_context_get_max_connections_per_user (connections->context)) 1459983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 1460983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1461983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington "The maximum number of active connections for UID %lu has been reached", 1462983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington uid); 1463983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 1464983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1465983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 1466983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1467983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return TRUE; 1468983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington} 1469983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 1470d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Penningtonstatic void 1471d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Penningtonbus_pending_reply_free (BusPendingReply *pending) 1472d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington{ 1473d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Freeing pending reply %p, replier %p receiver %p serial %u\n", 1474d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1475d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1476d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1477d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1478d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1479d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington dbus_free (pending); 1480d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington} 1481d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 148264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic dbus_bool_t 148364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_pending_reply_send_no_reply (BusConnections *connections, 148464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction, 148564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending) 148664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 148764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessage *message; 148864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessageIter iter; 148964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_bool_t retval; 14909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *errmsg; 149164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 149264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington retval = FALSE; 149364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 149464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR); 149564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (message == NULL) 149664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 149764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 149864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_message_set_no_reply (message, TRUE); 149964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 150064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!dbus_message_set_reply_serial (message, 150164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->reply_serial)) 150264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 150364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 150464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!dbus_message_set_error_name (message, 150564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBUS_ERROR_NO_REPLY)) 150664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 15079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 15089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington errmsg = "Message did not receive a reply (timeout by message bus)"; 150931988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (message, &iter); 15109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &errmsg)) 151164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 151264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 151364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_transaction_send_from_driver (transaction, pending->will_get_reply, 151464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington message)) 151564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington goto out; 151664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 151764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington retval = TRUE; 151864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 151964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington out: 152064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_message_unref (message); 152164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return retval; 152264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 152364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1524bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Penningtonstatic dbus_bool_t 152564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_pending_reply_expired (BusExpireList *list, 152664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link, 152764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington void *data) 152864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 152964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending = link->data; 153064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusConnections *connections = data; 153164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction; 153264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 153364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* No reply is forthcoming. So nuke it if we can. If not, 153464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * leave it in the list to try expiring again later when we 153564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * get more memory. 153664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 1537d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1538d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Expiring pending reply %p, replier %p receiver %p serial %u\n", 1539d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1540d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1541d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1542d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1543d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 154464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington transaction = bus_transaction_new (connections->context); 154564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (transaction == NULL) 1546bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return FALSE; 154764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1548d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington if (!bus_pending_reply_send_no_reply (connections, 1549d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington transaction, 1550d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending)) 155164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 155264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_transaction_cancel_and_free (transaction); 1553bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return FALSE; 155464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 1555a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 1556a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove_link (connections->pending_replies, link); 1557a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 1558d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 155964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington bus_transaction_execute_and_free (transaction); 1560bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington 1561bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return TRUE; 156264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 156364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 156464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 156564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_connection_drop_pending_replies (BusConnections *connections, 156664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *connection) 156764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 156864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* The DBusConnection is almost 100% finalized here, so you can't 156964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * do anything with it except check for pointer equality 157064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 157164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 1572d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1573d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Dropping pending replies that involve connection %p\n", 1574d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington connection); 157564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1576a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_first_link (connections->pending_replies); 157764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington while (link != NULL) 157864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 157964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *next; 158064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending; 158164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1582a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington next = bus_expire_list_get_next_link (connections->pending_replies, 1583a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 158464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending = link->data; 158564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 158664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending->will_get_reply == connection) 158764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 158864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* We don't need to track this pending reply anymore */ 158964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1590d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Dropping pending reply %p, replier %p receiver %p serial %u\n", 1591d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1592d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1593d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1594d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1595d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1596a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove_link (connections->pending_replies, 1597a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 1598d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 159964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 160064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington else if (pending->will_send_reply == connection) 160164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 160264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* The reply isn't going to be sent, so set things 160364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * up so it will be expired right away 160464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 1605d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Will expire pending reply %p, replier %p receiver %p serial %u\n", 1606d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1607d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1608d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1609d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1610d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 161164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_send_reply = NULL; 161264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->expire_item.added_tv_sec = 0; 161364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->expire_item.added_tv_usec = 0; 161464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1615a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_recheck_immediately (connections->pending_replies); 161664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 161764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 161864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington link = next; 161964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 162064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 162164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 162264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 162364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtontypedef struct 162464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 162564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending; 162664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusConnections *connections; 162764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} CancelPendingReplyData; 162864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 162964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 163064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncancel_pending_reply (void *data) 163164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 163264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CancelPendingReplyData *d = data; 163364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1634d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1635d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1636a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington if (!bus_expire_list_remove (d->connections->pending_replies, 1637a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington &d->pending->expire_item)) 163864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert_not_reached ("pending reply did not exist to be cancelled"); 163964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1640d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (d->pending); /* since it's been cancelled */ 164164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 164264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 164364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 164464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncancel_pending_reply_data_free (void *data) 164564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 164664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CancelPendingReplyData *d = data; 164764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1648d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1649d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 165064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* d->pending should be either freed or still 165164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * in the list of pending replies (owned by someone 165264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * else) 165364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 165464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 165564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (d); 165664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 165764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 165864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington/* 165964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * Record that a reply is allowed; return TRUE on success. 166064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 166164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtondbus_bool_t 166264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_connections_expect_reply (BusConnections *connections, 166364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction, 166464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *will_get_reply, 166564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *will_send_reply, 166664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessage *reply_to_this, 166764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusError *error) 166864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 166964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending; 167064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_uint32_t reply_serial; 167164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 167264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CancelPendingReplyData *cprd; 1673df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg int count; 167464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 167564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (will_get_reply != NULL); 167664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (will_send_reply != NULL); 167764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (reply_to_this != NULL); 167864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 167964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (dbus_message_get_no_reply (reply_to_this)) 168064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return TRUE; /* we won't allow a reply, since client doesn't care for one. */ 168164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 16823251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington reply_serial = dbus_message_get_serial (reply_to_this); 168364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1684a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_first_link (connections->pending_replies); 1685df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg count = 0; 168664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington while (link != NULL) 168764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 168864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending = link->data; 168964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 169064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending->reply_serial == reply_serial && 169164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_get_reply == will_get_reply && 169264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_send_reply == will_send_reply) 169364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 169464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 169564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington "Message has the same reply serial as a currently-outstanding existing method call"); 169664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 169764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 169864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1699a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_next_link (connections->pending_replies, 1700a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 170134bb5b690b6d8d79edcb7dbd9abda4c1ab2bdc5eJohn (J if (pending->will_get_reply == will_get_reply) 170234bb5b690b6d8d79edcb7dbd9abda4c1ab2bdc5eJohn (J ++count; 170364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 170464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1705df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg if (count >= 1706df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg bus_context_get_max_replies_per_connection (connections->context)) 1707df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg { 1708df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1709df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg "The maximum number of pending replies per connection has been reached"); 1710df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg return FALSE; 1711df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg } 1712df23f08f9b4607660aeee2c3640b80e1b6aad256Kristian Høgsberg 171364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending = dbus_new0 (BusPendingReply, 1); 171464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending == NULL) 171564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 171664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 171764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 171864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 171964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1720d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE 1721d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington /* so we can see a not-yet-added pending reply */ 1722d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->expire_item.added_tv_sec = 1; 1723d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->expire_item.added_tv_usec = 1; 1724d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington#endif 1725d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1726d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply = will_get_reply; 1727d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply = will_send_reply; 1728d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial = reply_serial; 1729d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 173064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd = dbus_new0 (CancelPendingReplyData, 1); 173164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (cprd == NULL) 173264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 173364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 1734d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 173564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 173664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 173764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1738a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington if (!bus_expire_list_add (connections->pending_replies, 1739a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington &pending->expire_item)) 174064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 174164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 174264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (cprd); 1743d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 174464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 174564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 174664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 174764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_transaction_add_cancel_hook (transaction, 174864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cancel_pending_reply, 174964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd, 175064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cancel_pending_reply_data_free)) 175164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 175264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 1753a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove (connections->pending_replies, &pending->expire_item); 175464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (cprd); 1755d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 175664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 175764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 175864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 175964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->pending = pending; 176064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->connections = connections; 176164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 176264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_get_current_time (&pending->expire_item.added_tv_sec, 176364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington &pending->expire_item.added_tv_usec); 176464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1765d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Added pending reply %p, replier %p receiver %p serial %u\n", 1766d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending, 1767d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_send_reply, 1768d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->will_get_reply, 1769d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington pending->reply_serial); 1770d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 177164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return TRUE; 177264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 177364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 177464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtontypedef struct 177564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 177664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 177764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusConnections *connections; 177864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} CheckPendingReplyData; 177964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 178064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 178164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncancel_check_pending_reply (void *data) 178264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 178364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CheckPendingReplyData *d = data; 178464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1785d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1786a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 1787a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_add_link (d->connections->pending_replies, 1788a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington d->link); 178964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington d->link = NULL; 179064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 179164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 179264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonstatic void 179364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtoncheck_pending_reply_data_free (void *data) 179464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 179564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CheckPendingReplyData *d = data; 179664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1797d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("%s: d = %p\n", _DBUS_FUNCTION_NAME, d); 1798d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 179964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (d->link != NULL) 180064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 180164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending = d->link->data; 1802d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1803a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_assert (!bus_expire_list_contains_item (d->connections->pending_replies, 1804a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington &pending->expire_item)); 1805d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1806d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington bus_pending_reply_free (pending); 180764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_list_free_link (d->link); 180864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 180964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 181064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (d); 181164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 181264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 181364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington/* 181464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * Check whether a reply is allowed, remove BusPendingReply 181564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington * if so, return TRUE if so. 181664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 181764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtondbus_bool_t 181864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_connections_check_reply (BusConnections *connections, 181964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusTransaction *transaction, 182064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *sending_reply, 182164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusConnection *receiving_reply, 182264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusMessage *reply, 182364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusError *error) 182464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{ 182564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington CheckPendingReplyData *cprd; 182664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link; 182764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_uint32_t reply_serial; 182864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 182964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (sending_reply != NULL); 183064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington _dbus_assert (receiving_reply != NULL); 183164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 183264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington reply_serial = dbus_message_get_reply_serial (reply); 183364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1834a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_first_link (connections->pending_replies); 183564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington while (link != NULL) 183664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 183764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BusPendingReply *pending = link->data; 183864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 183964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (pending->reply_serial == reply_serial && 184064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_get_reply == receiving_reply && 184164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington pending->will_send_reply == sending_reply) 184264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 1843d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose ("Found pending reply with serial %u\n", reply_serial); 184464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington break; 184564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 184664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1847a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link = bus_expire_list_get_next_link (connections->pending_replies, 1848a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 184964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 185064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 185164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (link == NULL) 185264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 18533251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington _dbus_verbose ("No pending reply expected\n"); 18543251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 185564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 185664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 185764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 185864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd = dbus_new0 (CheckPendingReplyData, 1); 185964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (cprd == NULL) 186064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 186164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 186264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 186364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 186464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 186564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_transaction_add_cancel_hook (transaction, 186664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cancel_check_pending_reply, 186764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd, 186864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington check_pending_reply_data_free)) 186964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 187064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington BUS_SET_OOM (error); 187164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington dbus_free (cprd); 187264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return FALSE; 187364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 187464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 187564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->link = link; 187664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington cprd->connections = connections; 187764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 1878a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_unlink (connections->pending_replies, 1879a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington link); 1880d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 1881a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_assert (!bus_expire_list_contains_item (connections->pending_replies, link->data)); 188264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 188364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington return TRUE; 188464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington} 1885983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 18863df260c07102745c5606c313af862558f105f83eHavoc Pennington/* 18876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Transactions 18886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * 18896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Note that this is fairly fragile; in particular, don't try to use 18906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * one transaction across any main loop iterations. 18916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 18926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 189329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct 189429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 189529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 189629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message; 189729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusPreallocatedSend *preallocated; 189829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend; 189929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 19006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtontypedef struct 19016be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 19026be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function; 19036be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function; 19046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data; 19056be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} CancelHook; 19066be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 190729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction 190829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 190929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *connections; 19106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 19116be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusList *cancel_hooks; 191229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 191329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 191429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 191529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection, 191629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send) 191729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 191829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->message) 191929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (to_send->message); 192029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 192129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated) 192229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_free_preallocated_send (connection, to_send->preallocated); 192329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 192429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 192529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 192629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 19276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 19286be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_cancel (void *element, 19296be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 19306be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 19316be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 19326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19336be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_verbose ("Running transaction cancel hook\n"); 19346be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19356be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->cancel_function) 19366be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->cancel_function) (ch->data); 19376be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 19386be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19396be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 19406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_free (void *element, 19416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data) 19426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 19436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch = element; 19446be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19456be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch->free_data_function) 19466be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington (* ch->free_data_function) (ch->data); 19476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19486be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 19496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 19506be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void 19526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonfree_cancel_hooks (BusTransaction *transaction) 19536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 19546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 19556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_free, NULL); 19566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 19576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_clear (&transaction->cancel_hooks); 19586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 19596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 196029560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction* 19616ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context) 196229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 196329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 196429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 196529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = dbus_new0 (BusTransaction, 1); 196629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 196729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return NULL; 196829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 19696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction->context = context; 19706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 197129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return transaction; 197229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 197329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 19746ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext* 19756ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction *transaction) 19766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 19776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return transaction->context; 19786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 19796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 19806ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections* 19816ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction *transaction) 19826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{ 19836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington return bus_context_get_connections (transaction->context); 19846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington} 19856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 198629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 1987777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send_from_driver (BusTransaction *transaction, 1988777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 1989777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 1990777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{ 1991777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* We have to set the sender to the driver, and have 1992777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * to check security policy since it was not done in 1993777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * dispatch.c 1994777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 199595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_verbose ("Sending %s %s %s from driver\n", 199695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) ? 199795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) : "(no interface)", 199895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) ? 199995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) : "(no member)", 200095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) ? 200195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) : "(no error name)"); 200295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 2003248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 2004777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return FALSE; 2005777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 2006eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington if (bus_connection_is_active (connection)) 2007eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington { 2008eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington if (!dbus_message_set_destination (message, 2009eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington bus_connection_get_name (connection))) 2010eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington return FALSE; 2011eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington } 2012eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington 20133251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington /* bus driver never wants a reply */ 20143251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington dbus_message_set_no_reply (message, TRUE); 20153251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 2016777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* If security policy doesn't allow the message, we silently 2017777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington * eat it; the driver doesn't care about getting a reply. 2018777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington */ 2019777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_context_check_security_policy (bus_transaction_get_context (transaction), 202064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington transaction, 2021a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington NULL, connection, connection, message, NULL)) 2022777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return TRUE; 2023777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 2024777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return bus_transaction_send (transaction, connection, message); 2025777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington} 2026777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 2027777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t 2028777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send (BusTransaction *transaction, 2029777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusConnection *connection, 2030777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington DBusMessage *message) 203129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 203229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 203329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 203429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 203529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 203695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_verbose (" trying to add %s interface=%s member=%s error=%s to transaction%s\n", 2037b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? "error" : 2038dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington dbus_message_get_reply_serial (message) != 0 ? "reply" : 203951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington "message", 204095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) ? 204195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_interface (message) : "(unset)", 204295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) ? 204395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_member (message) : "(unset)", 204495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) ? 204595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_message_get_error_name (message) : "(unset)", 2046ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_get_is_connected (connection) ? 2047ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington "" : " (disconnected)"); 2048056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 2049056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 2050f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington 205129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 205229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; /* silently ignore disconnected connections */ 205329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 205429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 205529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 205629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 205729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send = dbus_new (MessageToSend, 1); 205829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send == NULL) 205929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 206029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 206129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 206229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 206329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->preallocated = dbus_connection_preallocate_send (connection); 206429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (to_send->preallocated == NULL) 206529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 206629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (to_send); 206729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 206829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 206929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 207029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_ref (message); 207129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->message = message; 207229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington to_send->transaction = transaction; 207329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2074d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("about to prepend message\n"); 2075d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 207629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&d->transaction_messages, to_send)) 207729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 207829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 207929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 208029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 2081d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington 2082d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington _dbus_verbose ("prepended message\n"); 208329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 208429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* See if we already had this connection in the list 208529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * for this transaction. If we have a pending message, 208629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then we should already be in transaction->connections 208729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 208829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 208929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (link->data == to_send); 209029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_next_link (&d->transaction_messages, link); 209129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 209229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 209329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 209429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 209529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 209629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 209729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington break; 209829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 209929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 210029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 210129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 210229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (link == NULL) 210329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 210429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!_dbus_list_prepend (&transaction->connections, connection)) 210529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 210629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 210729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 210829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 210929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 211029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 211129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 211229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 211329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 211429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 211529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 211629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection, 211729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 211829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 211929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 212029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 212129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 212229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 212329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 212429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 212529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_first_link (&d->transaction_messages); 212629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 212729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 212829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 212929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link); 213029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 213129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 213229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 213329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 213429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 213529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 213629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 213729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 213829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 213929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = next; 214029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 214129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 214229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 214329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 214429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction) 214529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 214629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 2147ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 2148ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: cancelled\n"); 214929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 215029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 215129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_cancel_transaction (connection, transaction); 215229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 215329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 215429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 21556be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_list_foreach (&transaction->cancel_hooks, 21566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington cancel_hook_cancel, NULL); 21576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 21586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 21596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 216029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 216129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 216229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 216329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 216429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection, 216529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction) 216629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 216729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *link; 216829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 216929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 217029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 217129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 217229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 217329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Send the queue in order (FIFO) */ 217429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = _dbus_list_get_last_link (&d->transaction_messages); 217529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (link != NULL) 217629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 217729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *m = link->data; 217829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link); 217929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 218029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (m->transaction == transaction) 218129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 218229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove_link (&d->transaction_messages, 218329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link); 218429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2185056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington _dbus_assert (dbus_message_get_sender (m->message) != NULL); 2186056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington 218729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_send_preallocated (connection, 218829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated, 218929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->message, 219029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL); 219129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 219229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington m->preallocated = NULL; /* so we don't double-free it */ 219329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 219429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, m); 219529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 219629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 219729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington link = prev; 219829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 219929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 220029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 220129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 220229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction) 220329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 220429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* For each connection in transaction->connections 220529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * send the messages 220629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 220729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection; 2208ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 2209ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("TRANSACTION: executing\n"); 221029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 221129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((connection = _dbus_list_pop_first (&transaction->connections))) 221229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection_execute_transaction (connection, transaction); 221329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 221429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction->connections == NULL); 221529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 22166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington free_cancel_hooks (transaction); 22176be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 221829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (transaction); 221929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 222029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 222129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void 222229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection) 222329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 222429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington MessageToSend *to_send; 222529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusConnectionData *d; 222629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 222729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington d = BUS_CONNECTION_DATA (connection); 222829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (d != NULL); 222929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 223029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while ((to_send = _dbus_list_get_first (&d->transaction_messages))) 223129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 223229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* only has an effect for the first MessageToSend listing this transaction */ 223329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&to_send->transaction->connections, 223429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington connection); 223529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 223629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_list_remove (&d->transaction_messages, to_send); 223729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message_to_send_free (connection, to_send); 223829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 223929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 224029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 224129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 224229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply 224329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 224429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 224529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction *transaction, 224629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *connection, 224729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const DBusError *error, 224829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *in_reply_to) 224929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 225029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *reply; 225190ed1d84588a84697051e643175452c50d682eceHavoc Pennington 225229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (error != NULL); 225329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 225468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 2255e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Sending error reply %s \"%s\"\n", 2256e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington error->name, error->message); 2257e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 2258b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_error (in_reply_to, 2259b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington error->name, 2260b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington error->message); 226129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 226229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 226329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2264777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 226529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 226629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 226729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 226829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 226929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2270e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (reply); 2271e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 227229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 2273a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 22746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t 22766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_transaction_add_cancel_hook (BusTransaction *transaction, 22776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington BusTransactionCancelFunction cancel_function, 22786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington void *data, 22796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusFreeFunction free_data_function) 22806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 22816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington CancelHook *ch; 22826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch = dbus_new (CancelHook, 1); 22846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (ch == NULL) 22856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 2286d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington 2287d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington _dbus_verbose (" adding cancel hook function = %p data = %p\n", 2288d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington cancel_function, data); 22896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->cancel_function = cancel_function; 22916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->data = data; 22926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington ch->free_data_function = free_data_function; 22936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 22946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington /* It's important that the hooks get run in reverse order that they 22956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * were added 22966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 22976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!_dbus_list_prepend (&transaction->cancel_hooks, ch)) 22986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 22996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_free (ch); 23006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return FALSE; 23016be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 23026be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 23036be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return TRUE; 23046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 2305