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