connection.c revision e55fd2c6706e41f6933e1656ac3da7527ee2514f
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"
2596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "loop.h"
26a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington#include "policy.h"
2796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include "services.h"
2829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington#include "utils.h"
2996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#include <dbus/dbus-list.h>
3096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
3129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void bus_connection_remove_transactions (DBusConnection *connection);
3229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
336ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusConnections
346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  int refcount;
366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  DBusList *list; /**< List of all the connections */
376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context;
386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington};
396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
406ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic int connection_data_slot = -1;
41f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic int connection_data_slot_refcount = 0;
4296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
4396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtontypedef struct
4496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
4629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *connection;
4796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  DBusList *services_owned;
48aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  char *name;
4929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */
5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage *oom_message;
5129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusPreallocatedSend *oom_preallocated;
52a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  unsigned long *group_ids;
53a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  int n_group_ids;
54a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusPolicy *policy;
5596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington} BusConnectionData;
5696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
5796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington#define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot))
5896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
59f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic dbus_bool_t
60f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_ref (void)
61f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{
62f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (connection_data_slot < 0)
63f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
64f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot = dbus_connection_allocate_data_slot ();
65f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
66f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      if (connection_data_slot < 0)
67f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington        return FALSE;
68f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
69f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      _dbus_assert (connection_data_slot_refcount == 0);
70f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
71f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
72f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  connection_data_slot_refcount += 1;
73f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
74f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  return TRUE;
75f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
76f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington}
77f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
78f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void
79f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonconnection_data_slot_unref (void)
80f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{
81f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_assert (connection_data_slot_refcount > 0);
82f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
83f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  connection_data_slot_refcount -= 1;
84f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
85f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (connection_data_slot_refcount == 0)
86f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
87f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      dbus_connection_free_data_slot (connection_data_slot);
88f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot = -1;
89f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
90f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington}
91f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
92fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larssonvoid
9329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_disconnected (DBusConnection *connection)
9496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
9596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
9696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusService *service;
9796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
9896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  d = BUS_CONNECTION_DATA (connection);
99d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_assert (d != NULL);
10096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
101d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n",
102d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington                 d->name ? d->name : "(inactive)");
103d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
10429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Drop any service ownership. FIXME Unfortunately, this requires
10529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * memory allocation and there doesn't seem to be a good way to
10629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * handle it other than sleeping; we can't "fail" the operation of
10729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * disconnecting a client, and preallocating a broadcast "service is
10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * now gone" message for every client-service pair seems kind of
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * involved. Probably we need to do that though, and also
11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * extend BusTransaction to be able to revert generic
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * stuff, not just sending a message (so we can e.g. revert
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * removal of service owners).
11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
114ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  while ((service = _dbus_list_get_last (&d->services_owned)))
115ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
116ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      BusTransaction *transaction;
117ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      DBusError error;
118ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
119ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    retry:
120ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
121ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      dbus_error_init (&error);
122ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
123ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      transaction = NULL;
124ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      while (transaction == NULL)
125ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
126ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          transaction = bus_transaction_new (d->connections->context);
127ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_wait_for_memory ();
128ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
129ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
130ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!bus_service_remove_owner (service, connection,
131ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                     transaction, &error))
132ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
133ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
134ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
135ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              dbus_error_free (&error);
136ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              bus_transaction_cancel_and_free (transaction);
137ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              bus_wait_for_memory ();
138ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              goto retry;
139ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
140ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          else
141ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason");
142ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
143ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
144ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      bus_transaction_execute_and_free (transaction);
145ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
14696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
14739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  bus_dispatch_remove_connection (connection);
148aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
14996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  /* no more watching */
1503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_watch_functions (connection,
151f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                            NULL, NULL, NULL,
1523bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            connection,
1533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            NULL))
1543bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting watch functions to NULL failed");
1553bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1563bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_timeout_functions (connection,
157f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                              NULL, NULL, NULL,
1583bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              connection,
1593bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              NULL))
1603bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting timeout functions to NULL failed");
1613bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
16244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington  dbus_connection_set_unix_user_function (connection,
16344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                          NULL, NULL, NULL);
16444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_connection_remove_transactions (connection);
1666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_list_remove (&d->connections->list, connection);
1686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  /* frees "d" as side effect */
17096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  dbus_connection_set_data (connection,
17196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                            connection_data_slot,
17296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                            NULL, NULL);
1736ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
17496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  dbus_connection_unref (connection);
17596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
17696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
177b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t
17896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonconnection_watch_callback (DBusWatch     *watch,
17996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                           unsigned int   condition,
18096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                           void          *data)
18196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
18296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  DBusConnection *connection = data;
183b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  dbus_bool_t retval;
18496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
18539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  dbus_connection_ref (connection);
18639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
187b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  retval = dbus_connection_handle_watch (connection, watch, condition);
188aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
189ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  bus_connection_dispatch_all_messages (connection);
190ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
19139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  dbus_connection_unref (connection);
192b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
193b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  return retval;
19496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
19596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
1963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
19796a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonadd_connection_watch (DBusWatch      *watch,
19896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                      DBusConnection *connection)
19996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
2003bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  return bus_loop_add_watch (watch, connection_watch_callback, connection,
2013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                             NULL);
20296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
20396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
20496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void
20596a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonremove_connection_watch (DBusWatch      *watch,
20696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                         DBusConnection *connection)
20796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
20896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  bus_loop_remove_watch (watch, connection_watch_callback, connection);
20996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
21096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
21196a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonstatic void
2123bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonconnection_timeout_callback (DBusTimeout   *timeout,
2133bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                             void          *data)
2143bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
2154c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  DBusConnection *connection = data;
2164c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
2174c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  dbus_connection_ref (connection);
218b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington
219b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  /* can return FALSE on OOM but we just let it fire again later */
2203bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  dbus_timeout_handle (timeout);
2214c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
222ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  bus_connection_dispatch_all_messages (connection);
223ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington
2244c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  dbus_connection_unref (connection);
2253bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
2263bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
2273bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
2283bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_connection_timeout (DBusTimeout    *timeout,
2293bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                        DBusConnection *connection)
2303bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
2313bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  return bus_loop_add_timeout (timeout, connection_timeout_callback, connection, NULL);
2323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
2333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
2343bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
2353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_connection_timeout (DBusTimeout    *timeout,
2363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                           DBusConnection *connection)
2373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
2383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  bus_loop_remove_timeout (timeout, connection_timeout_callback, connection);
2393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
2403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
241a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonstatic dbus_bool_t
242a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonallow_user_function (DBusConnection *connection,
243a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                     unsigned long   uid,
244a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                     void           *data)
245a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
246a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusConnectionData *d;
247a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
248a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
249a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
250a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  _dbus_assert (d != NULL);
25144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
25244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington  return TRUE; /* FIXME - this is just until we can parse a config file */
253a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
254a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return bus_context_allow_user (d->connections->context, uid);
255a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
256a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
2573bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
25896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonfree_connection_data (void *data)
25996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
26096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d = data;
26196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
26296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  /* services_owned should be NULL since we should be disconnected */
26396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_assert (d->services_owned == NULL);
26429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* similarly */
26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d->transaction_messages == NULL);
266aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (d->oom_preallocated)
26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated);
269f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (d->oom_message)
27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (d->oom_message);
272a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
273a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (d->policy)
274a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    bus_policy_unref (d->policy);
275a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
276a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  dbus_free (d->group_ids);
27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
278aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  dbus_free (d->name);
27996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
28096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  dbus_free (d);
28196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
28296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
2836ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
2846ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_new (BusContext *context)
28596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
2866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
28796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
288f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (!connection_data_slot_ref ())
289f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    return NULL;
29096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
2916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections = dbus_new0 (BusConnections, 1);
2926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (connections == NULL)
293f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
294f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot_unref ();
295f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      return NULL;
296f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
2976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
2986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->refcount = 1;
2996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->context = context;
3006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return connections;
3026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
3036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3046ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
3056ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_ref (BusConnections *connections)
3066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
3076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (connections->refcount > 0);
3086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->refcount += 1;
3096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3116ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
3126ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_unref (BusConnections *connections)
3136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
3146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (connections->refcount > 0);
3156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections->refcount -= 1;
3166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (connections->refcount == 0)
3176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
318ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      while (connections->list != NULL)
319ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
320ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          DBusConnection *connection;
321ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
322ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          connection = connections->list->data;
323ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
324ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          dbus_connection_ref (connection);
325ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          dbus_connection_disconnect (connection);
326ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_connection_disconnected (connection);
327ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          dbus_connection_unref (connection);
328ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
3296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      _dbus_list_clear (&connections->list);
3316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
332f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      dbus_free (connections);
333f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
334f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      connection_data_slot_unref ();
3356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
33696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
33796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
33896a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t
3396ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_setup_connection (BusConnections *connections,
3406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                  DBusConnection *connection)
34196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
34296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
343ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_bool_t retval;
344ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
3451b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson  d = dbus_new0 (BusConnectionData, 1);
3461b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson
34796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  if (d == NULL)
34896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    return FALSE;
34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
3506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d->connections = connections;
35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->connection = connection;
352f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
353f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_assert (connection_data_slot >= 0);
35496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
35596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  if (!dbus_connection_set_data (connection,
35696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                 connection_data_slot,
35796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                 d, free_connection_data))
35896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    {
35996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington      dbus_free (d);
36096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington      return FALSE;
36196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    }
362ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
363ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  retval = FALSE;
364a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
365a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d->n_group_ids = 0;
366a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d->group_ids = NULL;
36796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
3683bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_watch_functions (connection,
3693bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            (DBusAddWatchFunction) add_connection_watch,
3703bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            (DBusRemoveWatchFunction) remove_connection_watch,
371f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                            NULL,
3723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            connection,
3733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                            NULL))
374ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
3753bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
3763bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_set_timeout_functions (connection,
3773bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              (DBusAddTimeoutFunction) add_connection_timeout,
3783bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              (DBusRemoveTimeoutFunction) remove_connection_timeout,
379f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                              NULL,
3803bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                              connection, NULL))
381ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
3823bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
38344fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
38444fff656885ac32e319feb98fd0d06680d602977Havoc Pennington  dbus_connection_set_unix_user_function (connection,
38544fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                          allow_user_function,
38644fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                          NULL, NULL);
38796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
38839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  /* Setup the connection with the dispatcher */
38939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  if (!bus_dispatch_add_connection (connection))
390ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
391ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
392ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!_dbus_list_append (&connections->list, connection))
3933bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    {
394ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      bus_dispatch_remove_connection (connection);
395ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      goto out;
3963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    }
397ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
3983bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  dbus_connection_ref (connection);
399ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  retval = TRUE;
400ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
401ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out:
402ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!retval)
403ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
404f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      if (!dbus_connection_set_data (connection,
405f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington                                     connection_data_slot,
406f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington                                     NULL, NULL))
407f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington        _dbus_assert_not_reached ("failed to set connection data to null");
408f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
409ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!dbus_connection_set_watch_functions (connection,
410ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                NULL, NULL, NULL,
411ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                connection,
412ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                NULL))
413ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        _dbus_assert_not_reached ("setting watch functions to NULL failed");
414ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
415ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!dbus_connection_set_timeout_functions (connection,
416ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                  NULL, NULL, NULL,
417ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                  connection,
418ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                                  NULL))
419ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        _dbus_assert_not_reached ("setting timeout functions to NULL failed");
42044fff656885ac32e319feb98fd0d06680d602977Havoc Pennington
42144fff656885ac32e319feb98fd0d06680d602977Havoc Pennington      dbus_connection_set_unix_user_function (connection,
42244fff656885ac32e319feb98fd0d06680d602977Havoc Pennington                                              NULL, NULL, NULL);
423ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
424aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
425ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  return retval;
42696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
42796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
428a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t
429a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_groups  (DBusConnection       *connection,
430a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                            const unsigned long **groups,
431a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                            int                  *n_groups)
432a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
433a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusConnectionData *d;
434a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
435a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
436a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
437a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  _dbus_assert (d != NULL);
438a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
439a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  *groups = NULL;
440a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  *n_groups = 0;
441a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
442a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  /* we do a lazy lookup on groups a user is in for two reasons:
443a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   * 1) we can't do it on connection setup since the user
444a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   * hasn't authenticated and 2) it might be expensive
445a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   * and we don't need to do it if there are no group-based
446a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   * rules in the config file
447a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   */
448a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
449a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (d->n_group_ids == 0)
450a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
451a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      unsigned long uid;
452a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
453a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      if (dbus_connection_get_unix_user (connection, &uid))
454a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington        {
455a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington          if (!_dbus_get_groups (uid, &d->group_ids, &d->n_group_ids))
456a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington            {
457a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington              _dbus_verbose ("Did not get any groups for UID %lu\n",
458a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                             uid);
459a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington              return FALSE;
460a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington            }
461a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington        }
462a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
463a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
464a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  *groups = d->group_ids;
465a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  *n_groups = d->n_group_ids;
466a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
467a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return TRUE;
468a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
469a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
470a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t
471a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_is_in_group (DBusConnection *connection,
472a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                            unsigned long   gid)
473a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
474a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  int i;
475a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  const unsigned long *group_ids;
476a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  int n_group_ids;
477a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
478a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (!bus_connection_get_groups (connection, &group_ids, &n_group_ids))
479a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    return FALSE;
480a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
481a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  i = 0;
482a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  while (i < n_group_ids)
483a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
484a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      if (group_ids[i] == gid)
485a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington        return TRUE;
486a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      ++i;
487a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
488a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
489a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return FALSE;
490a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
491a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
492a26607ab68bf0878f23d2dbddec781b4b760d034Havoc PenningtonBusPolicy*
493a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_connection_get_policy (DBusConnection *connection)
494a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
495a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  BusConnectionData *d;
496a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
497a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
498a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
499a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  _dbus_assert (d != NULL);
500a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
501a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (!dbus_connection_get_is_authenticated (connection))
502a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
503a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      _dbus_verbose ("Tried to get policy for unauthenticated connection!\n");
504a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      return NULL;
505a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
506a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
507a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  /* We do lazy creation of the policy because
508a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   * it can only be done post-authentication.
509a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington   */
510a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  if (d->policy == NULL)
511a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    {
512a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      d->policy =
513a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington        bus_context_create_connection_policy (d->connections->context,
514a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                                              connection);
515a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
516a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington      /* we may have a NULL policy on OOM or error getting list of
517a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       * groups for a user. In the latter case we don't handle it so
518a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       * well currently, just keep pretending we're out of memory,
519a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       * which is kind of bizarre.
520a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington       */
521a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington    }
522a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
523a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington  return d->policy;
524a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
5256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/**
5276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Calls function on each connection; if the function returns
5286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * #FALSE, stops iterating.
5296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
5306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param connections the connections object
5316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param function the function
5326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * @param data data to pass to it as a second arg
5336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */
5346ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
5356ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_foreach (BusConnections               *connections,
5366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                         BusConnectionForeachFunction  function,
5376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington			void                          *data)
5386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  DBusList *link;
5406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  link = _dbus_list_get_first_link (&connections->list);
5426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  while (link != NULL)
5436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
5446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      DBusConnection *connection = link->data;
5456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      DBusList *next = _dbus_list_get_next_link (&connections->list, link);
5466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (!(* function) (connection, data))
5486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington        break;
5496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      link = next;
5516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
5526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
5536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5546ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext*
5556ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connections_get_context (BusConnections *connections)
5566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return connections->context;
5586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
5596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5606ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext*
5616ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_context (DBusConnection *connection)
5626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
5646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
5666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
5686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return d->connections->context;
5706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
5716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5726ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
5736ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_connections (DBusConnection *connection)
5746ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
5766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
5786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
5806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return d->connections;
5826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
5836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5846ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry*
5856ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_registry (DBusConnection *connection)
5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
5886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
5906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
5926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return bus_context_get_registry (d->connections->context);
5946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
5956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5966ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation*
5976ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_connection_get_activation (DBusConnection *connection)
5986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
5996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnectionData *d;
6006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (d != NULL);
6046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return bus_context_get_activation (d->connections->context);
6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
6076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Checks whether the connection is registered with the message bus.
61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington *
61129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param connection the connection
61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @returns #TRUE if we're an active message bus participant
61329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
61429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_is_active (DBusConnection *connection)
61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
62029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
62129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return d != NULL && d->name != NULL;
62229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
62329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
62429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
62529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_preallocate_oom_error (DBusConnection *connection)
62629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage *message;
62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusPreallocatedSend *preallocated;
62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
63229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
63329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
63429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
63529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (d->oom_preallocated != NULL)
63629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return TRUE;
63729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
63829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  preallocated = dbus_connection_preallocate_send (connection);
63929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (preallocated == NULL)
64029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
642056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  /* d->name may be NULL, but that should be OK */
643056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  message = dbus_message_new (d->name,
64429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_ERROR_NO_MEMORY);
64529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
64629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
64729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_connection_free_preallocated_send (connection, preallocated);
64829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
64929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
651f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington  dbus_message_set_is_error (message, TRUE);
652056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
653056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  if (!dbus_message_set_sender (message,
654056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington                                DBUS_SERVICE_DBUS))
655056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington    {
656056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington      dbus_connection_free_preallocated_send (connection, preallocated);
657056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington      dbus_message_unref (message);
658056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington      return FALSE;
659056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington    }
660f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington
66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* set reply serial to placeholder value just so space is already allocated
66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * for it.
66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_reply_serial (message, 14))
66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_connection_free_preallocated_send (connection, preallocated);
66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_message = message;
67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_preallocated = preallocated;
67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_send_oom_error (DBusConnection *connection,
67929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                               DBusMessage    *in_reply_to)
68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
68329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
68429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
68629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d->oom_message != NULL);
68729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* should always succeed since we set it to a placeholder earlier */
68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_reply_serial (d->oom_message,
69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                      dbus_message_get_serial (in_reply_to)))
69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message");
69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
693056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL);
694056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
69529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_connection_send_preallocated (connection, d->oom_preallocated,
69629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                     d->oom_message, NULL);
69729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
69829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (d->oom_message);
69929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_message = NULL;
70029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d->oom_preallocated = NULL;
70129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
70229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
70396a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtondbus_bool_t
70496a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_add_owned_service (DBusConnection *connection,
70596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                  BusService     *service)
70696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
70796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
70896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
70996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  d = BUS_CONNECTION_DATA (connection);
71096a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_assert (d != NULL);
71196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
71296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  if (!_dbus_list_append (&d->services_owned,
71396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                          service))
71496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington    return FALSE;
71596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
71696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  return TRUE;
71796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
71896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
71996a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonvoid
72096a9f80300b7794475a5451a60a07555ea3526beHavoc Penningtonbus_connection_remove_owned_service (DBusConnection *connection,
72196a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington                                     BusService     *service)
72296a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington{
72396a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  BusConnectionData *d;
72496a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
72596a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  d = BUS_CONNECTION_DATA (connection);
72696a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_assert (d != NULL);
72796a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington
72896a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington  _dbus_list_remove_last (&d->services_owned, service);
72996a9f80300b7794475a5451a60a07555ea3526beHavoc Pennington}
730aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
731aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssondbus_bool_t
732aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_set_name (DBusConnection   *connection,
733aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson			 const DBusString *name)
734aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
735aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusConnectionData *d;
736aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
737aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  d = BUS_CONNECTION_DATA (connection);
738aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (d != NULL);
739aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (d->name == NULL);
740aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
741fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_copy_data (name, &d->name))
742aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    return FALSE;
743aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
744fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  _dbus_assert (d->name != NULL);
745fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington
746d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("Name %s assigned to %p\n", d->name, connection);
747d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
748aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
749aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
750aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
751aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonconst char *
752aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_connection_get_name (DBusConnection *connection)
753aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
754aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusConnectionData *d;
755aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
756aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  d = BUS_CONNECTION_DATA (connection);
757aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (d != NULL);
758aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
759aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return d->name;
760aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
761a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
76229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtontypedef struct
76329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
76429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusTransaction *transaction;
76529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage    *message;
76629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusPreallocatedSend *preallocated;
76729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} MessageToSend;
76829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
76929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct BusTransaction
77029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
77129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *connections;
7726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context;
77329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
77429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
77529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
77629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonmessage_to_send_free (DBusConnection *connection,
77729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                      MessageToSend  *to_send)
77829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
77929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send->message)
78029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (to_send->message);
78129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
78229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send->preallocated)
78329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_connection_free_preallocated_send (connection, to_send->preallocated);
78429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
78529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (to_send);
78629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
78729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
78829560adcc79a259a0be3511c056ee7453aa26c04Havoc PenningtonBusTransaction*
7896ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_new (BusContext *context)
79029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
79129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusTransaction *transaction;
79229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
79329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  transaction = dbus_new0 (BusTransaction, 1);
79429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (transaction == NULL)
79529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return NULL;
79629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
7976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  transaction->context = context;
7986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
79929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return transaction;
80029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
80129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8026ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusContext*
8036ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_context (BusTransaction  *transaction)
8046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
8056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return transaction->context;
8066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
8076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
8086ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
8096ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_transaction_get_connections (BusTransaction  *transaction)
8106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
8116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return bus_context_get_connections (transaction->context);
8126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
8136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
81429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
81529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_message (BusTransaction *transaction,
81629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusConnection *connection,
81729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusMessage    *message)
81829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
81929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  MessageToSend *to_send;
82029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
82129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *link;
82229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
823ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_verbose ("  trying to add message %s to transaction%s\n",
824ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                 dbus_message_get_name (message),
825ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                 dbus_connection_get_is_connected (connection) ?
826ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                 "" : " (disconnected)");
827056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
828056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington  _dbus_assert (dbus_message_get_sender (message) != NULL);
829f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington
83029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
83129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return TRUE; /* silently ignore disconnected connections */
83229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
83329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
83429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
83529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
83629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send = dbus_new (MessageToSend, 1);
83729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send == NULL)
83829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
83929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
84029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
84129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
84229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send->preallocated = dbus_connection_preallocate_send (connection);
84329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (to_send->preallocated == NULL)
84429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
84529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free (to_send);
84629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
84729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
84829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
84929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_ref (message);
85029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send->message = message;
85129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  to_send->transaction = transaction;
85229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
853d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("about to prepend message\n");
854d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
85529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!_dbus_list_prepend (&d->transaction_messages, to_send))
85629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
85729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      message_to_send_free (connection, to_send);
85829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
85929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
860d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington
861d1f65c6c4f9dd9750f9ad3eda5b590a4ffca6498Havoc Pennington  _dbus_verbose ("prepended message\n");
86229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
86329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* See if we already had this connection in the list
86429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * for this transaction. If we have a pending message,
86529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * then we should already be in transaction->connections
86629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
86729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_first_link (&d->transaction_messages);
86829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (link->data == to_send);
86929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_next_link (&d->transaction_messages, link);
87029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (link != NULL)
87129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
87229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      MessageToSend *m = link->data;
87329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
87429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
87529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (m->transaction == transaction)
87629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        break;
87729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
87829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      link = next;
87929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
88029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
88129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (link == NULL)
88229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
88329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!_dbus_list_prepend (&transaction->connections, connection))
88429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
88529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_list_remove (&d->transaction_messages, to_send);
88629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          message_to_send_free (connection, to_send);
88729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          return FALSE;
88829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
88929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
89029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
89129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
89229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
89329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
89429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
89529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_cancel_transaction (DBusConnection *connection,
89629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                               BusTransaction *transaction)
89729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
89829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *link;
89929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
90029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
90129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
90229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
90329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
90429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_first_link (&d->transaction_messages);
90529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (link != NULL)
90629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
90729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      MessageToSend *m = link->data;
90829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
90929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
91029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (m->transaction == transaction)
91129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
91229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_list_remove_link (&d->transaction_messages,
91329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  link);
91429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
91529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          message_to_send_free (connection, m);
91629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
91729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
91829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      link = next;
91929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
92029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
92129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
92229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
92329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_cancel_and_free (BusTransaction *transaction)
92429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
92529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *connection;
926ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
927ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_verbose ("TRANSACTION: cancelled\n");
92829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
92929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while ((connection = _dbus_list_pop_first (&transaction->connections)))
93029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    connection_cancel_transaction (connection, transaction);
93129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
93229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (transaction->connections == NULL);
93329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
93429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (transaction);
93529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
93629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
93729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
93829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconnection_execute_transaction (DBusConnection *connection,
93929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                BusTransaction *transaction)
94029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
94129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusList *link;
94229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
94329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
94429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
94529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
94629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
94729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Send the queue in order (FIFO) */
94829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  link = _dbus_list_get_last_link (&d->transaction_messages);
94929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (link != NULL)
95029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
95129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      MessageToSend *m = link->data;
95229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link);
95329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
95429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (m->transaction == transaction)
95529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
95629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_list_remove_link (&d->transaction_messages,
95729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  link);
95829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
959056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington          _dbus_assert (dbus_message_get_sender (m->message) != NULL);
960056d76d809dc341b0dce160d3f79062604565c77Havoc Pennington
96129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          dbus_connection_send_preallocated (connection,
96229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                             m->preallocated,
96329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                             m->message,
96429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                             NULL);
96529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
96629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          m->preallocated = NULL; /* so we don't double-free it */
96729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
96829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          message_to_send_free (connection, m);
96929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
97029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
97129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      link = prev;
97229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
97329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
97429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
97529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
97629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_execute_and_free (BusTransaction *transaction)
97729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
97829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* For each connection in transaction->connections
97929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * send the messages
98029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
98129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *connection;
982ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
983ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_verbose ("TRANSACTION: executing\n");
98429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
98529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while ((connection = _dbus_list_pop_first (&transaction->connections)))
98629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    connection_execute_transaction (connection, transaction);
98729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
98829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (transaction->connections == NULL);
98929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
99029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (transaction);
99129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
99229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
99329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic void
99429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_connection_remove_transactions (DBusConnection *connection)
99529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
99629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  MessageToSend *to_send;
99729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusConnectionData *d;
99829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
99929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  d = BUS_CONNECTION_DATA (connection);
100029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (d != NULL);
100129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
100229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while ((to_send = _dbus_list_get_first (&d->transaction_messages)))
100329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
100429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      /* only has an effect for the first MessageToSend listing this transaction */
100529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_list_remove (&to_send->transaction->connections,
100629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         connection);
100729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
100829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_list_remove (&d->transaction_messages, to_send);
100929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      message_to_send_free (connection, to_send);
101029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
101129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
101229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
101329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
101429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Converts the DBusError to a message reply
101529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
101629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
101729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_transaction_send_error_reply (BusTransaction  *transaction,
101829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusConnection  *connection,
101929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const DBusError *error,
102029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage     *in_reply_to)
102129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
102229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusMessage *reply;
102390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
102429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (error != NULL);
102529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
102629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
102729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_error_reply (in_reply_to,
102829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                        error->name,
102929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                        error->message);
103029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
103129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
103229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1033e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS) ||
1034e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      !bus_transaction_send_message (transaction, connection, reply))
103529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
103629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
103729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
103829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
103929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1040e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  dbus_message_unref (reply);
1041e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
104229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
1043a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
1044