driver.c revision 030cc1e53c6216853e08e27b92f72db80d001873
1aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson/* -*- mode: C; c-file-style: "gnu" -*- */
2c414488fe62605ebda5e875fc2db05c6b3dd199fHavoc Pennington/* driver.c  Bus client (driver)
3aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * Copyright (C) 2003 CodeFactory AB
55b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington * Copyright (C) 2003, 2004, 2005 Red Hat, Inc.
6aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
8aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
9aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is free software; you can redistribute it and/or modify
10aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * it under the terms of the GNU General Public License as published by
11aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * the Free Software Foundation; either version 2 of the License, or
12aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * (at your option) any later version.
13aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
14aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is distributed in the hope that it will be useful,
15aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
16aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * GNU General Public License for more details.
18aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
19aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * You should have received a copy of the GNU General Public License
20aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * along with this program; if not, write to the Free Software
21aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */
24aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
25f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h"
26aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h"
27aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h"
2839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
29aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h"
30a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
3102dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
32aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h>
3339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
34030cc1e53c6216853e08e27b92f72db80d001873Colin Walters#include <dbus/dbus-marshal-recursive.h>
35aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h>
36aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
3729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusMessage    *hello_message,
3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    BusTransaction *transaction,
4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusError      *error);
4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
4385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieubus_driver_send_service_owner_changed (const char     *service_name,
4485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       const char     *old_owner,
4585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       const char     *new_owner,
4685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       BusTransaction *transaction,
4785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       DBusError      *error)
48a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
4939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  DBusMessage *message;
5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *null_service;
5290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
5390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  null_service = "";
568873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  _dbus_verbose ("sending name owner changed: %s [%s -> %s]\n",
57dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington                 service_name,
5885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                 old_owner ? old_owner : null_service,
5985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                 new_owner ? new_owner : null_service);
603f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson
61248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
62248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
638873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameOwnerChanged");
64b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
6529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
7039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
71248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
7285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto oom;
7385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
7485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (!dbus_message_append_args (message,
759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, old_owner ? &old_owner : &null_service,
779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, new_owner ? &new_owner : &null_service,
78e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
7985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto oom;
8039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
81dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_assert (dbus_message_has_signature (message, "sss"));
82dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
83a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = bus_dispatch_matches (transaction, NULL, NULL, message, error);
8429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (message);
8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
87a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
8885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu oom:
89a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  dbus_message_unref (message);
9085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  BUS_SET_OOM (error);
9185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  return FALSE;
92a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
93a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
95ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection,
9629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			      const char     *service_name,
9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              BusTransaction *transaction,
9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusError      *error)
99ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
100ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
101ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
10290ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
10390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
104248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
105248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
1068873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameLost");
107b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
113ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
114b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
115b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
1169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
117e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
12229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
12329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
124777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
12529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
135ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
136ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
138ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection,
13929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const char     *service_name,
14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
142ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
143ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
144ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
14590ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
14690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
147248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
148248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
1498873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameAcquired");
150c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
15129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
156ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
157b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
158b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
1599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
160e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
16129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
16229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
16329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
167777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
17029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
178ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
179ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
180aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t
1816ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry,
1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                           DBusString  *str)
183aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
184d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  /* We never want to use the same unique client name twice, because
185d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * we want to guarantee that if you send a message to a given unique
186d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * name, you always get the same application. So we use two numbers
187d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * for INT_MAX * INT_MAX combinations, should be pretty safe against
188d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * wraparound.
189d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   */
190b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  /* FIXME these should be in BusRegistry rather than static vars */
191d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_major_number = 0;
192d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_minor_number = 0;
193d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  int len;
194b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
195aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  len = _dbus_string_get_length (str);
196aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
197d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  while (TRUE)
198aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    {
199d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* start out with 1-0, go to 1-1, 1-2, 1-3,
200d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       * up to 1-MAXINT, then 2-0, 2-1, etc.
201d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       */
202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (next_minor_number <= 0)
203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        {
204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_major_number += 1;
205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_minor_number = 0;
206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          if (next_major_number <= 0)
207d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington            _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        }
209d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
210d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_major_number > 0);
211d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_minor_number >= 0);
212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* appname:MAJOR-MINOR */
214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, ":"))
216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_major_number))
219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
22175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (!_dbus_string_append (str, "."))
222d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_minor_number))
225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      next_minor_number += 1;
228aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
229aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      /* Check if a client with the name exists */
2306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (bus_registry_lookup (registry, str) == NULL)
231aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson	break;
232aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* drop the number again, try the next one. */
234aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      _dbus_string_set_length (str, len);
235aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    }
236aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
237aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
238aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
239aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
24029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
241a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection,
24229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         BusTransaction *transaction,
24329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusMessage    *message,
24429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusError      *error)
245aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
246aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString unique_name;
247aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusService *service;
24829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
2496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
250983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  BusConnections *connections;
25190ed1d84588a84697051e643175452c50d682eceHavoc Pennington
25290ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
253983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
2541658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (bus_connection_is_active (connection))
2551658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
2561658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      /* We already handled an Hello message for this connection. */
2571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      dbus_set_error (error, DBUS_ERROR_FAILED,
2581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                      "Already handled an Hello message");
2591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      return FALSE;
2601658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
2611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
262983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* Note that when these limits are exceeded we don't disconnect the
263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * connection; we just sort of leave it hanging there until it times
264983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * out or disconnects itself or is dropped due to the max number of
265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * incomplete connections. It's even OK if the connection wants to
266983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * retry the hello message, we support that.
267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   */
268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  connections = bus_connection_get_connections (connection);
269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  if (!bus_connections_check_limits (connections, connection,
270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                                     error))
271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
276fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&unique_name))
27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
27829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
281f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
2836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
2846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
2866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!create_unique_client_name (registry, &unique_name))
28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
29197ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
292e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (!bus_connection_complete (connection, &unique_name, error))
29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
294e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message,
29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                bus_connection_get_name (connection)))
30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
304d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson
30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_driver_send_welcome_message (connection, message, transaction, error))
30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
30797ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
308aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  /* Create the service */
3096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_ensure (registry,
3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                 &unique_name, connection, transaction, error);
31129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
313ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
31429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_service_set_prohibit_replacement (service, TRUE);
315aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
316a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert (bus_connection_is_active (connection));
31729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
31829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0:
320aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_free (&unique_name);
32129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
322aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
323aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
32429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
325aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection,
32629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *hello_message,
32729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
329aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
330aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusMessage *welcome;
331aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  const char *name;
33290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
33390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
334aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  name = bus_connection_get_name (connection);
336aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (name != NULL);
337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
338b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  welcome = dbus_message_new_method_return (hello_message);
33929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (welcome == NULL)
34029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
34129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
34439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
34529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (welcome,
3469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &name,
347e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
34829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
3545b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  _dbus_assert (dbus_message_has_signature (welcome, DBUS_TYPE_STRING_AS_STRING));
355dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
356777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, welcome))
35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
367aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
368aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
370a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection,
37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *message,
37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
374a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
375a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *reply;
37629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int len;
377a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  char **services;
3786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
3799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int i;
3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessageIter iter;
3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessageIter sub;
38290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
38390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
3866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
387b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
38829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
393a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
3946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_registry_list_services (registry, &services, &len))
39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
4009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
40131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_message_iter_init_append (reply, &iter);
40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                         DBUS_TYPE_STRING_AS_STRING,
4059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                         &sub))
40629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free_string_array (services);
40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
41239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
413970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington  {
414970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington    /* Include the bus driver in the list */
415248895207dc15914ac7970a6d1431308075dca1dColin Walters    const char *v_STRING = DBUS_SERVICE_DBUS;
416970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington    if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
417970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington                                         &v_STRING))
418970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington      {
419970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        dbus_free_string_array (services);
420970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        dbus_message_unref (reply);
421970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        BUS_SET_OOM (error);
422970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        return FALSE;
423970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington      }
424970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington  }
425970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington
4269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  i = 0;
4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (i < len)
4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
4299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
4309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                           &services[i]))
4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          dbus_free_string_array (services);
4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          dbus_message_unref (reply);
4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          BUS_SET_OOM (error);
4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return FALSE;
4369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
4379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++i;
4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_iter_close_container (&iter, &sub))
4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      dbus_free_string_array (services);
4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      dbus_message_unref (reply);
4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      BUS_SET_OOM (error);
4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      return FALSE;
4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
44829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free_string_array (services);
44929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
450777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
451a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    {
45229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
45429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
45629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
45929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
460a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    }
461a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
462a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
46329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
46434e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection,
46529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   BusTransaction *transaction,
46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusMessage    *message,
46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusError      *error)
468aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
469ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
470aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString service_name;
4719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
472ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  int service_reply;
4738a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu  dbus_uint32_t flags;
47429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
47690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
47790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
4796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
480ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
481c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson  if (!dbus_message_get_args (message, error,
48229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
48329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
484e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
48529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
486ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
48798ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington  _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
4886c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington
4896c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  retval = FALSE;
4906c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  reply = NULL;
491aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
492aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_init_const (&service_name, name);
493ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
4946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!bus_registry_acquire_service (registry, connection,
4956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_name, flags,
4966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_reply, transaction,
4976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     error))
4986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    goto out;
499aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
500b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
50129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
505ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
50629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
5079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
50829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
51029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
512ba60374e251cca8fe351b7dd4def595069323885James Willcox
513777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
51429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
51929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
52129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
526aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
52729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
528ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection,
52929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
53029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage    *message,
53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
532ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
533ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
534ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusString service_name;
535ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
53662e465339a306fa564b69935da494dad6e1b474aHavoc Pennington  dbus_bool_t service_exists;
5379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
53829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
54090ed1d84588a84697051e643175452c50d682eceHavoc Pennington
54190ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
5426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
54439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
54529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
54629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
547e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
549ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
5512091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge
552248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
5532091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
5542091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = TRUE;
5552091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
5562091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge  else
5572091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
5582091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      _dbus_string_init_const (&service_name, name);
5592091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service = bus_registry_lookup (registry, &service_name);
5602091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = service != NULL;
5612091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
56229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
563b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
56429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
56529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
56629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
56729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
56829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
56929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
57029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
5719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_BOOLEAN, &service_exists,
57229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
57329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
57429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
57529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
57629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
57729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
578777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
57929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
58029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
58129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
58229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
58329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
58429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
58529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
58629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
58729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
58929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
59029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
591aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
59239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
594f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection,
59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    BusTransaction *transaction,
59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusMessage    *message,
59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusError      *error)
598f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{
599f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  dbus_uint32_t flags;
6009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
60129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
60490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
60590ed1d84588a84697051e643175452c50d682eceHavoc Pennington
6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  activation = bus_connection_get_activation (connection);
607f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
611e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
612eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
613eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
6148873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
615eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      return FALSE;
616eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
617f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
619f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
62093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
621e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                        message, name, error))
622eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
623eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
624eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("bus_activation_activate_service() failed\n");
625eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      goto out;
626eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
632f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson}
633f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
634a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
635a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_ack_reply (DBusConnection *connection,
636a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                BusTransaction *transaction,
637a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusMessage    *message,
638a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusError      *error)
639a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
640a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusMessage *reply;
641a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
642a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  reply = dbus_message_new_method_return (message);
643a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (reply == NULL)
644a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
645a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
646a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
647a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
648a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
649a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
650a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
651a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
652a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_message_unref (reply);
653a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
654a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
655a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
656a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_message_unref (reply);
657a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
658a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
659a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
660a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
661a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
662a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_add_match (DBusConnection *connection,
663a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             BusTransaction *transaction,
664a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusMessage    *message,
665a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusError      *error)
666a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
667a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
6689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
669a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
670a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
671a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
672a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
673a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
674a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
675a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
676a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
677a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (bus_connection_get_n_match_rules (connection) >=
678a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction)))
679a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
680a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
681a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "Connection \"%s\" is not allowed to add more match rules "
682a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(increase limits in configuration file if required)",
683a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_is_active (connection) ?
684a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_get_name (connection) :
685a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(inactive)");
686a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
687a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
688a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
689a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
690a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
691a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
692a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
693a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to AddMatch\n");
694a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
695a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
696a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
697a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
698a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
699a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
700a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
701a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
702a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
703a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
704a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
705a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_add_rule (matchmaker, rule))
706a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
707a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
708a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
709a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
710a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
711a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
712a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
713a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
714a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_matchmaker_remove_rule (matchmaker, rule);
715a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
716a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
717a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
718a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
719a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
720a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
721a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
722a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
723a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
724a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
725a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
726a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
727a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
728a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
729a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
730a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_remove_match (DBusConnection *connection,
731a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                BusTransaction *transaction,
732a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusMessage    *message,
733a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusError      *error)
734a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
735a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
7369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
737a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
738a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
739a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
740a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
741a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
742a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
743a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
744a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
745a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
746a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
747a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to RemoveMatch\n");
750a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
751a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
752a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
753a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
754a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
755a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
756a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
757a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
758a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
759a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* Send the ack before we remove the rule, since the ack is undone
760a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   * on transaction cancel, but rule removal isn't.
761a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   */
762a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
763a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
764a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
765a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
766a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
767a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
768a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error))
769a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
770a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
771a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
772a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
773a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
774a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
775a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
776a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
777a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
778a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
779a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
780a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
781a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
782a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieustatic dbus_bool_t
783a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieubus_driver_handle_get_service_owner (DBusConnection *connection,
784a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     BusTransaction *transaction,
785a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusMessage    *message,
786a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusError      *error)
787a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu{
7889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
789a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  const char *base_name;
790a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusString str;
791a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusRegistry *registry;
792a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusService *service;
793a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusMessage *reply;
794a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
795a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
796a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
797a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  registry = bus_connection_get_registry (connection);
798a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
799a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  text = NULL;
800a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = NULL;
801a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
802a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_get_args (message, error,
803a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_STRING, &text,
804a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_INVALID))
805a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
806a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
807a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _dbus_string_init_const (&str, text);
808a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  service = bus_registry_lookup (registry, &str);
80941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (service == NULL &&
810248895207dc15914ac7970a6d1431308075dca1dColin Walters      _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS))
81141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
81241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      /* ORG_FREEDESKTOP_DBUS owns itself */
813248895207dc15914ac7970a6d1431308075dca1dColin Walters      base_name = DBUS_SERVICE_DBUS;
81441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
81541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  else if (service == NULL)
816a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
817a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      dbus_set_error (error,
81841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                      DBUS_ERROR_NAME_HAS_NO_OWNER,
81941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                      "Could not get owner of name '%s': no such name", text);
820a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
821a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
82241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  else
823a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
82441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      base_name = bus_connection_get_name (bus_service_get_primary_owner (service));
82541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      if (base_name == NULL)
82641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington        {
82741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          /* FIXME - how is this error possible? */
82841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          dbus_set_error (error,
82941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                          DBUS_ERROR_FAILED,
83041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                          "Could not determine unique name for '%s'", text);
83141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          goto failed;
83241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington        }
83341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      _dbus_assert (*base_name == ':');
834a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
83541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
83641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_assert (base_name != NULL);
837a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
838a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = dbus_message_new_method_return (message);
839a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply == NULL)
840a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
841a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
842a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_append_args (reply,
8439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington				  DBUS_TYPE_STRING, &base_name,
844a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				  DBUS_TYPE_INVALID))
845a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
846a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
847a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
848a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
849a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
850a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  dbus_message_unref (reply);
851a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
852a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return TRUE;
853a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
854a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu oom:
855a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BUS_SET_OOM (error);
856a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
857a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu failed:
858a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
859a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply)
860a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    dbus_message_unref (reply);
861a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return FALSE;
862a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu}
863a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
8641919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergstatic dbus_bool_t
8652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieubus_driver_handle_get_connection_unix_user (DBusConnection *connection,
8662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            BusTransaction *transaction,
8672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusMessage    *message,
8682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusError      *error)
8692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{
8709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service;
8712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusString str;
8722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusRegistry *registry;
8732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusService *serv;
8742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusConnection *conn;
8752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusMessage *reply;
8762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  unsigned long uid;
8779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t uid32;
8782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8792779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
8802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8812779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  registry = bus_connection_get_registry (connection);
8822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  service = NULL;
8842779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = NULL;
8852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_get_args (message, error,
8872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_STRING, &service,
8882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_INVALID))
8892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
8902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_verbose ("asked for UID of connection %s\n", service);
8922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_string_init_const (&str, service);
8942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  serv = bus_registry_lookup (registry, &str);
8952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (serv == NULL)
8962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
8972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
8988873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      DBUS_ERROR_NAME_HAS_NO_OWNER,
8998873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      "Could not get UID of name '%s': no such name", service);
9002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
9012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
9022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  conn = bus_service_get_primary_owner (serv);
9042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9052779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = dbus_message_new_method_return (message);
9062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply == NULL)
9072779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9082779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9092779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!dbus_connection_get_unix_user (conn, &uid))
9102779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
9112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
9122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      DBUS_ERROR_FAILED,
9132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      "Could not determine UID for '%s'", service);
9142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
9152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
9162779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  uid32 = uid;
9182779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_append_args (reply,
9199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                  DBUS_TYPE_UINT32, &uid32,
9202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_INVALID))
9212779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
9242779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9252779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9262779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_message_unref (reply);
9272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return TRUE;
9292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu oom:
9312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BUS_SET_OOM (error);
9322779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9332779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu failed:
9342779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
9352779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply)
9362779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    dbus_message_unref (reply);
9372779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return FALSE;
9382779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu}
9392779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9402779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t
941c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenbus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
942c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  BusTransaction *transaction,
943c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusMessage    *message,
944c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusError      *error)
945c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{
9469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service;
947c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusString str;
948c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusRegistry *registry;
949c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusService *serv;
950c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusConnection *conn;
951c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusMessage *reply;
952c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  unsigned long pid;
9539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t pid32;
954c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
955c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
956c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
957c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  registry = bus_connection_get_registry (connection);
958c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
959c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  service = NULL;
960c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = NULL;
961c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
962c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_get_args (message, error,
963c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_STRING, &service,
964c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_INVALID))
965c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
966c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
967c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_verbose ("asked for PID of connection %s\n", service);
968c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
969c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_string_init_const (&str, service);
970c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  serv = bus_registry_lookup (registry, &str);
971c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (serv == NULL)
972c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
973c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
9748873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      DBUS_ERROR_NAME_HAS_NO_OWNER,
9758873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      "Could not get PID of name '%s': no such name", service);
976c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
977c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
978c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
979c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  conn = bus_service_get_primary_owner (serv);
980c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
981c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = dbus_message_new_method_return (message);
982c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply == NULL)
983c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
984c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
985c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!dbus_connection_get_unix_process_id (conn, &pid))
986c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
987c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
988c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN,
989c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      "Could not determine PID for '%s'", service);
990c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
991c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
992c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
9939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  pid32 = pid;
994c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_append_args (reply,
9959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                  DBUS_TYPE_UINT32, &pid32,
996c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_INVALID))
997c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
998c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
999c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! bus_transaction_send_from_driver (transaction, connection, reply))
1000c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1001c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1002c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_message_unref (reply);
1003c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1004c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return TRUE;
1005c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1006c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen oom:
1007c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BUS_SET_OOM (error);
1008c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1009c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen failed:
1010c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_SET (error);
1011c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply)
1012c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    dbus_message_unref (reply);
1013c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return FALSE;
1014c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen}
1015c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1016c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t
10171919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergbus_driver_handle_reload_config (DBusConnection *connection,
10181919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 BusTransaction *transaction,
10191919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusMessage    *message,
10201919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusError      *error)
10211919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg{
10221919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  BusContext *context;
10231919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  dbus_bool_t retval;
10241919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10251919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
10261919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10271919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  retval = FALSE;
10281919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10291919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  context = bus_connection_get_context (connection);
10301919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  if (!bus_context_reload_config (context, error))
10311919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg    {
10321919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg      _DBUS_ASSERT_ERROR_IS_SET (error);
10331919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg      goto out;
10341919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg    }
10351919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10361919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  retval = TRUE;
10371919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10381919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg out:
10391919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  return retval;
10401919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg}
10411919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
104229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of
104329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items
104429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow)
104529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
104629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct
104729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
104829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  const char *name;
10495b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  const char *in_args;
10505b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  const char *out_args;
105129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t (* handler) (DBusConnection *connection,
105229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
105329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusMessage    *message,
105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error);
105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = {
10565b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "RequestName",
10575b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
10585b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
10595b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_acquire_service },
10605b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "StartServiceByName",
10615b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
10625b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
10635b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_activate_service },
10645b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "Hello",
10655b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
10665b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10675b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_hello },
10685b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "NameHasOwner",
10695b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10705b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_BOOLEAN_AS_STRING,
10715b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_service_exists },
10725b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "ListNames",
10735b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
10745b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
10755b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_list_services },
10765b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "AddMatch",
10775b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10785b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
10795b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_add_match },
10805b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "RemoveMatch",
10815b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10825b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
10835b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_remove_match },
10845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetNameOwner",
10855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_service_owner },
10885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetConnectionUnixUser",
10895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
10915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_connection_unix_user },
10925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetConnectionUnixProcessID",
10935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
10945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
10955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_connection_unix_process_id },
10965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "ReloadConfig",
10975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
10985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
10995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_reload_config }
110029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
110129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
110241f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonstatic dbus_bool_t
1103030cc1e53c6216853e08e27b92f72db80d001873Colin Walterswrite_args_for_direction (DBusString *xml,
1104030cc1e53c6216853e08e27b92f72db80d001873Colin Walters			  const char *signature,
1105030cc1e53c6216853e08e27b92f72db80d001873Colin Walters			  dbus_bool_t in)
1106030cc1e53c6216853e08e27b92f72db80d001873Colin Walters{
1107030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  DBusTypeReader typereader;
1108030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  DBusString sigstr;
1109030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  int current_type;
1110030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1111030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  _dbus_string_init_const (&sigstr, signature);
1112030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  _dbus_type_reader_init_types_only (&typereader, &sigstr, 0);
1113030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1114030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  while ((current_type = _dbus_type_reader_get_current_type (&typereader)) != DBUS_TYPE_INVALID)
1115030cc1e53c6216853e08e27b92f72db80d001873Colin Walters    {
1116030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      const DBusString *subsig;
1117030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      int start, len;
1118030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1119030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      _dbus_type_reader_get_signature (&typereader, &subsig, &start, &len);
1120030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      if (!_dbus_string_append_printf (xml, "      <arg direction=\"%s\" type=\"%s\"/>\n", in ? "in" : "out", _dbus_string_get_const_data_len (subsig, start, len)))
1121030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
1122030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1123030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      _dbus_type_reader_next (&typereader);
1124030cc1e53c6216853e08e27b92f72db80d001873Colin Walters    }
1125030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  return TRUE;
1126030cc1e53c6216853e08e27b92f72db80d001873Colin Walters oom:
1127030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  return FALSE;
1128030cc1e53c6216853e08e27b92f72db80d001873Colin Walters}
1129030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1130030cc1e53c6216853e08e27b92f72db80d001873Colin Waltersstatic dbus_bool_t
113141f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonbus_driver_handle_introspect (DBusConnection *connection,
113241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                              BusTransaction *transaction,
113341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                              DBusMessage    *message,
113441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                              DBusError      *error)
113541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington{
113641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  DBusString xml;
113741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  DBusMessage *reply;
113841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  const char *v_STRING;
113985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  int i;
114041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
114141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_verbose ("Introspect() on bus driver\n");
114241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
114341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
114441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
114541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  reply = NULL;
114641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
114741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! dbus_message_get_args (message, error,
114841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington			       DBUS_TYPE_INVALID))
114941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
115041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
115141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      return FALSE;
115241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
115341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
115441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_init (&xml))
115541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
115641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      BUS_SET_OOM (error);
115741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      return FALSE;
115841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
115941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
116041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE))
116141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
116241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "<node>\n"))
116341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
1164248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!_dbus_string_append_printf (&xml, "  <interface name=\"%s\">\n", DBUS_INTERFACE_INTROSPECTABLE))
116541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
116641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "    <method name=\"Introspect\">\n"))
116741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
11683dea5c183f65c3f924fb442bf606dfeb50f028a4Colin Walters  if (!_dbus_string_append_printf (&xml, "      <arg name=\"data\" direction=\"out\" type=\"%s\"/>\n", DBUS_TYPE_STRING_AS_STRING))
116941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
117041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "    </method>\n"))
117141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
117241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "  </interface>\n"))
117385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    goto oom;
117485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
117585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  if (!_dbus_string_append_printf (&xml, "  <interface name=\"%s\">\n",
1176248895207dc15914ac7970a6d1431308075dca1dColin Walters                                   DBUS_INTERFACE_DBUS))
117785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    goto oom;
117885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
117985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  i = 0;
118085fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
118185fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    {
1182030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
118385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      if (!_dbus_string_append_printf (&xml, "    <method name=\"%s\">\n",
118485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington                                       message_handlers[i].name))
118585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington        goto oom;
118685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
1187030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      if (!write_args_for_direction (&xml, message_handlers[i].in_args, TRUE))
1188030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
1189030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1190030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      if (!write_args_for_direction (&xml, message_handlers[i].out_args, FALSE))
1191030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
119285fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
119385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      if (!_dbus_string_append (&xml, "    </method>\n"))
1194030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
119585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
119685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      ++i;
119785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    }
119885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
119985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  if (!_dbus_string_append (&xml, "  </interface>\n"))
120041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
120141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
120241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "</node>\n"))
120341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
120441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
120541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  reply = dbus_message_new_method_return (message);
120641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (reply == NULL)
120741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
120841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
120941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  v_STRING = _dbus_string_get_const_data (&xml);
121041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! dbus_message_append_args (reply,
121141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                  DBUS_TYPE_STRING, &v_STRING,
121241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                  DBUS_TYPE_INVALID))
121341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
121441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
121541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! bus_transaction_send_from_driver (transaction, connection, reply))
121641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
121741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
121841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  dbus_message_unref (reply);
121941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_string_free (&xml);
122041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
122141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  return TRUE;
122241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
122341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington oom:
122441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  BUS_SET_OOM (error);
122541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
122641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (reply)
122741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    dbus_message_unref (reply);
122841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
122941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_string_free (&xml);
123041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
123141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  return FALSE;
123241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington}
123341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
123429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
123539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection,
123629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
123729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			   DBusMessage    *message,
123829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error)
123939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
124041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  const char *name, *sender, *interface;
124129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int i;
124290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
124390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
124468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
124568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
124668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
124768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
124868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      return TRUE; /* we just ignore this */
124968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
125068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
125141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (dbus_message_is_method_call (message,
1252248895207dc15914ac7970a6d1431308075dca1dColin Walters                                   DBUS_INTERFACE_INTROSPECTABLE,
125341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                   "Introspect"))
125441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    return bus_driver_handle_introspect (connection, transaction, message, error);
125541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
125641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  interface = dbus_message_get_interface (message);
125741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (interface == NULL)
1258248895207dc15914ac7970a6d1431308075dca1dColin Walters    interface = DBUS_INTERFACE_DBUS;
125941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
126068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (dbus_message_get_member (message) != NULL);
126141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
126268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  name = dbus_message_get_member (message);
126368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  sender = dbus_message_get_sender (message);
126429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
126541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (strcmp (interface,
1266248895207dc15914ac7970a6d1431308075dca1dColin Walters              DBUS_INTERFACE_DBUS) != 0)
126768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
126868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got message to unknown interface \"%s\"\n",
126941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                     interface);
127068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      goto unknown;
127168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
127268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
127368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("Driver got a method call: %s\n",
127468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington		 dbus_message_get_member (message));
127539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
1276e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  /* security checks should have kept this from getting here */
127768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0);
1278777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
127929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  i = 0;
128029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
128129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
128229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (strcmp (message_handlers[i].name, name) == 0)
128329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
12845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington          _dbus_verbose ("Found driver handler for %s\n", name);
12855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
12865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington          if (!dbus_message_has_signature (message, message_handlers[i].in_args))
12875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington            {
12885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
12895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _dbus_verbose ("Call to %s has wrong args (%s, expected %s)\n",
12905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                             name, dbus_message_get_signature (message),
12915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                             message_handlers[i].in_args);
12925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
12935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
12945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              "Call to %s has wrong args (%s, expected %s)\n",
12955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              name, dbus_message_get_signature (message),
12965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              message_handlers[i].in_args);
12975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
12985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              return FALSE;
12995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington            }
13005b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
130129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if ((* message_handlers[i].handler) (connection, transaction, message, error))
1302eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1303eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1304eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler succeeded\n");
1305eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return TRUE;
1306eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
130729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          else
1308eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1309eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
1310eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler returned failure\n");
1311eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return FALSE;
1312eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
131329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
131429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
131529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      ++i;
131629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
131729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
131868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington unknown:
131968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("No driver handler for message \"%s\"\n",
132068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                 name);
1321eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
13221d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD,
132329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  "%s does not understand message %s",
1324248895207dc15914ac7970a6d1431308075dca1dColin Walters                  DBUS_SERVICE_DBUS, name);
132529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
132629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return FALSE;
1327ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
1328ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
1329ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid
1330ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection)
1331ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
133229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* FIXME Does nothing for now, should unregister the connection
133329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * with the bus driver.
133429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
133539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
1336