1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
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
8b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering *
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.
18b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering *
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
21dc33f4f7749ed303374ebdf00e48ea8a471afd25Tobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */
24aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
25dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
26f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h"
27aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h"
28aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h"
2939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
30aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h"
316c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters#include "selinux.h"
32a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
3302dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
34aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h>
3539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
36edecaa4abcc87712d470b9dc0f2d124417b3eebfColin Walters#include <dbus/dbus-message.h>
37030cc1e53c6216853e08e27b92f72db80d001873Colin Walters#include <dbus/dbus-marshal-recursive.h>
38aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h>
39aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusMessage    *hello_message,
4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    BusTransaction *transaction,
4329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusError      *error);
4429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
4685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieubus_driver_send_service_owner_changed (const char     *service_name,
4785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       const char     *old_owner,
4885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       const char     *new_owner,
4985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       BusTransaction *transaction,
5085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       DBusError      *error)
51a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
5239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  DBusMessage *message;
5329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *null_service;
5590ed1d84588a84697051e643175452c50d682eceHavoc Pennington
5690ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  null_service = "";
598873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  _dbus_verbose ("sending name owner changed: %s [%s -> %s]\n",
60b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering                 service_name,
61b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering                 old_owner ? old_owner : null_service,
6285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                 new_owner ? new_owner : null_service);
633f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson
64248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
65248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
668873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameOwnerChanged");
67b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
7029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
7129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
7229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
73b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
74248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
7585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto oom;
7685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
7785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (!dbus_message_append_args (message,
789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, old_owner ? &old_owner : &null_service,
809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, new_owner ? &new_owner : &null_service,
81e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
8285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto oom;
8339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
84dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_assert (dbus_message_has_signature (message, "sss"));
85b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
86a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = bus_dispatch_matches (transaction, NULL, NULL, message, error);
8729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (message);
8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
90a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu oom:
92a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  dbus_message_unref (message);
9385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  BUS_SET_OOM (error);
9485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  return FALSE;
95a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
96a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
98ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection,
9929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			      const char     *service_name,
10029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              BusTransaction *transaction,
10129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusError      *error)
102ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
103ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
104ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
10590ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
106b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
107248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
108248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
1098873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameLost");
110b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
11429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
11529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
116b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
117b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
118b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
1199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
120e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
12229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
12329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
12429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
12529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
127777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
13229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
13629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
138ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
139ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
141ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection,
14229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const char     *service_name,
14329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
14429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
145ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
146ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
147ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
14890ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
149b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
150248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
151248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
1528873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameAcquired");
153c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
15729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
15829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
159b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
160b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
161b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
1629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
163e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
16729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
170777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
17929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
18029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
181ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
182ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
183aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t
1846ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry,
1856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                           DBusString  *str)
186aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
187d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  /* We never want to use the same unique client name twice, because
188d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * we want to guarantee that if you send a message to a given unique
189d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * name, you always get the same application. So we use two numbers
190d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * for INT_MAX * INT_MAX combinations, should be pretty safe against
191d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * wraparound.
192d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   */
193b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  /* FIXME these should be in BusRegistry rather than static vars */
194d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_major_number = 0;
195d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_minor_number = 0;
196d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  int len;
197b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
198aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  len = _dbus_string_get_length (str);
199b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
200d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  while (TRUE)
201aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    {
202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* start out with 1-0, go to 1-1, 1-2, 1-3,
203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       * up to 1-MAXINT, then 2-0, 2-1, etc.
204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       */
205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (next_minor_number <= 0)
206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        {
207d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_major_number += 1;
208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_minor_number = 0;
209d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          if (next_major_number <= 0)
210d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington            _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
211d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        }
212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_major_number > 0);
214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_minor_number >= 0);
215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* appname:MAJOR-MINOR */
217b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, ":"))
219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
220b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_major_number))
222d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
22475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (!_dbus_string_append (str, "."))
225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
226b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_minor_number))
228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
229d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
230d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      next_minor_number += 1;
231b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
232aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      /* Check if a client with the name exists */
2336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (bus_registry_lookup (registry, str) == NULL)
234aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson	break;
235aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
236d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* drop the number again, try the next one. */
237aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      _dbus_string_set_length (str, len);
238aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    }
239aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
240aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
241aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
242aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
24329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
244a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection,
24529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         BusTransaction *transaction,
24629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusMessage    *message,
24729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusError      *error)
248aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
249aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString unique_name;
250aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusService *service;
25129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
2526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
253983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  BusConnections *connections;
25490ed1d84588a84697051e643175452c50d682eceHavoc Pennington
25590ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
256983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
2571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (bus_connection_is_active (connection))
2581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
2591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      /* We already handled an Hello message for this connection. */
2601658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      dbus_set_error (error, DBUS_ERROR_FAILED,
2611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                      "Already handled an Hello message");
2621658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      return FALSE;
2631658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
2641658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* Note that when these limits are exceeded we don't disconnect the
266983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * connection; we just sort of leave it hanging there until it times
267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * out or disconnects itself or is dropped due to the max number of
268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * incomplete connections. It's even OK if the connection wants to
269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * retry the hello message, we support that.
270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   */
271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  connections = bus_connection_get_connections (connection);
272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  if (!bus_connections_check_limits (connections, connection,
273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                                     error))
274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
275983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
276983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
277983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
278b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
279fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&unique_name))
28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
284f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
2866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
2876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
288b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!create_unique_client_name (registry, &unique_name))
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
29229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
29497ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
295e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (!bus_connection_complete (connection, &unique_name, error))
29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
297e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
300b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message,
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                bus_connection_get_name (connection)))
30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
307b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
30829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_driver_send_welcome_message (connection, message, transaction, error))
30929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
31097ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
311aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  /* Create the service */
3126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_ensure (registry,
3131a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                 &unique_name, connection, 0, transaction, error);
31429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
31529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
316b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
317a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert (bus_connection_is_active (connection));
31829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
319b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
32029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0:
321aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_free (&unique_name);
32229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
323aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
324aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
32529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
326aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection,
32729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *hello_message,
32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
32929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
330aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
331aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusMessage *welcome;
332aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  const char *name;
33390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
33490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
335b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
336aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  name = bus_connection_get_name (connection);
337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (name != NULL);
338b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
339b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  welcome = dbus_message_new_method_return (hello_message);
34029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (welcome == NULL)
34129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
345b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (welcome,
3479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &name,
348e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
3555b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  _dbus_assert (dbus_message_has_signature (welcome, DBUS_TYPE_STRING_AS_STRING));
356b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
357777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, welcome))
35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
368aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
369aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
371a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection,
37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *message,
37429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
375a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
376a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *reply;
37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int len;
378a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  char **services;
3796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int i;
3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessageIter iter;
3829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessageIter sub;
38390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
38490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
385b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
387b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
388b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
39329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
394a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
3956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_registry_list_services (registry, &services, &len))
39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
40029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
4019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
40231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_message_iter_init_append (reply, &iter);
403b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
4059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                         DBUS_TYPE_STRING_AS_STRING,
4069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                         &sub))
40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free_string_array (services);
40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
41339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
414970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington  {
415970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington    /* Include the bus driver in the list */
416248895207dc15914ac7970a6d1431308075dca1dColin Walters    const char *v_STRING = DBUS_SERVICE_DBUS;
417970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington    if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
418970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington                                         &v_STRING))
419970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington      {
420970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        dbus_free_string_array (services);
421970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        dbus_message_unref (reply);
422970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        BUS_SET_OOM (error);
423970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington        return FALSE;
424970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington      }
425970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington  }
426b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  i = 0;
4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (i < len)
4299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
4309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                           &services[i]))
4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          dbus_free_string_array (services);
4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          dbus_message_unref (reply);
4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          BUS_SET_OOM (error);
4369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return FALSE;
4379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++i;
4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4417628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_free_string_array (services);
4427628b541258d906e27e2000a402ed2d02383479cJohn (J
4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_iter_close_container (&iter, &sub))
4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      dbus_message_unref (reply);
4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      BUS_SET_OOM (error);
4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      return FALSE;
4489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
449b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4507628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!bus_transaction_send_from_driver (transaction, connection, reply))
4517628b541258d906e27e2000a402ed2d02383479cJohn (J    {
4527628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (reply);
4537628b541258d906e27e2000a402ed2d02383479cJohn (J      BUS_SET_OOM (error);
4547628b541258d906e27e2000a402ed2d02383479cJohn (J      return FALSE;
4557628b541258d906e27e2000a402ed2d02383479cJohn (J    }
4567628b541258d906e27e2000a402ed2d02383479cJohn (J  else
4577628b541258d906e27e2000a402ed2d02383479cJohn (J    {
4587628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (reply);
4597628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
4607628b541258d906e27e2000a402ed2d02383479cJohn (J    }
4617628b541258d906e27e2000a402ed2d02383479cJohn (J}
4627628b541258d906e27e2000a402ed2d02383479cJohn (J
4637628b541258d906e27e2000a402ed2d02383479cJohn (Jstatic dbus_bool_t
4647628b541258d906e27e2000a402ed2d02383479cJohn (Jbus_driver_handle_list_activatable_services (DBusConnection *connection,
4657628b541258d906e27e2000a402ed2d02383479cJohn (J					     BusTransaction *transaction,
4667628b541258d906e27e2000a402ed2d02383479cJohn (J					     DBusMessage    *message,
4677628b541258d906e27e2000a402ed2d02383479cJohn (J					     DBusError      *error)
4687628b541258d906e27e2000a402ed2d02383479cJohn (J{
4697628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusMessage *reply;
4707628b541258d906e27e2000a402ed2d02383479cJohn (J  int len;
4717628b541258d906e27e2000a402ed2d02383479cJohn (J  char **services;
4727628b541258d906e27e2000a402ed2d02383479cJohn (J  BusActivation *activation;
4737628b541258d906e27e2000a402ed2d02383479cJohn (J  int i;
4747628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusMessageIter iter;
4757628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusMessageIter sub;
4767628b541258d906e27e2000a402ed2d02383479cJohn (J
4777628b541258d906e27e2000a402ed2d02383479cJohn (J  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4787628b541258d906e27e2000a402ed2d02383479cJohn (J
4797628b541258d906e27e2000a402ed2d02383479cJohn (J  activation = bus_connection_get_activation (connection);
4807628b541258d906e27e2000a402ed2d02383479cJohn (J
4817628b541258d906e27e2000a402ed2d02383479cJohn (J  reply = dbus_message_new_method_return (message);
4827628b541258d906e27e2000a402ed2d02383479cJohn (J  if (reply == NULL)
4837628b541258d906e27e2000a402ed2d02383479cJohn (J    {
4847628b541258d906e27e2000a402ed2d02383479cJohn (J      BUS_SET_OOM (error);
4857628b541258d906e27e2000a402ed2d02383479cJohn (J      return FALSE;
4867628b541258d906e27e2000a402ed2d02383479cJohn (J    }
4877628b541258d906e27e2000a402ed2d02383479cJohn (J
4887628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!bus_activation_list_services (activation, &services, &len))
4897628b541258d906e27e2000a402ed2d02383479cJohn (J    {
4907628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (reply);
4917628b541258d906e27e2000a402ed2d02383479cJohn (J      BUS_SET_OOM (error);
4927628b541258d906e27e2000a402ed2d02383479cJohn (J      return FALSE;
4937628b541258d906e27e2000a402ed2d02383479cJohn (J    }
4947628b541258d906e27e2000a402ed2d02383479cJohn (J
4957628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_message_iter_init_append (reply, &iter);
4967628b541258d906e27e2000a402ed2d02383479cJohn (J
4977628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
4987628b541258d906e27e2000a402ed2d02383479cJohn (J					 DBUS_TYPE_STRING_AS_STRING,
4997628b541258d906e27e2000a402ed2d02383479cJohn (J					 &sub))
5007628b541258d906e27e2000a402ed2d02383479cJohn (J    {
5017628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_free_string_array (services);
5027628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (reply);
5037628b541258d906e27e2000a402ed2d02383479cJohn (J      BUS_SET_OOM (error);
5047628b541258d906e27e2000a402ed2d02383479cJohn (J      return FALSE;
5057628b541258d906e27e2000a402ed2d02383479cJohn (J    }
5067628b541258d906e27e2000a402ed2d02383479cJohn (J
5077628b541258d906e27e2000a402ed2d02383479cJohn (J  {
5087628b541258d906e27e2000a402ed2d02383479cJohn (J    /* Include the bus driver in the list */
5097628b541258d906e27e2000a402ed2d02383479cJohn (J    const char *v_STRING = DBUS_SERVICE_DBUS;
5107628b541258d906e27e2000a402ed2d02383479cJohn (J    if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
5117628b541258d906e27e2000a402ed2d02383479cJohn (J					 &v_STRING))
5127628b541258d906e27e2000a402ed2d02383479cJohn (J      {
5137628b541258d906e27e2000a402ed2d02383479cJohn (J	dbus_free_string_array (services);
5147628b541258d906e27e2000a402ed2d02383479cJohn (J	dbus_message_unref (reply);
5157628b541258d906e27e2000a402ed2d02383479cJohn (J	BUS_SET_OOM (error);
5167628b541258d906e27e2000a402ed2d02383479cJohn (J	return FALSE;
5177628b541258d906e27e2000a402ed2d02383479cJohn (J      }
5187628b541258d906e27e2000a402ed2d02383479cJohn (J  }
5197628b541258d906e27e2000a402ed2d02383479cJohn (J
5207628b541258d906e27e2000a402ed2d02383479cJohn (J  i = 0;
5217628b541258d906e27e2000a402ed2d02383479cJohn (J  while (i < len)
5227628b541258d906e27e2000a402ed2d02383479cJohn (J    {
5237628b541258d906e27e2000a402ed2d02383479cJohn (J      if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING,
5247628b541258d906e27e2000a402ed2d02383479cJohn (J					   &services[i]))
5257628b541258d906e27e2000a402ed2d02383479cJohn (J	{
5267628b541258d906e27e2000a402ed2d02383479cJohn (J	  dbus_free_string_array (services);
5277628b541258d906e27e2000a402ed2d02383479cJohn (J	  dbus_message_unref (reply);
5287628b541258d906e27e2000a402ed2d02383479cJohn (J	  BUS_SET_OOM (error);
5297628b541258d906e27e2000a402ed2d02383479cJohn (J	  return FALSE;
5307628b541258d906e27e2000a402ed2d02383479cJohn (J	}
5317628b541258d906e27e2000a402ed2d02383479cJohn (J      ++i;
5327628b541258d906e27e2000a402ed2d02383479cJohn (J    }
5337628b541258d906e27e2000a402ed2d02383479cJohn (J
53429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free_string_array (services);
5357628b541258d906e27e2000a402ed2d02383479cJohn (J
5367628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_message_iter_close_container (&iter, &sub))
5377628b541258d906e27e2000a402ed2d02383479cJohn (J    {
5387628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (reply);
5397628b541258d906e27e2000a402ed2d02383479cJohn (J      BUS_SET_OOM (error);
5407628b541258d906e27e2000a402ed2d02383479cJohn (J      return FALSE;
5417628b541258d906e27e2000a402ed2d02383479cJohn (J    }
5427628b541258d906e27e2000a402ed2d02383479cJohn (J
543777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
544a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    {
54529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
54629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
54729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
54929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
55129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
553a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    }
554a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
555a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
55629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
55734e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection,
55829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   BusTransaction *transaction,
55929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusMessage    *message,
56029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusError      *error)
561aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
562ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
563aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString service_name;
5649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
565b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  dbus_uint32_t service_reply;
5668a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu  dbus_uint32_t flags;
56729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
56990ed1d84588a84697051e643175452c50d682eceHavoc Pennington
57090ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
571b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
5726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
573b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
574c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson  if (!dbus_message_get_args (message, error,
57529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
57629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
577e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
57829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
579b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
58098ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington  _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
581b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
5826c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  retval = FALSE;
5836c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  reply = NULL;
584aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
585aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_init_const (&service_name, name);
586ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
5876be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!bus_registry_acquire_service (registry, connection,
5886be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_name, flags,
5896be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_reply, transaction,
5906be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     error))
5916be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    goto out;
592b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
593b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
59429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
598ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
59929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
6009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
60129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
60229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
60329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
60429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
605ba60374e251cca8fe351b7dd4def595069323885James Willcox
606777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
60729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
61129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
613b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
61429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
618b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering}
619aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
62029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
621b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueenbus_driver_handle_release_service (DBusConnection *connection,
622b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                   BusTransaction *transaction,
623b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                   DBusMessage    *message,
624b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                   DBusError      *error)
625b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen{
626b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  DBusMessage *reply;
627b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  DBusString service_name;
628b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  const char *name;
629b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  dbus_uint32_t service_reply;
630b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  dbus_bool_t retval;
631b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  BusRegistry *registry;
632b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
633b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
634b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
635b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  registry = bus_connection_get_registry (connection);
636b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
637b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!dbus_message_get_args (message, error,
638b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                              DBUS_TYPE_STRING, &name,
639b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                              DBUS_TYPE_INVALID))
640b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    return FALSE;
641b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
642b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  _dbus_verbose ("Trying to release name %s\n", name);
643b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
644b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  retval = FALSE;
645b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  reply = NULL;
646b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
647b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  _dbus_string_init_const (&service_name, name);
648b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
649b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!bus_registry_release_service (registry, connection,
650b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                     &service_name, &service_reply,
651b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                     transaction, error))
652b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    goto out;
653b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
654b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  reply = dbus_message_new_method_return (message);
655b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (reply == NULL)
656b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    {
657b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      BUS_SET_OOM (error);
658b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      goto out;
659b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    }
660b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
661b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
662b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    {
663b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      BUS_SET_OOM (error);
664b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      goto out;
665b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    }
666b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
667b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!bus_transaction_send_from_driver (transaction, connection, reply))
668b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    {
669b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      BUS_SET_OOM (error);
670b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      goto out;
671b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    }
672b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
673b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  retval = TRUE;
674b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
675b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen out:
676b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (reply)
677b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    dbus_message_unref (reply);
678b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  return retval;
679b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen}
680b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
681b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueenstatic dbus_bool_t
682ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection,
68329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
68429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage    *message,
68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
686ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
687ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
688ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusString service_name;
689ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
69062e465339a306fa564b69935da494dad6e1b474aHavoc Pennington  dbus_bool_t service_exists;
6919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
6936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
69490ed1d84588a84697051e643175452c50d682eceHavoc Pennington
69590ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
696b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
6976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
698b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
69929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
70029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
701e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
70229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
703ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
70429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
7052091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge
706248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
7072091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
7082091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = TRUE;
7092091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
7102091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge  else
7112091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
7122091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      _dbus_string_init_const (&service_name, name);
7132091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service = bus_registry_lookup (registry, &service_name);
7142091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = service != NULL;
7152091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
716b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
717b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
71829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
71929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
72029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
72129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
72229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
72329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
72429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
7259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_BOOLEAN, &service_exists,
72629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
72729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
72829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
72929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
73029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
73129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
732777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
73329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
73429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
73529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
73629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
73729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
73829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
739b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
74029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
74129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
74229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
74329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
74429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
745aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
74639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
74729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
748f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection,
74929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    BusTransaction *transaction,
75029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusMessage    *message,
75129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusError      *error)
752f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{
753f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  dbus_uint32_t flags;
7549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
75529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
7566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
7576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
75890ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
759b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
7606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  activation = bus_connection_get_activation (connection);
761b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
76229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
76329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
76429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
765e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
766eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
767eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
7688873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
769eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      return FALSE;
770eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
771f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
77229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
773f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
77493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
775e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                        message, name, error))
776eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
777eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
778eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("bus_activation_activate_service() failed\n");
779eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      goto out;
780eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
78129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
78229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
783b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
78429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
78529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
786f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson}
787f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
788a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
789a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_ack_reply (DBusConnection *connection,
790a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                BusTransaction *transaction,
791a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusMessage    *message,
792a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusError      *error)
793a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
794a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusMessage *reply;
795a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
796edecaa4abcc87712d470b9dc0f2d124417b3eebfColin Walters  if (dbus_message_get_no_reply (message))
797edecaa4abcc87712d470b9dc0f2d124417b3eebfColin Walters    return TRUE;
798edecaa4abcc87712d470b9dc0f2d124417b3eebfColin Walters
799a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  reply = dbus_message_new_method_return (message);
800a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (reply == NULL)
801a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
802a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
803a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
804a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
805a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
806a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
807a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
808a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
809a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_message_unref (reply);
810a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
811a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
812a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
813a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_message_unref (reply);
814b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
815a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
816a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
817a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
818a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
81937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strodebus_driver_handle_update_activation_environment (DBusConnection *connection,
82037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode                                                 BusTransaction *transaction,
82137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode                                                 DBusMessage    *message,
82237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode                                                 DBusError      *error)
82337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode{
82437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  dbus_bool_t retval;
82537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  BusActivation *activation;
82637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  DBusMessageIter iter;
82737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  DBusMessageIter dict_iter;
82837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  DBusMessageIter dict_entry_iter;
82937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  int msg_type;
83037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  int array_type;
83137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  int key_type;
83237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  DBusList *keys, *key_link;
83337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  DBusList *values, *value_link;
83437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
83537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
83637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
83737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  activation = bus_connection_get_activation (connection);
83837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
83937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  dbus_message_iter_init (message, &iter);
84037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
84137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  /* The message signature has already been checked for us,
84237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   * so let's just assert it's right.
84337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   */
84437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  msg_type = dbus_message_iter_get_arg_type (&iter);
84537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
84637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  _dbus_assert (msg_type == DBUS_TYPE_ARRAY);
84737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
84837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  dbus_message_iter_recurse (&iter, &dict_iter);
84937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
85037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  retval = FALSE;
85137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
85237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  /* Then loop through the sent dictionary, add the location of
85337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   * the environment keys and values to lists. The result will
85437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   * be in reverse order, so we don't have to constantly search
85537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   * for the end of the list in a loop.
85637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   */
85737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  keys = NULL;
85837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  values = NULL;
85937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  while ((array_type = dbus_message_iter_get_arg_type (&dict_iter)) == DBUS_TYPE_DICT_ENTRY)
86037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    {
86137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      dbus_message_iter_recurse (&dict_iter, &dict_entry_iter);
86237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
86337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      while ((key_type = dbus_message_iter_get_arg_type (&dict_entry_iter)) == DBUS_TYPE_STRING)
86437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode        {
86537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          char *key;
86637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          char *value;
86737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          int value_type;
86837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
86937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          dbus_message_iter_get_basic (&dict_entry_iter, &key);
87037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          dbus_message_iter_next (&dict_entry_iter);
87137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
87237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          value_type = dbus_message_iter_get_arg_type (&dict_entry_iter);
87337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
87437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          if (value_type != DBUS_TYPE_STRING)
87537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode            break;
87637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
87737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          dbus_message_iter_get_basic (&dict_entry_iter, &value);
87837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
87937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          if (!_dbus_list_append (&keys, key))
88037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode            {
88137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode              BUS_SET_OOM (error);
88237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode              break;
88337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode            }
88437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
88537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          if (!_dbus_list_append (&values, value))
88637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode            {
88737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode              BUS_SET_OOM (error);
88837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode              break;
88937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode            }
89037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
89137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          dbus_message_iter_next (&dict_entry_iter);
89237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode        }
89337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
89437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      if (key_type != DBUS_TYPE_INVALID)
89537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode        break;
89637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
89737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      dbus_message_iter_next (&dict_iter);
89837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    }
89937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
90037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  if (array_type != DBUS_TYPE_INVALID)
90137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    goto out;
90237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
90337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  _dbus_assert (_dbus_list_get_length (&keys) == _dbus_list_get_length (&values));
90437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
90537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  key_link = keys;
90637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  value_link = values;
90737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  while (key_link != NULL)
90837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  {
90937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      const char *key;
91037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      const char *value;
91137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
91237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      key = key_link->data;
91337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      value = value_link->data;
91437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
91537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      if (!bus_activation_set_environment_variable (activation,
91637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode                                                    key, value, error))
91737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      {
91837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          _DBUS_ASSERT_ERROR_IS_SET (error);
91937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          _dbus_verbose ("bus_activation_set_environment_variable() failed\n");
92037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode          break;
92137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      }
92237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      key_link = _dbus_list_get_next_link (&keys, key_link);
92337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode      value_link = _dbus_list_get_next_link (&values, value_link);
92437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  }
92537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
92637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  /* FIXME: We can fail early having set only some of the environment variables,
92737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   * (because of OOM failure).  It's sort of hard to fix and it doesn't really
92837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   * matter, so we're punting for now.
92937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode   */
93037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  if (key_link != NULL)
93137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    goto out;
93237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
93337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  if (!send_ack_reply (connection, transaction,
93437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode                       message, error))
93537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    goto out;
93637853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
93737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  retval = TRUE;
93837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
93937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode out:
94037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  _dbus_list_clear (&keys);
94137853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  _dbus_list_clear (&values);
94237853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  return retval;
94337853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode}
94437853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode
94537853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strodestatic dbus_bool_t
946a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_add_match (DBusConnection *connection,
947a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             BusTransaction *transaction,
948a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusMessage    *message,
949a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusError      *error)
950a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
951a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
9529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
953a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
954a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
955b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
956a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
957a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
958a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
959a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
960a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
961a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (bus_connection_get_n_match_rules (connection) >=
962a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction)))
963a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
964a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
965a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "Connection \"%s\" is not allowed to add more match rules "
966a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(increase limits in configuration file if required)",
967a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_is_active (connection) ?
968a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_get_name (connection) :
969a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(inactive)");
970a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
971a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
972b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
973a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
974a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
975a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
976a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
977a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to AddMatch\n");
978a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
979a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
980a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
981a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
982a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
983a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
984a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
985a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
986a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
987a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
988a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
989a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_add_rule (matchmaker, rule))
990a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
991a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
992a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
993a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
994a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
995a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
996a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
997a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
998a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_matchmaker_remove_rule (matchmaker, rule);
999a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
1000a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1001b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1002a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
1003b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1004a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
1005a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1006a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
1007a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
1008a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
1009a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
1010a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
1011a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1012a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1013a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
1014a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_remove_match (DBusConnection *connection,
1015a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                BusTransaction *transaction,
1016a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusMessage    *message,
1017a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusError      *error)
1018a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
1019a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
10209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
1021a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
1022a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
1023b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1024a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1025a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1026a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
1027a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
1028b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1029a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
1030a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
1031a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
1032a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1033a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to RemoveMatch\n");
1034a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
1035a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1036a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1037a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
1038a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1039a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
1040a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
1041a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
1042a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1043a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* Send the ack before we remove the rule, since the ack is undone
1044a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   * on transaction cancel, but rule removal isn't.
1045a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   */
1046a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
1047a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
1048a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
1049b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1050a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
1051a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1052a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error))
1053a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
1054a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1055a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
1056b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1057a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
1058a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1059a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
1060a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
1061a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
1062a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
1063a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
1064a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1065a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1066a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieustatic dbus_bool_t
1067a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieubus_driver_handle_get_service_owner (DBusConnection *connection,
1068a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     BusTransaction *transaction,
1069a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusMessage    *message,
1070a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusError      *error)
1071a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu{
10729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
1073a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  const char *base_name;
1074a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusString str;
1075a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusRegistry *registry;
1076a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusService *service;
1077a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusMessage *reply;
1078b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1079a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1080a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1081a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  registry = bus_connection_get_registry (connection);
1082a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1083a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  text = NULL;
1084a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = NULL;
1085a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1086a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_get_args (message, error,
1087a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_STRING, &text,
1088a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_INVALID))
1089a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
1090a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1091a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _dbus_string_init_const (&str, text);
1092a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  service = bus_registry_lookup (registry, &str);
109341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (service == NULL &&
1094248895207dc15914ac7970a6d1431308075dca1dColin Walters      _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS))
109541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
109641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      /* ORG_FREEDESKTOP_DBUS owns itself */
1097248895207dc15914ac7970a6d1431308075dca1dColin Walters      base_name = DBUS_SERVICE_DBUS;
109841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
109941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  else if (service == NULL)
1100a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
1101b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      dbus_set_error (error,
110241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                      DBUS_ERROR_NAME_HAS_NO_OWNER,
110341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                      "Could not get owner of name '%s': no such name", text);
1104a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
1105a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
110641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  else
1107a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
11081a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      base_name = bus_connection_get_name (bus_service_get_primary_owners_connection (service));
110941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      if (base_name == NULL)
111041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington        {
111141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          /* FIXME - how is this error possible? */
111241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          dbus_set_error (error,
111341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                          DBUS_ERROR_FAILED,
111441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                          "Could not determine unique name for '%s'", text);
111541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          goto failed;
111641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington        }
1117b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_assert (*base_name == ':');
1118a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
111941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
112041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_assert (base_name != NULL);
1121a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1122a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = dbus_message_new_method_return (message);
1123a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply == NULL)
1124a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
1125a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1126b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  if (! dbus_message_append_args (reply,
11279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington				  DBUS_TYPE_STRING, &base_name,
1128a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				  DBUS_TYPE_INVALID))
1129a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
1130b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1131a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
1132a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
1133a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1134a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  dbus_message_unref (reply);
1135a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1136a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return TRUE;
1137a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1138a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu oom:
1139a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BUS_SET_OOM (error);
1140a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
1141a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu failed:
1142a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
1143a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply)
1144a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    dbus_message_unref (reply);
1145a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return FALSE;
1146a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu}
1147a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
11481919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergstatic dbus_bool_t
11491a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (Jbus_driver_handle_list_queued_owners (DBusConnection *connection,
11501a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J				      BusTransaction *transaction,
11511a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J				      DBusMessage    *message,
11521a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J				      DBusError      *error)
11531a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J{
11541a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  const char *text;
11551a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  DBusList *base_names;
11561a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  DBusList *link;
11571a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  DBusString str;
11581a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  BusRegistry *registry;
11591a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  BusService *service;
11601a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  DBusMessage *reply;
11611a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  DBusMessageIter iter, array_iter;
11621a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  char *dbus_service_name = DBUS_SERVICE_DBUS;
1163b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
11641a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
11651a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
11661a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  registry = bus_connection_get_registry (connection);
11671a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
11681a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  base_names = NULL;
11691a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  text = NULL;
11701a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  reply = NULL;
11711a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
11721a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (! dbus_message_get_args (message, error,
11731a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J			       DBUS_TYPE_STRING, &text,
11741a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J			       DBUS_TYPE_INVALID))
11751a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      goto failed;
11761a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
11771a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  _dbus_string_init_const (&str, text);
11781a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  service = bus_registry_lookup (registry, &str);
11791a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (service == NULL &&
11801a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS))
11811a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    {
11821a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      /* ORG_FREEDESKTOP_DBUS owns itself */
11831a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      if (! _dbus_list_append (&base_names, dbus_service_name))
11841a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J        goto oom;
11851a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    }
11861a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  else if (service == NULL)
11871a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    {
1188b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      dbus_set_error (error,
11891a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                      DBUS_ERROR_NAME_HAS_NO_OWNER,
11901a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                      "Could not get owners of name '%s': no such name", text);
11911a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      goto failed;
11921a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    }
11931a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  else
11941a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    {
1195b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      if (!bus_service_list_queued_owners (service,
11961a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                           &base_names,
11971a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                           error))
11981a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J        goto failed;
11991a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    }
12001a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12011a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  _dbus_assert (base_names != NULL);
12021a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12031a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  reply = dbus_message_new_method_return (message);
12041a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (reply == NULL)
12051a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    goto oom;
12061a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12071a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  dbus_message_iter_init_append (reply, &iter);
12081a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (!dbus_message_iter_open_container (&iter,
12091a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                         DBUS_TYPE_ARRAY,
12101a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                         DBUS_TYPE_STRING_AS_STRING,
12111a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                         &array_iter))
12121a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    goto oom;
1213b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
12141a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  link = _dbus_list_get_first_link (&base_names);
12151a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  while (link != NULL)
12161a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    {
12171a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      char *uname;
12181a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12191a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      _dbus_assert (link->data != NULL);
12201a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      uname = (char *)link->data;
1221b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1222b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      if (!dbus_message_iter_append_basic (&array_iter,
12231a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                           DBUS_TYPE_STRING,
12241a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J                                           &uname))
12251a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J        goto oom;
12261a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12271a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J      link = _dbus_list_get_next_link (&base_names, link);
12281a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    }
12291a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12301a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (! dbus_message_iter_close_container (&iter, &array_iter))
12311a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    goto oom;
1232b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1233b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
12341a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (! bus_transaction_send_from_driver (transaction, connection, reply))
12351a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    goto oom;
12361a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12371a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  dbus_message_unref (reply);
12381a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12391a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  return TRUE;
12401a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12411a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J oom:
12421a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  BUS_SET_OOM (error);
12431a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12441a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J failed:
12451a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  _DBUS_ASSERT_ERROR_IS_SET (error);
12461a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (reply)
12471a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    dbus_message_unref (reply);
12481a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12491a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  if (base_names)
12501a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    _dbus_list_clear (&base_names);
12511a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12521a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  return FALSE;
12531a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J}
12541a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J
12551a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (Jstatic dbus_bool_t
12562779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieubus_driver_handle_get_connection_unix_user (DBusConnection *connection,
12572779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            BusTransaction *transaction,
12582779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusMessage    *message,
12592779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusError      *error)
12602779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{
12619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service;
12622779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusString str;
12632779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusRegistry *registry;
12642779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusService *serv;
12652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusConnection *conn;
12662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusMessage *reply;
12672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  unsigned long uid;
12689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t uid32;
12692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12702779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
12712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  registry = bus_connection_get_registry (connection);
12732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  service = NULL;
12752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = NULL;
12762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12772779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_get_args (message, error,
12782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_STRING, &service,
12792779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_INVALID))
12802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
12812779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_verbose ("asked for UID of connection %s\n", service);
12832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12842779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_string_init_const (&str, service);
12852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  serv = bus_registry_lookup (registry, &str);
12862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (serv == NULL)
12872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
1288b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      dbus_set_error (error,
12898873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      DBUS_ERROR_NAME_HAS_NO_OWNER,
12908873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      "Could not get UID of name '%s': no such name", service);
12912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
12922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
12932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12941a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  conn = bus_service_get_primary_owners_connection (serv);
12952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = dbus_message_new_method_return (message);
12972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply == NULL)
12982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
12992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!dbus_connection_get_unix_user (conn, &uid))
13012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
13022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
13032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      DBUS_ERROR_FAILED,
13042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      "Could not determine UID for '%s'", service);
13052779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
13062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
13072779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  uid32 = uid;
13092779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_append_args (reply,
13109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                  DBUS_TYPE_UINT32, &uid32,
13112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_INVALID))
13122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
13132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
13152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
13162779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13172779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_message_unref (reply);
13182779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13192779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return TRUE;
13202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13212779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu oom:
13222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BUS_SET_OOM (error);
13232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13242779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu failed:
13252779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
13262779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply)
13272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    dbus_message_unref (reply);
13282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return FALSE;
13292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu}
13302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
13312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t
1332c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenbus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
1333c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  BusTransaction *transaction,
1334c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusMessage    *message,
1335c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusError      *error)
1336c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{
13379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service;
1338c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusString str;
1339c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusRegistry *registry;
1340c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusService *serv;
1341c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusConnection *conn;
1342c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusMessage *reply;
1343c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  unsigned long pid;
13449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t pid32;
1345c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1346c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1347c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1348c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  registry = bus_connection_get_registry (connection);
1349c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1350c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  service = NULL;
1351c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = NULL;
1352c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1353c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_get_args (message, error,
1354c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_STRING, &service,
1355c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_INVALID))
1356c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
1357c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1358c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_verbose ("asked for PID of connection %s\n", service);
1359c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1360c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_string_init_const (&str, service);
1361c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  serv = bus_registry_lookup (registry, &str);
1362c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (serv == NULL)
1363c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1364b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      dbus_set_error (error,
13658873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      DBUS_ERROR_NAME_HAS_NO_OWNER,
13668873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      "Could not get PID of name '%s': no such name", service);
1367c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
1368c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1369c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
13701a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  conn = bus_service_get_primary_owners_connection (serv);
1371c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1372c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = dbus_message_new_method_return (message);
1373c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply == NULL)
1374c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1375c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1376c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!dbus_connection_get_unix_process_id (conn, &pid))
1377c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1378c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
1379c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN,
1380c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      "Could not determine PID for '%s'", service);
1381c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
1382c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1383c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
13849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  pid32 = pid;
1385c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_append_args (reply,
13869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                  DBUS_TYPE_UINT32, &pid32,
1387c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_INVALID))
1388c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1389c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1390c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! bus_transaction_send_from_driver (transaction, connection, reply))
1391c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1392c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1393c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_message_unref (reply);
1394c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1395c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return TRUE;
1396c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1397c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen oom:
1398c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BUS_SET_OOM (error);
1399c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1400c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen failed:
1401c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_SET (error);
1402c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply)
1403c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    dbus_message_unref (reply);
1404c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return FALSE;
1405c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen}
1406c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1407c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t
1408ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Waltersbus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
1409ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters					      BusTransaction *transaction,
1410ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters					      DBusMessage    *message,
1411ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters					      DBusError      *error)
1412ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters{
1413ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  const char *service;
1414ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  DBusString str;
1415ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  BusRegistry *registry;
1416ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  BusService *serv;
1417ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  DBusConnection *conn;
1418ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  DBusMessage *reply;
14194e4f0de8cc8c3127641013fd833349dab34b676bColin Walters  void *data = NULL;
1420ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  dbus_uint32_t data_size;
1421ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1422ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1423ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1424ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  registry = bus_connection_get_registry (connection);
1425ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1426ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  service = NULL;
1427ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  reply = NULL;
1428ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1429ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (! dbus_message_get_args (message, error,
1430ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters			       DBUS_TYPE_STRING, &service,
1431ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters			       DBUS_TYPE_INVALID))
1432ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      goto failed;
1433ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1434ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  _dbus_verbose ("asked for audit session data for connection %s\n", service);
1435ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1436ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  _dbus_string_init_const (&str, service);
1437ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  serv = bus_registry_lookup (registry, &str);
1438ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (serv == NULL)
1439ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    {
1440b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      dbus_set_error (error,
1441ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters		      DBUS_ERROR_NAME_HAS_NO_OWNER,
1442ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters		      "Could not get audit session data for name '%s': no such name", service);
1443ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      goto failed;
1444ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    }
1445ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1446ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  conn = bus_service_get_primary_owners_connection (serv);
1447ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1448ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  reply = dbus_message_new_method_return (message);
1449ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (reply == NULL)
1450ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    goto oom;
1451ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1452ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (!dbus_connection_get_adt_audit_session_data (conn, &data, &data_size) || data == NULL)
1453ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    {
1454ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      dbus_set_error (error,
1455ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                      DBUS_ERROR_ADT_AUDIT_DATA_UNKNOWN,
1456ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                      "Could not determine audit session data for '%s'", service);
1457ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters      goto failed;
1458ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    }
1459ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1460ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (! dbus_message_append_args (reply,
1461ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                                  DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &data, data_size,
1462ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters                                  DBUS_TYPE_INVALID))
1463ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    goto oom;
1464ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1465ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (! bus_transaction_send_from_driver (transaction, connection, reply))
1466ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    goto oom;
1467ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1468ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  dbus_message_unref (reply);
1469ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1470ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  return TRUE;
1471ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1472ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters oom:
1473ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  BUS_SET_OOM (error);
1474ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1475ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters failed:
1476ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  _DBUS_ASSERT_ERROR_IS_SET (error);
1477ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  if (reply)
1478ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    dbus_message_unref (reply);
1479ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  return FALSE;
1480ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters}
1481ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters
1482ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Waltersstatic dbus_bool_t
14839a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Waltersbus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
14849a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters							   BusTransaction *transaction,
14859a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters							   DBusMessage    *message,
14869a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters							   DBusError      *error)
14876c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters{
14886c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  const char *service;
14896c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  DBusString str;
14906c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BusRegistry *registry;
14916c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BusService *serv;
14926c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  DBusConnection *conn;
14936c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  DBusMessage *reply;
14946c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BusSELinuxID *context;
14956c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
14966c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
14976c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
14986c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  registry = bus_connection_get_registry (connection);
14996c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15006c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  service = NULL;
15016c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  reply = NULL;
15026c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15036c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (! dbus_message_get_args (message, error,
15046c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters			       DBUS_TYPE_STRING, &service,
15056c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters			       DBUS_TYPE_INVALID))
15066c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      goto failed;
15076c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15086c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _dbus_verbose ("asked for security context of connection %s\n", service);
15096c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15106c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _dbus_string_init_const (&str, service);
15116c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  serv = bus_registry_lookup (registry, &str);
15126c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (serv == NULL)
15136c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    {
1514b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      dbus_set_error (error,
15156c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters		      DBUS_ERROR_NAME_HAS_NO_OWNER,
15166c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters		      "Could not get security context of name '%s': no such name", service);
15176c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      goto failed;
15186c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    }
15196c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15201a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  conn = bus_service_get_primary_owners_connection (serv);
15216c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15226c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  reply = dbus_message_new_method_return (message);
15236c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (reply == NULL)
15246c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    goto oom;
15256c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15266c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  context = bus_connection_get_selinux_id (conn);
15276c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (!context)
15286c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    {
15296c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      dbus_set_error (error,
15309a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters                      DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN,
15316c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters                      "Could not determine security context for '%s'", service);
15326c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      goto failed;
15336c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    }
15346c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15359a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters  if (! bus_selinux_append_context (reply, context, error))
15369a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters    goto failed;
15376c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15386c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (! bus_transaction_send_from_driver (transaction, connection, reply))
15396c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    goto oom;
15406c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15416c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  dbus_message_unref (reply);
15426c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15436c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  return TRUE;
15446c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15456c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters oom:
15466c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BUS_SET_OOM (error);
15476c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15486c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters failed:
15496c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _DBUS_ASSERT_ERROR_IS_SET (error);
15506c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (reply)
15516c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    dbus_message_unref (reply);
15526c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  return FALSE;
15536c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters}
15546c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
15556c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Waltersstatic dbus_bool_t
15561919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergbus_driver_handle_reload_config (DBusConnection *connection,
15571919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 BusTransaction *transaction,
15581919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusMessage    *message,
15591919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusError      *error)
15601919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg{
15611919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  BusContext *context;
156245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  DBusMessage *reply;
15631919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
15641919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
15651919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
156645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  reply = NULL;
1567b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
15681919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  context = bus_connection_get_context (connection);
15691919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  if (!bus_context_reload_config (context, error))
157045ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    goto failed;
15711919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
157245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  reply = dbus_message_new_method_return (message);
157345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  if (reply == NULL)
157445ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    goto oom;
157545ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
157645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  if (! bus_transaction_send_from_driver (transaction, connection, reply))
157745ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    goto oom;
157845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
157945ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  dbus_message_unref (reply);
158045ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  return TRUE;
158145ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
158245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J oom:
158345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  BUS_SET_OOM (error);
158445ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
158545ef0fbc4f0f5441425484be3662b2c44d2554b3John (J failed:
158645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  _DBUS_ASSERT_ERROR_IS_SET (error);
158745ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  if (reply)
158845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    dbus_message_unref (reply);
158945ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  return FALSE;
15901919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg}
15911919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
159254b943432c7c947db88066751dd36a372cc9a618Havoc Penningtonstatic dbus_bool_t
159354b943432c7c947db88066751dd36a372cc9a618Havoc Penningtonbus_driver_handle_get_id (DBusConnection *connection,
159454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington                          BusTransaction *transaction,
159554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington                          DBusMessage    *message,
159654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington                          DBusError      *error)
159754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington{
159854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  BusContext *context;
159954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  DBusMessage *reply;
160054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  DBusString uuid;
160154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  const char *v_STRING;
160254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
160354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
160454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
160554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (!_dbus_string_init (&uuid))
160654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    {
160754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington      BUS_SET_OOM (error);
160854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington      return FALSE;
160954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    }
161054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
161154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  reply = NULL;
1612b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
161354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  context = bus_connection_get_context (connection);
161454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (!bus_context_get_id (context, &uuid))
161554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    goto oom;
161654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
161754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  reply = dbus_message_new_method_return (message);
161854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (reply == NULL)
161954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    goto oom;
162054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
162154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  v_STRING = _dbus_string_get_const_data (&uuid);
162254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (!dbus_message_append_args (reply,
162354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington                                 DBUS_TYPE_STRING, &v_STRING,
162454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington                                 DBUS_TYPE_INVALID))
162554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    goto oom;
1626b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
162754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  _dbus_assert (dbus_message_has_signature (reply, "s"));
1628b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
162954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (! bus_transaction_send_from_driver (transaction, connection, reply))
163054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    goto oom;
163154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
1632b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  _dbus_string_free (&uuid);
163354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  dbus_message_unref (reply);
163454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  return TRUE;
163554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
163654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington oom:
163754b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1638b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
163954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  BUS_SET_OOM (error);
164054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
164154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  if (reply)
164254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    dbus_message_unref (reply);
1643b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  _dbus_string_free (&uuid);
164454b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  return FALSE;
164554b943432c7c947db88066751dd36a372cc9a618Havoc Pennington}
164654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
164729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of
164829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items
164929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow)
165029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
1651eb3b99e7c610988823804f5e6c92aa13459605c7Kjartan Maraasstatic struct
165229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
165329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  const char *name;
16545b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  const char *in_args;
16555b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  const char *out_args;
165629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t (* handler) (DBusConnection *connection,
165729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
165829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusMessage    *message,
165929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error);
166029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = {
166154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  { "Hello",
166254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    "",
166354b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    DBUS_TYPE_STRING_AS_STRING,
1664b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    bus_driver_handle_hello },
16655b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "RequestName",
16665b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
16675b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
16685b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_acquire_service },
1669b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  { "ReleaseName",
1670b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    DBUS_TYPE_STRING_AS_STRING,
1671b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    DBUS_TYPE_UINT32_AS_STRING,
1672b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    bus_driver_handle_release_service },
16735b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "StartServiceByName",
16745b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
16755b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
16765b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_activate_service },
167737853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode  { "UpdateActivationEnvironment",
167837853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    DBUS_TYPE_ARRAY_AS_STRING DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
167937853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    "",
168037853b6dd04fa32a6f948438d2fbdcd08bd473e4Ray Strode    bus_driver_handle_update_activation_environment },
16815b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "NameHasOwner",
16825b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
16835b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_BOOLEAN_AS_STRING,
16845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_service_exists },
16855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "ListNames",
16865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
16875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
16885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_list_services },
16897628b541258d906e27e2000a402ed2d02383479cJohn (J  { "ListActivatableNames",
16907628b541258d906e27e2000a402ed2d02383479cJohn (J    "",
16917628b541258d906e27e2000a402ed2d02383479cJohn (J    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
16927628b541258d906e27e2000a402ed2d02383479cJohn (J    bus_driver_handle_list_activatable_services },
16935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "AddMatch",
16945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
16955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
16965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_add_match },
16975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "RemoveMatch",
16985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
16995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
17005b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_remove_match },
17015b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetNameOwner",
17025b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
17035b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
17045b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_service_owner },
17051a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J  { "ListQueuedOwners",
17061a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    DBUS_TYPE_STRING_AS_STRING,
17071a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
17081a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J    bus_driver_handle_list_queued_owners },
17095b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetConnectionUnixUser",
17105b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
17115b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
17125b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_connection_unix_user },
17135b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetConnectionUnixProcessID",
17145b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
17155b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
17165b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_connection_unix_process_id },
1717ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters  { "GetAdtAuditSessionData",
1718ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    DBUS_TYPE_STRING_AS_STRING,
1719ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING,
1720ab1eb1fd5a26affa2383b0eb7e292efd83ec2546Colin Walters    bus_driver_handle_get_adt_audit_session_data },
17219a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters  { "GetConnectionSELinuxSecurityContext",
17226c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    DBUS_TYPE_STRING_AS_STRING,
17239a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING,
17249a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters    bus_driver_handle_get_connection_selinux_security_context },
17255b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "ReloadConfig",
17265b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
17275b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
172854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    bus_driver_handle_reload_config },
172954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  { "GetId",
173054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    "",
173154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    DBUS_TYPE_STRING_AS_STRING,
173254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington    bus_driver_handle_get_id }
173329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
173429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
173541f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonstatic dbus_bool_t
1736030cc1e53c6216853e08e27b92f72db80d001873Colin Walterswrite_args_for_direction (DBusString *xml,
1737030cc1e53c6216853e08e27b92f72db80d001873Colin Walters			  const char *signature,
1738030cc1e53c6216853e08e27b92f72db80d001873Colin Walters			  dbus_bool_t in)
1739030cc1e53c6216853e08e27b92f72db80d001873Colin Walters{
1740030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  DBusTypeReader typereader;
1741030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  DBusString sigstr;
1742030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  int current_type;
1743b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1744030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  _dbus_string_init_const (&sigstr, signature);
1745030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  _dbus_type_reader_init_types_only (&typereader, &sigstr, 0);
1746b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1747030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  while ((current_type = _dbus_type_reader_get_current_type (&typereader)) != DBUS_TYPE_INVALID)
1748030cc1e53c6216853e08e27b92f72db80d001873Colin Walters    {
1749030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      const DBusString *subsig;
1750030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      int start, len;
1751030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1752030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      _dbus_type_reader_get_signature (&typereader, &subsig, &start, &len);
17536180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters      if (!_dbus_string_append_printf (xml, "      <arg direction=\"%s\" type=\"",
17546180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters				       in ? "in" : "out"))
17556180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters	goto oom;
17566180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters      if (!_dbus_string_append_len (xml,
17576180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters				    _dbus_string_get_const_data (subsig) + start,
17586180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters				    len))
17596180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters	goto oom;
17606180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters      if (!_dbus_string_append (xml, "\"/>\n"))
1761030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
1762030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1763030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      _dbus_type_reader_next (&typereader);
1764030cc1e53c6216853e08e27b92f72db80d001873Colin Walters    }
1765030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  return TRUE;
1766030cc1e53c6216853e08e27b92f72db80d001873Colin Walters oom:
1767030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  return FALSE;
1768030cc1e53c6216853e08e27b92f72db80d001873Colin Walters}
1769030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
177061316dd897846c6ee18daccdddaf8a78650a1406John (Jdbus_bool_t
177161316dd897846c6ee18daccdddaf8a78650a1406John (Jbus_driver_generate_introspect_string (DBusString *xml)
177241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington{
177385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  int i;
177441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
177561316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE))
177661316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
177761316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, "<node>\n"))
177861316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
177961316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "  <interface name=\"%s\">\n", DBUS_INTERFACE_INTROSPECTABLE))
178061316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
178161316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, "    <method name=\"Introspect\">\n"))
178261316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
178361316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "      <arg name=\"data\" direction=\"out\" type=\"%s\"/>\n", DBUS_TYPE_STRING_AS_STRING))
178461316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
178561316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, "    </method>\n"))
178661316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
178761316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, "  </interface>\n"))
178861316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
178985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
179061316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "  <interface name=\"%s\">\n",
1791248895207dc15914ac7970a6d1431308075dca1dColin Walters                                   DBUS_INTERFACE_DBUS))
179261316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
179385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
179485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  i = 0;
179585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
179685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    {
1797b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
179861316dd897846c6ee18daccdddaf8a78650a1406John (J      if (!_dbus_string_append_printf (xml, "    <method name=\"%s\">\n",
179985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington                                       message_handlers[i].name))
180061316dd897846c6ee18daccdddaf8a78650a1406John (J        return FALSE;
180185fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
180261316dd897846c6ee18daccdddaf8a78650a1406John (J      if (!write_args_for_direction (xml, message_handlers[i].in_args, TRUE))
180361316dd897846c6ee18daccdddaf8a78650a1406John (J	return FALSE;
1804030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
180561316dd897846c6ee18daccdddaf8a78650a1406John (J      if (!write_args_for_direction (xml, message_handlers[i].out_args, FALSE))
180661316dd897846c6ee18daccdddaf8a78650a1406John (J	return FALSE;
180785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
180861316dd897846c6ee18daccdddaf8a78650a1406John (J      if (!_dbus_string_append (xml, "    </method>\n"))
180961316dd897846c6ee18daccdddaf8a78650a1406John (J	return FALSE;
1810b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
181185fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      ++i;
181285fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    }
181366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
181461316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "    <signal name=\"NameOwnerChanged\">\n"))
181561316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1816b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
181761316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "      <arg type=\"s\"/>\n"))
181861316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1819b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
182061316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "      <arg type=\"s\"/>\n"))
182161316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1822b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
182361316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "      <arg type=\"s\"/>\n"))
182461316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1825b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
182661316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "    </signal>\n"))
182761316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
182866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
182966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
183066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
183161316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "    <signal name=\"NameLost\">\n"))
183261316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1833b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
183461316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "      <arg type=\"s\"/>\n"))
183561316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1836b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
183761316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "    </signal>\n"))
183861316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
183966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
184066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
184166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
184261316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "    <signal name=\"NameAcquired\">\n"))
184361316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1844b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
184561316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "      <arg type=\"s\"/>\n"))
184661316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1847b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
184861316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append_printf (xml, "    </signal>\n"))
184961316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
185066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
185161316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, "  </interface>\n"))
185261316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
1853b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
185461316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_append (xml, "</node>\n"))
185561316dd897846c6ee18daccdddaf8a78650a1406John (J    return FALSE;
185661316dd897846c6ee18daccdddaf8a78650a1406John (J
185761316dd897846c6ee18daccdddaf8a78650a1406John (J  return TRUE;
185861316dd897846c6ee18daccdddaf8a78650a1406John (J}
185961316dd897846c6ee18daccdddaf8a78650a1406John (J
186061316dd897846c6ee18daccdddaf8a78650a1406John (Jstatic dbus_bool_t
186161316dd897846c6ee18daccdddaf8a78650a1406John (Jbus_driver_handle_introspect (DBusConnection *connection,
186261316dd897846c6ee18daccdddaf8a78650a1406John (J                              BusTransaction *transaction,
186361316dd897846c6ee18daccdddaf8a78650a1406John (J                              DBusMessage    *message,
186461316dd897846c6ee18daccdddaf8a78650a1406John (J                              DBusError      *error)
186561316dd897846c6ee18daccdddaf8a78650a1406John (J{
186661316dd897846c6ee18daccdddaf8a78650a1406John (J  DBusString xml;
186761316dd897846c6ee18daccdddaf8a78650a1406John (J  DBusMessage *reply;
186861316dd897846c6ee18daccdddaf8a78650a1406John (J  const char *v_STRING;
186961316dd897846c6ee18daccdddaf8a78650a1406John (J
187061316dd897846c6ee18daccdddaf8a78650a1406John (J  _dbus_verbose ("Introspect() on bus driver\n");
1871b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
187261316dd897846c6ee18daccdddaf8a78650a1406John (J  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
187361316dd897846c6ee18daccdddaf8a78650a1406John (J
187461316dd897846c6ee18daccdddaf8a78650a1406John (J  reply = NULL;
187561316dd897846c6ee18daccdddaf8a78650a1406John (J
187661316dd897846c6ee18daccdddaf8a78650a1406John (J  if (! dbus_message_get_args (message, error,
187761316dd897846c6ee18daccdddaf8a78650a1406John (J			       DBUS_TYPE_INVALID))
187861316dd897846c6ee18daccdddaf8a78650a1406John (J    {
187961316dd897846c6ee18daccdddaf8a78650a1406John (J      _DBUS_ASSERT_ERROR_IS_SET (error);
188061316dd897846c6ee18daccdddaf8a78650a1406John (J      return FALSE;
188161316dd897846c6ee18daccdddaf8a78650a1406John (J    }
188261316dd897846c6ee18daccdddaf8a78650a1406John (J
188361316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!_dbus_string_init (&xml))
188461316dd897846c6ee18daccdddaf8a78650a1406John (J    {
188561316dd897846c6ee18daccdddaf8a78650a1406John (J      BUS_SET_OOM (error);
188661316dd897846c6ee18daccdddaf8a78650a1406John (J      return FALSE;
188761316dd897846c6ee18daccdddaf8a78650a1406John (J    }
188861316dd897846c6ee18daccdddaf8a78650a1406John (J
188961316dd897846c6ee18daccdddaf8a78650a1406John (J  if (!bus_driver_generate_introspect_string (&xml))
189041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
189141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
189261316dd897846c6ee18daccdddaf8a78650a1406John (J  v_STRING = _dbus_string_get_const_data (&xml);
189361316dd897846c6ee18daccdddaf8a78650a1406John (J
189441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  reply = dbus_message_new_method_return (message);
189541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (reply == NULL)
189641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
189741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
189841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! dbus_message_append_args (reply,
189941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                  DBUS_TYPE_STRING, &v_STRING,
190041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                  DBUS_TYPE_INVALID))
190141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
190241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
190341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! bus_transaction_send_from_driver (transaction, connection, reply))
190441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
190541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
190641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  dbus_message_unref (reply);
190741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_string_free (&xml);
190841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
190941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  return TRUE;
191041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
191141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington oom:
191241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  BUS_SET_OOM (error);
191341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
191441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (reply)
191541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    dbus_message_unref (reply);
191641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
191741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_string_free (&xml);
1918b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
191941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  return FALSE;
192041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington}
192141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
192229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
192339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection,
192429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
192529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			   DBusMessage    *message,
192629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error)
192739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
192841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  const char *name, *sender, *interface;
192929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int i;
193090ed1d84588a84697051e643175452c50d682eceHavoc Pennington
193190ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
193268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
1933b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  if (dbus_message_is_signal (message, "org.freedesktop.systemd1.Activator", "ActivationFailure"))
1934b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    {
1935b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      BusContext *context;
1936b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1937b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      context = bus_connection_get_context (connection);
1938b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
1939b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
1940b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
194168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
194268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
194368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
194468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      return TRUE; /* we just ignore this */
194568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
194668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
194741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (dbus_message_is_method_call (message,
1948248895207dc15914ac7970a6d1431308075dca1dColin Walters                                   DBUS_INTERFACE_INTROSPECTABLE,
194941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                   "Introspect"))
195041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    return bus_driver_handle_introspect (connection, transaction, message, error);
1951b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
195241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  interface = dbus_message_get_interface (message);
195341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (interface == NULL)
1954248895207dc15914ac7970a6d1431308075dca1dColin Walters    interface = DBUS_INTERFACE_DBUS;
1955b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
195668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (dbus_message_get_member (message) != NULL);
1957b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
195868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  name = dbus_message_get_member (message);
195968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  sender = dbus_message_get_sender (message);
1960b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
196141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (strcmp (interface,
1962248895207dc15914ac7970a6d1431308075dca1dColin Walters              DBUS_INTERFACE_DBUS) != 0)
196368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
196468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got message to unknown interface \"%s\"\n",
196541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                     interface);
196668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      goto unknown;
196768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
1968b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
196968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("Driver got a method call: %s\n",
197068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington		 dbus_message_get_member (message));
1971b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1972e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  /* security checks should have kept this from getting here */
197368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0);
1974b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
197529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  i = 0;
197629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
197729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
197829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (strcmp (message_handlers[i].name, name) == 0)
197929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
19805b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington          _dbus_verbose ("Found driver handler for %s\n", name);
19815b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
19825b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington          if (!dbus_message_has_signature (message, message_handlers[i].in_args))
19835b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington            {
19845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
19855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _dbus_verbose ("Call to %s has wrong args (%s, expected %s)\n",
19865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                             name, dbus_message_get_signature (message),
19875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                             message_handlers[i].in_args);
1988b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
19895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
19905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              "Call to %s has wrong args (%s, expected %s)\n",
19915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              name, dbus_message_get_signature (message),
19925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              message_handlers[i].in_args);
19935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
19945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              return FALSE;
19955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington            }
1996b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
199729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if ((* message_handlers[i].handler) (connection, transaction, message, error))
1998eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1999eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2000eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler succeeded\n");
2001eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return TRUE;
2002eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
200329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          else
2004eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
2005eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
2006eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler returned failure\n");
2007eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return FALSE;
2008eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
200929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
2010b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
201129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      ++i;
201229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
201329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
201468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington unknown:
201568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("No driver handler for message \"%s\"\n",
201668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                 name);
2017eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
20181d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD,
201929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  "%s does not understand message %s",
2020248895207dc15914ac7970a6d1431308075dca1dColin Walters                  DBUS_SERVICE_DBUS, name);
2021b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
202229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return FALSE;
2023ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
2024ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
2025ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid
2026ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection)
2027ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
202888f69757b93c7112447b97868c7dbde69dc00caaJohn (J  /* FIXME 1.0 Does nothing for now, should unregister the connection
202929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * with the bus driver.
203029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
203139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
2032