connection.c revision 3df260c07102745c5606c313af862558f105f83e
196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */
296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington/* connection.c  Client connections
396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington *
496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Copyright (C) 2003  Red Hat, Inc.
596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington *
696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Licensed under the Academic Free License version 1.2
796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington *
896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * This program is free software; you can redistribute it and/or modify
996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * it under the terms of the GNU General Public License as published by
1096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
1196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * (at your option) any later version.
1296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington *
1396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * This program is distributed in the hope that it will be useful,
1496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
1596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * GNU General Public License for more details.
1796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington *
1896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * You should have received a copy of the GNU General Public License
1996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * along with this program; if not, write to the Free Software
2096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington *
2296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington */
2396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "connection.h"
2439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
25a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington#include "policy.h"
2696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "services.h"
2729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington#include "utils.h"
2896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include <dbus/dbus-list.h>
2996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
3029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection);
3129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
326ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections
336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  int refcount;
356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  DBusList *list; /**< List of all the connections */
366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context;
376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington};
386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
396ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic int connection_data_slot = -1;
40f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic int connection_data_slot_refcount = 0;
4196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
4296a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct
4396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
4529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *connection;
4696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  DBusList *services_owned;
47aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  char *name;
4829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */
4929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage *oom_message;
5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusPreallocatedSend *oom_preallocated;
51bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington  BusClientPolicy *policy;
5296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData;
5396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
5496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot))
5596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
56f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic dbus_bool_t
57f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_ref (void)
58f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{
59f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (connection_data_slot < 0)
60f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
61f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot = dbus_connection_allocate_data_slot ();
62f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
63f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      if (connection_data_slot < 0)
64f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington        return FALSE;
65f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
66f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      _dbus_assert (connection_data_slot_refcount == 0);
67f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
68f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
69f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  connection_data_slot_refcount += 1;
70f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
71f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  return TRUE;
72f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
73f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington}
74f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
75f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void
76f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_unref (void)
77f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{
78f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_assert (connection_data_slot_refcount > 0);
79f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
80f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  connection_data_slot_refcount -= 1;
81f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
82f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (connection_data_slot_refcount == 0)
83f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
84f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      dbus_connection_free_data_slot (connection_data_slot);
85f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot = -1;
86f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
87f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington}
88f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
89df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Penningtonstatic DBusLoop*
901b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonconnection_get_loop (DBusConnection *connection)
911b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
921b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusConnectionData *d;
931b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
941b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  return bus_context_get_loop (d->connections->context);
971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
981b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
99fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid
10029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection)
10196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
10296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
10396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusService *service;
10496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
10596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  d = BUS_CONNECTION_DATA (connection);
106d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_assert (d != NULL);
10796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
108d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n",
109d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington                 d->name ? d->name : "(inactive)");
110d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Drop any service ownership. FIXME Unfortunately, this requires
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * memory allocation and there doesn't seem to be a good way to
11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * handle it other than sleeping; we can't "fail" the operation of
11429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * disconnecting a client, and preallocating a broadcast "service is
11529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * now gone" message for every client-service pair seems kind of
11629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * involved. Probably we need to do that though, and also
11729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * extend BusTransaction to be able to revert generic
11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * stuff, not just sending a message (so we can e.g. revert
11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * removal of service owners).
12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
121ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  while ((service = _dbus_list_get_last (&d->services_owned)))
122ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
123ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      BusTransaction *transaction;
124ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      DBusError error;
125ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
126ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    retry:
127ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
128ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      dbus_error_init (&error);
129ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
130ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      transaction = NULL;
131ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      while (transaction == NULL)
132ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
133ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          transaction = bus_transaction_new (d->connections->context);
134df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington          _dbus_wait_for_memory ();
135ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
136ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
137ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!bus_service_remove_owner (service, connection,
138ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                     transaction, &error))
139ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
1406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington          _DBUS_ASSERT_ERROR_IS_SET (&error);
1416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
142ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
143ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
144ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              dbus_error_free (&error);
145ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              bus_transaction_cancel_and_free (transaction);
146df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington              _dbus_wait_for_memory ();
147ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              goto retry;
148ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
149ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          else
1506be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington            {
1516be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington              _dbus_verbose ("Failed to remove service owner: %s %s\n",
1526be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                             error.name, error.message);
1536be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington              _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason");
1546be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington            }
155ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
156ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
157ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      bus_transaction_execute_and_free (transaction);
158ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
15996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
16039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  bus_dispatch_remove_connection (connection);
161aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
16296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  /* no more watching */
1633bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_watch_functions (connection,
164f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                            NULL, NULL, NULL,
1653bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            connection,
1663bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            NULL))
1673bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting watch functions to NULL failed");
1683bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1693bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_timeout_functions (connection,
170f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                              NULL, NULL, NULL,
1713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              connection,
1723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              NULL))
1733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting timeout functions to NULL failed");
1743bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
17544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington  dbus_connection_set_unix_user_function (connection,
17644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                          NULL, NULL, NULL);
1777caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington
1787caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington  dbus_connection_set_dispatch_status_function (connection,
1797caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                                                NULL, NULL, NULL);
18044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_connection_remove_transactions (connection);
1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_list_remove (&d->connections->list, connection);
1846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  /* frees "d" as side effect */
18696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  dbus_connection_set_data (connection,
18796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                            connection_data_slot,
18896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                            NULL, NULL);
1896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
19096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  dbus_connection_unref (connection);
19196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
19296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
193b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t
19496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch     *watch,
19596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                           unsigned int   condition,
19696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                           void          *data)
19796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
1983df260c07102745c5606c313af862558f105f83eHavoc Pennington /* FIXME this can be done in dbus-mainloop.c
1993df260c07102745c5606c313af862558f105f83eHavoc Pennington   * if the code in activation.c for the babysitter
2003df260c07102745c5606c313af862558f105f83eHavoc Pennington   * watch handler is fixed.
2013df260c07102745c5606c313af862558f105f83eHavoc Pennington   */
2023df260c07102745c5606c313af862558f105f83eHavoc Pennington
20351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#if 0
20451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("Calling handle_watch\n");
20551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington#endif
2063df260c07102745c5606c313af862558f105f83eHavoc Pennington  return dbus_watch_handle (watch, condition);
20796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
20896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
2093bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
21096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch      *watch,
2111b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                      void           *data)
21296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
2131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusConnection *connection = data;
2141b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
215df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  return _dbus_loop_add_watch (connection_get_loop (connection),
216df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                               watch, connection_watch_callback, connection,
217df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                               NULL);
21896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
21996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
22096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void
22196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch      *watch,
2221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                         void           *data)
22396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
2241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusConnection *connection = data;
2251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
226df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  _dbus_loop_remove_watch (connection_get_loop (connection),
227df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                           watch, connection_watch_callback, connection);
22896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
22996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
23096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void
2313bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout   *timeout,
2323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                             void          *data)
2333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
2343df260c07102745c5606c313af862558f105f83eHavoc Pennington  /* DBusConnection *connection = data; */
2354c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
236b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  /* can return FALSE on OOM but we just let it fire again later */
2373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  dbus_timeout_handle (timeout);
2383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
2413bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout    *timeout,
2421b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                        void           *data)
2433bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
2441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusConnection *connection = data;
2451b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
246df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  return _dbus_loop_add_timeout (connection_get_loop (connection),
247df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                                 timeout, connection_timeout_callback, connection, NULL);
2483bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
2493bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
2503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
2513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout    *timeout,
2521b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                           void           *data)
2533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
2541b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusConnection *connection = data;
2551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
256df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  _dbus_loop_remove_timeout (connection_get_loop (connection),
257df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                             timeout, connection_timeout_callback, connection);
2583bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
2593bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
2607caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtonstatic void
2617caf646fdf595946eb28202e2df3f847d28c7151Havoc Penningtondispatch_status_function (DBusConnection    *connection,
2627caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                          DBusDispatchStatus new_status,
2637caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                          void              *data)
2647caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington{
2657caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington  DBusLoop *loop = data;
2667caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington
2677caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington  if (new_status != DBUS_DISPATCH_COMPLETE)
2687caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington    {
2697caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington      while (!_dbus_loop_queue_dispatch (loop, connection))
2707caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington        _dbus_wait_for_memory ();
2717caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington    }
2727caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington}
2737caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington
274a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t
275a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonallow_user_function (DBusConnection *connection,
276a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                     unsigned long   uid,
277a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                     void           *data)
278a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
279a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusConnectionData *d;
280a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
281a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
282a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
283a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  _dbus_assert (d != NULL);
284a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
285a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return bus_context_allow_user (d->connections->context, uid);
286a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
287a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
2883bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
28996a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data)
29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
29196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d = data;
29296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
29396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  /* services_owned should be NULL since we should be disconnected */
29496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_assert (d->services_owned == NULL);
29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* similarly */
29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d->transaction_messages == NULL);
297aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (d->oom_preallocated)
29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated);
300f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (d->oom_message)
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (d->oom_message);
303a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
304a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (d->policy)
305bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington    bus_client_policy_unref (d->policy);
306a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
307aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  dbus_free (d->name);
30896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
30996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  dbus_free (d);
31096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
31196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
3126ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
3136ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context)
31496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
3156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
31696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
317f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (!connection_data_slot_ref ())
318f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    return NULL;
31996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
3206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections = dbus_new0 (BusConnections, 1);
3216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (connections == NULL)
322f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
323f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot_unref ();
324f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      return NULL;
325f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
3266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->refcount = 1;
3286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->context = context;
3296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return connections;
3316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
3326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3336ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
3346ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections)
3356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
3366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (connections->refcount > 0);
3376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->refcount += 1;
3386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
3396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3406ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
3416ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections)
3426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
3436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (connections->refcount > 0);
3446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->refcount -= 1;
3456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (connections->refcount == 0)
3466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
347ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      while (connections->list != NULL)
348ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
349ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          DBusConnection *connection;
350ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
351ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          connection = connections->list->data;
352ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
353ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          dbus_connection_ref (connection);
354ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          dbus_connection_disconnect (connection);
355ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_connection_disconnected (connection);
356ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          dbus_connection_unref (connection);
357ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
3586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      _dbus_list_clear (&connections->list);
3606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
361f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      dbus_free (connections);
362f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
363f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot_unref ();
3646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
36596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
36696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
36796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t
3686ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections,
3696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                  DBusConnection *connection)
37096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
37196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
372ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_bool_t retval;
373ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
3741b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson  d = dbus_new0 (BusConnectionData, 1);
3751b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson
37696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  if (d == NULL)
37796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    return FALSE;
37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
3796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d->connections = connections;
38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->connection = connection;
381f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
382f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_assert (connection_data_slot >= 0);
38396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
38496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  if (!dbus_connection_set_data (connection,
38596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                 connection_data_slot,
38696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                 d, free_connection_data))
38796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    {
38896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington      dbus_free (d);
38996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington      return FALSE;
39096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    }
391ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
392ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  retval = FALSE;
39396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
3943bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_watch_functions (connection,
3951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                            add_connection_watch,
3961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                            remove_connection_watch,
397f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                            NULL,
3983bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            connection,
3993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            NULL))
400ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
4013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
4023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_timeout_functions (connection,
4031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                              add_connection_timeout,
4041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                              remove_connection_timeout,
405f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                              NULL,
4063bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              connection, NULL))
407ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
4083bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
40944fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
41044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington  dbus_connection_set_unix_user_function (connection,
41144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                          allow_user_function,
41244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                          NULL, NULL);
4137caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington
4147caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington  dbus_connection_set_dispatch_status_function (connection,
4157caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                                                dispatch_status_function,
4167caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                                                bus_context_get_loop (connections->context),
4177caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                                                NULL);
41896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
41939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  /* Setup the connection with the dispatcher */
42039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  if (!bus_dispatch_add_connection (connection))
421ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
422ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
423ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!_dbus_list_append (&connections->list, connection))
4243bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    {
425ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      bus_dispatch_remove_connection (connection);
426ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      goto out;
4273bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    }
4287caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington
4297caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington  if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE)
4307caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington    {
4317caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington      if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection))
4327caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington        {
4337caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington          bus_dispatch_remove_connection (connection);
4347caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington          goto out;
4357caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington        }
4367caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington    }
437ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
4383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  dbus_connection_ref (connection);
439ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  retval = TRUE;
440ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
441ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out:
442ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!retval)
4431b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
444ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!dbus_connection_set_watch_functions (connection,
445ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                NULL, NULL, NULL,
446ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                connection,
447ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                NULL))
448ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        _dbus_assert_not_reached ("setting watch functions to NULL failed");
449ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
450ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!dbus_connection_set_timeout_functions (connection,
451ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                  NULL, NULL, NULL,
452ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                  connection,
453ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                  NULL))
454ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        _dbus_assert_not_reached ("setting timeout functions to NULL failed");
45544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
45644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington      dbus_connection_set_unix_user_function (connection,
45744fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                              NULL, NULL, NULL);
4581b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
4597caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington      dbus_connection_set_dispatch_status_function (connection,
4607caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington                                                    NULL, NULL, NULL);
4617caf646fdf595946eb28202e2df3f847d28c7151Havoc Pennington
4621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      if (!dbus_connection_set_data (connection,
4631b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                     connection_data_slot,
4641b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                     NULL, NULL))
4651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        _dbus_assert_not_reached ("failed to set connection data to null");
466ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
467aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
468ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  return retval;
46996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
47096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
471a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t
4727c022a80c9b8c5b085514ea49f983c0489e945abHavoc Penningtonbus_connection_get_groups  (DBusConnection   *connection,
4737c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                            unsigned long   **groups,
4747c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                            int              *n_groups)
475a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
476a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusConnectionData *d;
4777c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  unsigned long uid;
4787c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  DBusUserDatabase *user_database;
4797c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington
480a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
481a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
482a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  _dbus_assert (d != NULL);
483a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
4847c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  user_database = bus_context_get_user_database (d->connections->context);
4857c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington
486a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  *groups = NULL;
487a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  *n_groups = 0;
488a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
4897c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  if (dbus_connection_get_unix_user (connection, &uid))
490a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
4917c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington      if (!_dbus_user_database_get_groups (user_database,
4927c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                                           uid, groups, n_groups,
4937c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                                           NULL))
494a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington        {
4957c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington          _dbus_verbose ("Did not get any groups for UID %lu\n",
4967c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                         uid);
4977c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington          return FALSE;
4987c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington        }
4997c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington      else
5007c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington        {
5017c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington          _dbus_verbose ("Got %d groups for UID %lu\n",
5027c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                         *n_groups, uid);
5037c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington          return TRUE;
504a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington        }
505a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
5067c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  else
5077c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington    return TRUE; /* successfully got 0 groups */
508a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
509a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
510a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t
511a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_is_in_group (DBusConnection *connection,
512a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                            unsigned long   gid)
513a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
514a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  int i;
5157c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  unsigned long *group_ids;
516a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  int n_group_ids;
517a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
518a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (!bus_connection_get_groups (connection, &group_ids, &n_group_ids))
519a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    return FALSE;
520a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
521a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  i = 0;
522a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  while (i < n_group_ids)
523a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
524a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      if (group_ids[i] == gid)
5257c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington        {
5267c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington          dbus_free (group_ids);
5277c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington          return TRUE;
5287c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington        }
529a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      ++i;
530a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
531a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
5327c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  dbus_free (group_ids);
533a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return FALSE;
534a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
535a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
536bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy*
537a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_policy (DBusConnection *connection)
538a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
539a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusConnectionData *d;
540a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
541a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
542a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
543a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  _dbus_assert (d != NULL);
544a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
545a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (!dbus_connection_get_is_authenticated (connection))
546a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
547a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      _dbus_verbose ("Tried to get policy for unauthenticated connection!\n");
548a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      return NULL;
549a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
550a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
551a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  /* We do lazy creation of the policy because
552a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   * it can only be done post-authentication.
553a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   */
554a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (d->policy == NULL)
555a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
556a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      d->policy =
557bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington        bus_context_create_client_policy (d->connections->context,
558bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington                                          connection);
559a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
560a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      /* we may have a NULL policy on OOM or error getting list of
561a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       * groups for a user. In the latter case we don't handle it so
562a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       * well currently, just keep pretending we're out of memory,
563a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       * which is kind of bizarre.
564a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       */
565a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
566a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
567a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return d->policy;
568a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
5696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/**
5716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns
5726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating.
5736ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
5746ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object
5756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function
5766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg
5776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */
5786ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
5796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections               *connections,
5806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                         BusConnectionForeachFunction  function,
5816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington			void                          *data)
5826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  DBusList *link;
5846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  link = _dbus_list_get_first_link (&connections->list);
5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  while (link != NULL)
5876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
5886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      DBusConnection *connection = link->data;
5896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      DBusList *next = _dbus_list_get_next_link (&connections->list, link);
5906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (!(* function) (connection, data))
5926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington        break;
5936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      link = next;
5956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
5966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
5976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5986ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext*
5996ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections)
6006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return connections->context;
6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6046ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext*
6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection)
6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
6076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
6086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
6106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
6126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return d->connections->context;
6146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
6156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6166ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
6176ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection)
6186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
6196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
6206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
6226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
6246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return d->connections;
6266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
6276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6286ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry*
6296ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection)
6306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
6316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
6326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
6346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
6366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return bus_context_get_registry (d->connections->context);
6386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
6396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6406ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation*
6416ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection)
6426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
6436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
6446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
6466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
6486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return bus_context_get_activation (d->connections->context);
6506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
6516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
65229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
65329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus.
65429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington *
65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection
65629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant
65729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
65829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection)
66029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return d != NULL && d->name != NULL;
66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection)
67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage *message;
67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusPreallocatedSend *preallocated;
67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (d->oom_preallocated != NULL)
68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return TRUE;
68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  preallocated = dbus_connection_preallocate_send (connection);
68329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (preallocated == NULL)
68429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
686056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  /* d->name may be NULL, but that should be OK */
687056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  message = dbus_message_new (d->name,
68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_ERROR_NO_MEMORY);
68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_connection_free_preallocated_send (connection, preallocated);
69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
69329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
69429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
695f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington  dbus_message_set_is_error (message, TRUE);
696056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
697056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  if (!dbus_message_set_sender (message,
698056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington                                DBUS_SERVICE_DBUS))
699056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington    {
700056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington      dbus_connection_free_preallocated_send (connection, preallocated);
701056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington      dbus_message_unref (message);
702056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington      return FALSE;
703056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington    }
704f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington
70529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* set reply serial to placeholder value just so space is already allocated
70629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * for it.
70729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
70829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_reply_serial (message, 14))
70929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
71029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_connection_free_preallocated_send (connection, preallocated);
71129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
71229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
71329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
71429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
71529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_message = message;
71629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_preallocated = preallocated;
71729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
71829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
71929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
72029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
72129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
72229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection,
72329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                               DBusMessage    *in_reply_to)
72429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
72529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
72629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
72729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
72829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
72929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
73029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d->oom_message != NULL);
73129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
73229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* should always succeed since we set it to a placeholder earlier */
73329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_reply_serial (d->oom_message,
73429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                      dbus_message_get_serial (in_reply_to)))
73529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message");
73629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
737056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL);
738056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
73929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_connection_send_preallocated (connection, d->oom_preallocated,
74029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                     d->oom_message, NULL);
74129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
74229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (d->oom_message);
74329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_message = NULL;
74429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_preallocated = NULL;
74529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
74629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
7476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonvoid
7486be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service_link (DBusConnection *connection,
7496be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                       DBusList       *link)
75096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
75196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
75296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
75396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  d = BUS_CONNECTION_DATA (connection);
75496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_assert (d != NULL);
75596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
7566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  _dbus_list_append_link (&d->services_owned, link);
7576be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington}
7586be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
7596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t
7606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_connection_add_owned_service (DBusConnection *connection,
7616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                  BusService     *service)
7626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
7636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  DBusList *link;
7646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
7656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  link = _dbus_list_alloc_link (service);
7666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
7676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (link == NULL)
76896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    return FALSE;
76996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
7706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  bus_connection_add_owned_service_link (connection, link);
7716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
77296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  return TRUE;
77396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
77496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
77596a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid
77696a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection,
77796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                     BusService     *service)
77896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
77996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
78096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
78196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  d = BUS_CONNECTION_DATA (connection);
78296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_assert (d != NULL);
78396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
78496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_list_remove_last (&d->services_owned, service);
78596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
786aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
787aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t
788aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_set_name (DBusConnection   *connection,
789aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson			 const DBusString *name)
790aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
791aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusConnectionData *d;
792aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
793aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  d = BUS_CONNECTION_DATA (connection);
794aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (d != NULL);
795aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (d->name == NULL);
796aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
797fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_copy_data (name, &d->name))
798aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    return FALSE;
799aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
800fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  _dbus_assert (d->name != NULL);
801fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington
802d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("Name %s assigned to %p\n", d->name, connection);
803d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
804aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
805aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
806aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
807aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char *
808aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection)
809aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
810aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusConnectionData *d;
811aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
812aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  d = BUS_CONNECTION_DATA (connection);
813aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (d != NULL);
814aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
815aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return d->name;
816aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
817a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
8183df260c07102745c5606c313af862558f105f83eHavoc Pennington/*
8196be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Transactions
8206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington *
8216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * Note that this is fairly fragile; in particular, don't try to use
8226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * one transaction across any main loop iterations.
8236be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */
8246be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
82529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct
82629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
82729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusTransaction *transaction;
82829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage    *message;
82929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusPreallocatedSend *preallocated;
83029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend;
83129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtontypedef struct
8336be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
8346be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  BusTransactionCancelFunction cancel_function;
8356be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  DBusFreeFunction free_data_function;
8366be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  void *data;
8376be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} CancelHook;
8386be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
83929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction
84029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
84129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *connections;
8426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context;
8436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  DBusList *cancel_hooks;
84429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
84529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
84629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
84729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection,
84829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                      MessageToSend  *to_send)
84929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
85029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send->message)
85129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (to_send->message);
85229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
85329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send->preallocated)
85429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_connection_free_preallocated_send (connection, to_send->preallocated);
85529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
85629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (to_send);
85729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
85829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void
8606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_cancel (void *element,
8616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                    void *data)
8626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
8636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  CancelHook *ch = element;
8646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  _dbus_verbose ("Running transaction cancel hook\n");
8666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (ch->cancel_function)
8686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    (* ch->cancel_function) (ch->data);
8696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington}
8706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8716be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void
8726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncancel_hook_free (void *element,
8736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                  void *data)
8746be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
8756be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  CancelHook *ch = element;
8766be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (ch->free_data_function)
8786be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    (* ch->free_data_function) (ch->data);
8796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  dbus_free (ch);
8816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington}
8826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic void
8846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonfree_cancel_hooks (BusTransaction *transaction)
8856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
8866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  _dbus_list_foreach (&transaction->cancel_hooks,
8876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                      cancel_hook_free, NULL);
8886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
8896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  _dbus_list_clear (&transaction->cancel_hooks);
8906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington}
8916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
89229560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction*
8936ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context)
89429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
89529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusTransaction *transaction;
89629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
89729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  transaction = dbus_new0 (BusTransaction, 1);
89829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (transaction == NULL)
89929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return NULL;
90029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
9016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  transaction->context = context;
9026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
90329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return transaction;
90429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
90529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
9066ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext*
9076ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction  *transaction)
9086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
9096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return transaction->context;
9106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
9116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
9126ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
9136ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction  *transaction)
9146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
9156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return bus_context_get_connections (transaction->context);
9166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
9176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
91829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
919777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send_from_driver (BusTransaction *transaction,
920777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                  DBusConnection *connection,
921777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                  DBusMessage    *message)
922777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{
923777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  /* We have to set the sender to the driver, and have
924777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington   * to check security policy since it was not done in
925777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington   * dispatch.c
926777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington   */
927777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  _dbus_verbose ("Sending %s from driver\n",
928777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                 dbus_message_get_name (message));
929777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
930777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
931777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    return FALSE;
932777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
933777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  /* If security policy doesn't allow the message, we silently
934777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington   * eat it; the driver doesn't care about getting a reply.
935777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington   */
936777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_context_check_security_policy (bus_transaction_get_context (transaction),
937777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                          NULL, connection, message, NULL))
938777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    return TRUE;
939777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
940777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  return bus_transaction_send (transaction, connection, message);
941777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington}
942777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
943777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t
944777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_transaction_send (BusTransaction *transaction,
945777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      DBusConnection *connection,
946777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      DBusMessage    *message)
94729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
94829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  MessageToSend *to_send;
94929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
95029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *link;
95129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
95251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("  trying to add %s %s to transaction%s\n",
95351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                 dbus_message_get_is_error (message) ? "error" :
954dac0a1f8933889fd94fed7fecdcc4ec6fb3a3fb0Havoc Pennington                 dbus_message_get_reply_serial (message) != 0 ? "reply" :
95551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                 "message",
956ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                 dbus_message_get_name (message),
957ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                 dbus_connection_get_is_connected (connection) ?
958ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                 "" : " (disconnected)");
959056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
960056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  _dbus_assert (dbus_message_get_sender (message) != NULL);
961f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington
96229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
96329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return TRUE; /* silently ignore disconnected connections */
96429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
96529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
96629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
96729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
96829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send = dbus_new (MessageToSend, 1);
96929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send == NULL)
97029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
97129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
97229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
97329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
97429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send->preallocated = dbus_connection_preallocate_send (connection);
97529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send->preallocated == NULL)
97629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
97729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free (to_send);
97829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
97929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
98029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
98129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_ref (message);
98229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send->message = message;
98329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send->transaction = transaction;
98429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
985d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("about to prepend message\n");
986d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
98729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!_dbus_list_prepend (&d->transaction_messages, to_send))
98829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
98929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      message_to_send_free (connection, to_send);
99029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
99129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
992d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
993d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("prepended message\n");
99429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
99529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* See if we already had this connection in the list
99629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * for this transaction. If we have a pending message,
99729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * then we should already be in transaction->connections
99829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
99929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_first_link (&d->transaction_messages);
100029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (link->data == to_send);
100129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_next_link (&d->transaction_messages, link);
100229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (link != NULL)
100329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
100429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      MessageToSend *m = link->data;
100529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
100629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
100729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (m->transaction == transaction)
100829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        break;
100929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
101029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      link = next;
101129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
101229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
101329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (link == NULL)
101429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
101529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!_dbus_list_prepend (&transaction->connections, connection))
101629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
101729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_list_remove (&d->transaction_messages, to_send);
101829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          message_to_send_free (connection, to_send);
101929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          return FALSE;
102029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
102129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
102229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
102329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
102429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
102529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
102629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
102729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection,
102829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                               BusTransaction *transaction)
102929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
103029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *link;
103129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
103229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
103329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
103429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
103529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
103629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_first_link (&d->transaction_messages);
103729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (link != NULL)
103829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
103929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      MessageToSend *m = link->data;
104029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
104129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
104229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (m->transaction == transaction)
104329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
104429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_list_remove_link (&d->transaction_messages,
104529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  link);
104629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
104729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          message_to_send_free (connection, m);
104829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
104929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
105029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      link = next;
105129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
105229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
105329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction)
105629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
105729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *connection;
1058ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
1059ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_verbose ("TRANSACTION: cancelled\n");
106029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
106129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while ((connection = _dbus_list_pop_first (&transaction->connections)))
106229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    connection_cancel_transaction (connection, transaction);
106329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
106429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (transaction->connections == NULL);
106529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
10666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  _dbus_list_foreach (&transaction->cancel_hooks,
10676be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                      cancel_hook_cancel, NULL);
10686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
10696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  free_cancel_hooks (transaction);
10706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
107129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (transaction);
107229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
107329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
107429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
107529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection,
107629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                BusTransaction *transaction)
107729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
107829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *link;
107929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
108029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
108129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
108229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
108329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
108429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Send the queue in order (FIFO) */
108529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_last_link (&d->transaction_messages);
108629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (link != NULL)
108729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
108829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      MessageToSend *m = link->data;
108929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link);
109029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
109129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (m->transaction == transaction)
109229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
109329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_list_remove_link (&d->transaction_messages,
109429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  link);
109529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1096056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington          _dbus_assert (dbus_message_get_sender (m->message) != NULL);
1097056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
109829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          dbus_connection_send_preallocated (connection,
109929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                             m->preallocated,
110029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                             m->message,
110129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                             NULL);
110229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
110329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          m->preallocated = NULL; /* so we don't double-free it */
110429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
110529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          message_to_send_free (connection, m);
110629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
110729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
110829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      link = prev;
110929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
111029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
111129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
111229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
111329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction)
111429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
111529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* For each connection in transaction->connections
111629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * send the messages
111729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
111829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *connection;
1119ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
1120ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_verbose ("TRANSACTION: executing\n");
112129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
112229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while ((connection = _dbus_list_pop_first (&transaction->connections)))
112329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    connection_execute_transaction (connection, transaction);
112429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
112529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (transaction->connections == NULL);
112629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
11276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  free_cancel_hooks (transaction);
11286be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
112929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (transaction);
113029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
113129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
113229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
113329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection)
113429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
113529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  MessageToSend *to_send;
113629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
113729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
113829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
113929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
114029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
114129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while ((to_send = _dbus_list_get_first (&d->transaction_messages)))
114229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
114329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      /* only has an effect for the first MessageToSend listing this transaction */
114429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_list_remove (&to_send->transaction->connections,
114529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         connection);
114629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
114729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_list_remove (&d->transaction_messages, to_send);
114829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      message_to_send_free (connection, to_send);
114929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
115029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
115129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
115229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
115329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply
115429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
115529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
115629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction  *transaction,
115729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusConnection  *connection,
115829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const DBusError *error,
115929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage     *in_reply_to)
116029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
116129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage *reply;
116290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
116329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (error != NULL);
116429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
116529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
116629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_error_reply (in_reply_to,
116729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                        error->name,
116829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                        error->message);
116929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
117029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
117129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1172777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
117329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
117429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
117529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
117629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
117729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1178e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  dbus_message_unref (reply);
1179e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
118029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
1181a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
11826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
11836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtondbus_bool_t
11846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonbus_transaction_add_cancel_hook (BusTransaction               *transaction,
11856be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                 BusTransactionCancelFunction  cancel_function,
11866be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                 void                         *data,
11876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                 DBusFreeFunction              free_data_function)
11886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
11896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  CancelHook *ch;
11906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
11916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  ch = dbus_new (CancelHook, 1);
11926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (ch == NULL)
11936be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    return FALSE;
11946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
11956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  ch->cancel_function = cancel_function;
11966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  ch->data = data;
11976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  ch->free_data_function = free_data_function;
11986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
11996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  /* It's important that the hooks get run in reverse order that they
12006be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington   * were added
12016be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington   */
12026be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!_dbus_list_prepend (&transaction->cancel_hooks, ch))
12036be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    {
12046be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington      dbus_free (ch);
12056be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington      return FALSE;
12066be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    }
12076be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
12086be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  return TRUE;
12096be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington}
1210