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