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