driver.c revision b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebf
1aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson/* -*- mode: C; c-file-style: "gnu" -*- */
2c414488fe62605ebda5e875fc2db05c6b3dd199fHavoc Pennington/* driver.c  Bus client (driver)
3aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * Copyright (C) 2003 CodeFactory AB
55b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington * Copyright (C) 2003, 2004, 2005 Red Hat, Inc.
6aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
8aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
9aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is free software; you can redistribute it and/or modify
10aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * it under the terms of the GNU General Public License as published by
11aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * the Free Software Foundation; either version 2 of the License, or
12aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * (at your option) any later version.
13aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
14aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is distributed in the hope that it will be useful,
15aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
16aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * GNU General Public License for more details.
18aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
19aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * You should have received a copy of the GNU General Public License
20aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * along with this program; if not, write to the Free Software
21aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */
24aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
25f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h"
26aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h"
27aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h"
2839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
29aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h"
306c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters#include "selinux.h"
31a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
3202dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
33aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h>
3439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
35030cc1e53c6216853e08e27b92f72db80d001873Colin Walters#include <dbus/dbus-marshal-recursive.h>
36aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h>
37aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusMessage    *hello_message,
4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    BusTransaction *transaction,
4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusError      *error);
4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
4485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieubus_driver_send_service_owner_changed (const char     *service_name,
4585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       const char     *old_owner,
4685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       const char     *new_owner,
4785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       BusTransaction *transaction,
4885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu				       DBusError      *error)
49a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
5039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  DBusMessage *message;
5129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *null_service;
5390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
5490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  null_service = "";
578873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  _dbus_verbose ("sending name owner changed: %s [%s -> %s]\n",
58dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington                 service_name,
5985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                 old_owner ? old_owner : null_service,
6085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                 new_owner ? new_owner : null_service);
613f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson
62248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
63248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
648873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameOwnerChanged");
65b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
7029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
7139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
72248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
7385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto oom;
7485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
7585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (!dbus_message_append_args (message,
769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, old_owner ? &old_owner : &null_service,
789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, new_owner ? &new_owner : &null_service,
79e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
8085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto oom;
8139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
82dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_assert (dbus_message_has_signature (message, "sss"));
83dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
84a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = bus_dispatch_matches (transaction, NULL, NULL, message, error);
8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (message);
8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
88a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
8985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu oom:
90a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  dbus_message_unref (message);
9185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  BUS_SET_OOM (error);
9285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  return FALSE;
93a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
94a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
96ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection,
9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			      const char     *service_name,
9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              BusTransaction *transaction,
9929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusError      *error)
100ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
101ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
102ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
10390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
10490ed1d84588a84697051e643175452c50d682eceHavoc Pennington
105248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
106248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
1078873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameLost");
108b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
114ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
115b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
116b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
1179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
118e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
12229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
12329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
12429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
125777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
13229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
136ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
137ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
13829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
139ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection,
14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const char     *service_name,
14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
14229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
143ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
144ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
145ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
14690ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
14790ed1d84588a84697051e643175452c50d682eceHavoc Pennington
148248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_signal (DBUS_PATH_DBUS,
149248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_INTERFACE_DBUS,
1508873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                     "NameAcquired");
151c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
157ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
158b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
159b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
1609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &service_name,
161e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
16229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
16329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
16729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
168777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
179ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
180ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
181aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t
1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry,
1836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                           DBusString  *str)
184aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
185d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  /* We never want to use the same unique client name twice, because
186d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * we want to guarantee that if you send a message to a given unique
187d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * name, you always get the same application. So we use two numbers
188d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * for INT_MAX * INT_MAX combinations, should be pretty safe against
189d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * wraparound.
190d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   */
191b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  /* FIXME these should be in BusRegistry rather than static vars */
192d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_major_number = 0;
193d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_minor_number = 0;
194d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  int len;
195b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
196aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  len = _dbus_string_get_length (str);
197aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
198d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  while (TRUE)
199aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    {
200d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* start out with 1-0, go to 1-1, 1-2, 1-3,
201d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       * up to 1-MAXINT, then 2-0, 2-1, etc.
202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       */
203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (next_minor_number <= 0)
204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        {
205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_major_number += 1;
206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_minor_number = 0;
207d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          if (next_major_number <= 0)
208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington            _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
209d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        }
210d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
211d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_major_number > 0);
212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_minor_number >= 0);
213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* appname:MAJOR-MINOR */
215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, ":"))
217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_major_number))
220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
22275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (!_dbus_string_append (str, "."))
223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_minor_number))
226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      next_minor_number += 1;
229aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
230aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      /* Check if a client with the name exists */
2316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (bus_registry_lookup (registry, str) == NULL)
232aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson	break;
233aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* drop the number again, try the next one. */
235aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      _dbus_string_set_length (str, len);
236aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    }
237aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
238aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
239aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
240aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
24129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
242a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection,
24329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         BusTransaction *transaction,
24429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusMessage    *message,
24529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusError      *error)
246aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
247aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString unique_name;
248aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusService *service;
24929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
2506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
251983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  BusConnections *connections;
25290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
25390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
254983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
2551658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (bus_connection_is_active (connection))
2561658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
2571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      /* We already handled an Hello message for this connection. */
2581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      dbus_set_error (error, DBUS_ERROR_FAILED,
2591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                      "Already handled an Hello message");
2601658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      return FALSE;
2611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
2621658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* Note that when these limits are exceeded we don't disconnect the
264983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * connection; we just sort of leave it hanging there until it times
265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * out or disconnects itself or is dropped due to the max number of
266983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * incomplete connections. It's even OK if the connection wants to
267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * retry the hello message, we support that.
268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   */
269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  connections = bus_connection_get_connections (connection);
270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  if (!bus_connections_check_limits (connections, connection,
271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                                     error))
272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
275983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
277fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&unique_name))
27829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
282f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
2846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
2856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
2876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!create_unique_client_name (registry, &unique_name))
28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
29297ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
293e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (!bus_connection_complete (connection, &unique_name, error))
29429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
295e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message,
30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                bus_connection_get_name (connection)))
30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
305d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson
30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_driver_send_welcome_message (connection, message, transaction, error))
30729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
30897ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
309aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  /* Create the service */
3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_ensure (registry,
3116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                 &unique_name, connection, transaction, error);
31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
31329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
314ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
31529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_service_set_prohibit_replacement (service, TRUE);
316aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
317a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert (bus_connection_is_active (connection));
31829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
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);
335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
336aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  name = bus_connection_get_name (connection);
337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (name != NULL);
338aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
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    }
34539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
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));
356dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
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);
3856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
3876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
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);
40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
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  }
426970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington
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
4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_iter_close_container (&iter, &sub))
4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      dbus_free_string_array (services);
4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      dbus_message_unref (reply);
4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      BUS_SET_OOM (error);
4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      return FALSE;
4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
4489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
44929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free_string_array (services);
45029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
451777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
452a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    {
45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
45429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
45629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
45929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
46029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
461a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    }
462a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
463a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
46429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
46534e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection,
46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   BusTransaction *transaction,
46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusMessage    *message,
46829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusError      *error)
469aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
470ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
471aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString service_name;
4729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
473b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  dbus_uint32_t service_reply;
4748a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu  dbus_uint32_t flags;
47529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
47790ed1d84588a84697051e643175452c50d682eceHavoc Pennington
47890ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
4806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
481ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
482c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson  if (!dbus_message_get_args (message, error,
48329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
48429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
485e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
48629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
487ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
48898ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington  _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
4896c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington
4906c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  retval = FALSE;
4916c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  reply = NULL;
492aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
493aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_init_const (&service_name, name);
494ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
4956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!bus_registry_acquire_service (registry, connection,
4966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_name, flags,
4976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_reply, transaction,
4986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     error))
4996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    goto out;
500aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
501b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
50529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
506ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
50729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
5089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
51029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
51229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
513ba60374e251cca8fe351b7dd4def595069323885James Willcox
514777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
51929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
52129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
52629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
527aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
52829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
529b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueenbus_driver_handle_release_service (DBusConnection *connection,
530b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                   BusTransaction *transaction,
531b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                   DBusMessage    *message,
532b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                   DBusError      *error)
533b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen{
534b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  DBusMessage *reply;
535b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  DBusString service_name;
536b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  const char *name;
537b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  dbus_uint32_t service_reply;
538b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  dbus_bool_t retval;
539b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  BusRegistry *registry;
540b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
541b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
542b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
543b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  registry = bus_connection_get_registry (connection);
544b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
545b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!dbus_message_get_args (message, error,
546b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                              DBUS_TYPE_STRING, &name,
547b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                              DBUS_TYPE_INVALID))
548b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    return FALSE;
549b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
550b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  _dbus_verbose ("Trying to release name %s\n", name);
551b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
552b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  retval = FALSE;
553b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  reply = NULL;
554b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
555b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  _dbus_string_init_const (&service_name, name);
556b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
557b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!bus_registry_release_service (registry, connection,
558b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                     &service_name, &service_reply,
559b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen                                     transaction, error))
560b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    goto out;
561b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
562b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  reply = dbus_message_new_method_return (message);
563b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (reply == NULL)
564b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    {
565b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      BUS_SET_OOM (error);
566b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      goto out;
567b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    }
568b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
569b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID))
570b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    {
571b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      BUS_SET_OOM (error);
572b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      goto out;
573b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    }
574b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
575b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (!bus_transaction_send_from_driver (transaction, connection, reply))
576b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    {
577b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      BUS_SET_OOM (error);
578b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen      goto out;
579b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    }
580b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
581b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  retval = TRUE;
582b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
583b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen out:
584b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  if (reply)
585b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    dbus_message_unref (reply);
586b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  return retval;
587b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen}
588b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen
589b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueenstatic dbus_bool_t
590ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection,
59129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
59229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage    *message,
59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
594ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
595ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
596ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusString service_name;
597ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
59862e465339a306fa564b69935da494dad6e1b474aHavoc Pennington  dbus_bool_t service_exists;
5999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
60029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
60290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
60390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
6046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
60639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
60729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
609e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
611ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
6132091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge
614248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
6152091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
6162091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = TRUE;
6172091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
6182091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge  else
6192091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
6202091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      _dbus_string_init_const (&service_name, name);
6212091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service = bus_registry_lookup (registry, &service_name);
6222091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = service != NULL;
6232091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
62429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
625b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
62629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
63229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
6339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_BOOLEAN, &service_exists,
63429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
63529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
63629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
63729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
63829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
63929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
640777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
64229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
64329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
64429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
64529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
64629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
64729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
64829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
64929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
65129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
65229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
653aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
65439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
656f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection,
65729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    BusTransaction *transaction,
65829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusMessage    *message,
65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusError      *error)
660f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{
661f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  dbus_uint32_t flags;
6629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
6646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
6656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
66690ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
66790ed1d84588a84697051e643175452c50d682eceHavoc Pennington
6686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  activation = bus_connection_get_activation (connection);
669f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
673e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
674eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
675eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
6768873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
677eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      return FALSE;
678eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
679f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
681f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
68293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
683e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                        message, name, error))
684eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
685eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
686eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("bus_activation_activate_service() failed\n");
687eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      goto out;
688eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
69329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
694f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson}
695f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
696a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
697a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_ack_reply (DBusConnection *connection,
698a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                BusTransaction *transaction,
699a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusMessage    *message,
700a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusError      *error)
701a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
702a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusMessage *reply;
703a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
704a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  reply = dbus_message_new_method_return (message);
705a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (reply == NULL)
706a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
707a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
708a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
709a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
710a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
711a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
712a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
713a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
714a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_message_unref (reply);
715a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
716a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
717a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
718a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_message_unref (reply);
719a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
720a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
721a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
722a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
723a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
724a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_add_match (DBusConnection *connection,
725a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             BusTransaction *transaction,
726a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusMessage    *message,
727a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusError      *error)
728a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
729a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
7309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
731a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
732a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
733a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
734a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
735a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
736a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
737a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
738a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
739a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (bus_connection_get_n_match_rules (connection) >=
740a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction)))
741a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
742a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
743a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "Connection \"%s\" is not allowed to add more match rules "
744a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(increase limits in configuration file if required)",
745a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_is_active (connection) ?
746a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_get_name (connection) :
747a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(inactive)");
748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
750a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
751a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
752a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
753a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
754a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
755a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to AddMatch\n");
756a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
757a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
758a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
759a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
760a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
761a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
762a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
763a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
764a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
765a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
766a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
767a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_add_rule (matchmaker, rule))
768a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
769a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
770a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
771a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
772a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
773a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
774a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
775a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
776a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_matchmaker_remove_rule (matchmaker, rule);
777a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
778a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
779a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
780a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
781a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
782a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
783a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
784a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
785a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
786a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
787a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
788a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
789a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
790a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
791a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
792a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_remove_match (DBusConnection *connection,
793a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                BusTransaction *transaction,
794a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusMessage    *message,
795a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusError      *error)
796a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
797a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
7989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
799a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
800a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
801a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
802a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
803a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
804a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
805a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
806a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
807a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
808a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
809a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
810a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
811a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to RemoveMatch\n");
812a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
813a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
814a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
815a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
816a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
817a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
818a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
819a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
820a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
821a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* Send the ack before we remove the rule, since the ack is undone
822a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   * on transaction cancel, but rule removal isn't.
823a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   */
824a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
825a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
826a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
827a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
828a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
829a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
830a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error))
831a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
832a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
833a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
834a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
835a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
836a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
837a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
838a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
839a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
840a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
841a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
842a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
843a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
844a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieustatic dbus_bool_t
845a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieubus_driver_handle_get_service_owner (DBusConnection *connection,
846a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     BusTransaction *transaction,
847a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusMessage    *message,
848a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusError      *error)
849a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu{
8509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
851a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  const char *base_name;
852a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusString str;
853a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusRegistry *registry;
854a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusService *service;
855a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusMessage *reply;
856a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
857a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
858a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
859a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  registry = bus_connection_get_registry (connection);
860a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
861a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  text = NULL;
862a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = NULL;
863a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
864a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_get_args (message, error,
865a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_STRING, &text,
866a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_INVALID))
867a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
868a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
869a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _dbus_string_init_const (&str, text);
870a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  service = bus_registry_lookup (registry, &str);
87141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (service == NULL &&
872248895207dc15914ac7970a6d1431308075dca1dColin Walters      _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS))
87341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
87441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      /* ORG_FREEDESKTOP_DBUS owns itself */
875248895207dc15914ac7970a6d1431308075dca1dColin Walters      base_name = DBUS_SERVICE_DBUS;
87641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
87741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  else if (service == NULL)
878a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
879a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      dbus_set_error (error,
88041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                      DBUS_ERROR_NAME_HAS_NO_OWNER,
88141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                      "Could not get owner of name '%s': no such name", text);
882a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
883a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
88441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  else
885a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
88641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      base_name = bus_connection_get_name (bus_service_get_primary_owner (service));
88741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      if (base_name == NULL)
88841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington        {
88941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          /* FIXME - how is this error possible? */
89041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          dbus_set_error (error,
89141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                          DBUS_ERROR_FAILED,
89241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                          "Could not determine unique name for '%s'", text);
89341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington          goto failed;
89441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington        }
89541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      _dbus_assert (*base_name == ':');
896a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
89741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
89841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_assert (base_name != NULL);
899a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
900a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = dbus_message_new_method_return (message);
901a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply == NULL)
902a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
903a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
904a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_append_args (reply,
9059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington				  DBUS_TYPE_STRING, &base_name,
906a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				  DBUS_TYPE_INVALID))
907a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
908a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
909a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
910a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
911a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
912a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  dbus_message_unref (reply);
913a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
914a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return TRUE;
915a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
916a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu oom:
917a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BUS_SET_OOM (error);
918a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
919a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu failed:
920a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
921a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply)
922a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    dbus_message_unref (reply);
923a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return FALSE;
924a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu}
925a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
9261919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergstatic dbus_bool_t
9272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieubus_driver_handle_get_connection_unix_user (DBusConnection *connection,
9282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            BusTransaction *transaction,
9292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusMessage    *message,
9302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusError      *error)
9312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{
9329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service;
9332779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusString str;
9342779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusRegistry *registry;
9352779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusService *serv;
9362779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusConnection *conn;
9372779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusMessage *reply;
9382779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  unsigned long uid;
9399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t uid32;
9402779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9412779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
9422779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9432779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  registry = bus_connection_get_registry (connection);
9442779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9452779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  service = NULL;
9462779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = NULL;
9472779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9482779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_get_args (message, error,
9492779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_STRING, &service,
9502779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_INVALID))
9512779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
9522779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9532779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_verbose ("asked for UID of connection %s\n", service);
9542779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9552779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_string_init_const (&str, service);
9562779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  serv = bus_registry_lookup (registry, &str);
9572779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (serv == NULL)
9582779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
9592779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
9608873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      DBUS_ERROR_NAME_HAS_NO_OWNER,
9618873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      "Could not get UID of name '%s': no such name", service);
9622779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
9632779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
9642779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  conn = bus_service_get_primary_owner (serv);
9662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = dbus_message_new_method_return (message);
9682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply == NULL)
9692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9702779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!dbus_connection_get_unix_user (conn, &uid))
9722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
9732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
9742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      DBUS_ERROR_FAILED,
9752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      "Could not determine UID for '%s'", service);
9762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
9772779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
9782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  uid32 = uid;
9802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_append_args (reply,
9819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                  DBUS_TYPE_UINT32, &uid32,
9822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_INVALID))
9832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9842779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
9862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_message_unref (reply);
9892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return TRUE;
9912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu oom:
9932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BUS_SET_OOM (error);
9942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu failed:
9962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
9972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply)
9982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    dbus_message_unref (reply);
9992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return FALSE;
10002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu}
10012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
10022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t
1003c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenbus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
1004c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  BusTransaction *transaction,
1005c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusMessage    *message,
1006c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusError      *error)
1007c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{
10089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service;
1009c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusString str;
1010c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusRegistry *registry;
1011c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusService *serv;
1012c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusConnection *conn;
1013c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusMessage *reply;
1014c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  unsigned long pid;
10159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t pid32;
1016c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1017c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1018c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1019c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  registry = bus_connection_get_registry (connection);
1020c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1021c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  service = NULL;
1022c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = NULL;
1023c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1024c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_get_args (message, error,
1025c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_STRING, &service,
1026c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_INVALID))
1027c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
1028c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1029c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_verbose ("asked for PID of connection %s\n", service);
1030c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1031c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_string_init_const (&str, service);
1032c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  serv = bus_registry_lookup (registry, &str);
1033c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (serv == NULL)
1034c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1035c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
10368873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      DBUS_ERROR_NAME_HAS_NO_OWNER,
10378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington		      "Could not get PID of name '%s': no such name", service);
1038c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
1039c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1040c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1041c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  conn = bus_service_get_primary_owner (serv);
1042c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1043c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = dbus_message_new_method_return (message);
1044c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply == NULL)
1045c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1046c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1047c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!dbus_connection_get_unix_process_id (conn, &pid))
1048c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1049c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
1050c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN,
1051c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      "Could not determine PID for '%s'", service);
1052c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
1053c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1054c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
10559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  pid32 = pid;
1056c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_append_args (reply,
10579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                  DBUS_TYPE_UINT32, &pid32,
1058c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_INVALID))
1059c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1060c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1061c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! bus_transaction_send_from_driver (transaction, connection, reply))
1062c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
1063c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1064c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_message_unref (reply);
1065c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1066c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return TRUE;
1067c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1068c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen oom:
1069c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BUS_SET_OOM (error);
1070c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1071c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen failed:
1072c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_SET (error);
1073c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply)
1074c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    dbus_message_unref (reply);
1075c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return FALSE;
1076c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen}
1077c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1078c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t
10799a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Waltersbus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
10809a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters							   BusTransaction *transaction,
10819a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters							   DBusMessage    *message,
10829a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters							   DBusError      *error)
10836c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters{
10846c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  const char *service;
10856c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  DBusString str;
10866c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BusRegistry *registry;
10876c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BusService *serv;
10886c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  DBusConnection *conn;
10896c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  DBusMessage *reply;
10906c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BusSELinuxID *context;
10916c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
10926c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
10936c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
10946c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  registry = bus_connection_get_registry (connection);
10956c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
10966c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  service = NULL;
10976c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  reply = NULL;
10986c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
10996c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (! dbus_message_get_args (message, error,
11006c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters			       DBUS_TYPE_STRING, &service,
11016c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters			       DBUS_TYPE_INVALID))
11026c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      goto failed;
11036c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11046c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _dbus_verbose ("asked for security context of connection %s\n", service);
11056c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11066c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _dbus_string_init_const (&str, service);
11076c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  serv = bus_registry_lookup (registry, &str);
11086c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (serv == NULL)
11096c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    {
11106c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      dbus_set_error (error,
11116c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters		      DBUS_ERROR_NAME_HAS_NO_OWNER,
11126c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters		      "Could not get security context of name '%s': no such name", service);
11136c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      goto failed;
11146c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    }
11156c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11166c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  conn = bus_service_get_primary_owner (serv);
11176c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11186c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  reply = dbus_message_new_method_return (message);
11196c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (reply == NULL)
11206c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    goto oom;
11216c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11226c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  context = bus_connection_get_selinux_id (conn);
11236c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (!context)
11246c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    {
11256c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      dbus_set_error (error,
11269a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters                      DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN,
11276c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters                      "Could not determine security context for '%s'", service);
11286c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters      goto failed;
11296c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    }
11306c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11319a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters  if (! bus_selinux_append_context (reply, context, error))
11329a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters    goto failed;
11336c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11346c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (! bus_transaction_send_from_driver (transaction, connection, reply))
11356c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    goto oom;
11366c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11376c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  dbus_message_unref (reply);
11386c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11396c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  return TRUE;
11406c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11416c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters oom:
11426c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  BUS_SET_OOM (error);
11436c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11446c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters failed:
11456c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  _DBUS_ASSERT_ERROR_IS_SET (error);
11466c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  if (reply)
11476c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    dbus_message_unref (reply);
11486c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters  return FALSE;
11496c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters}
11506c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters
11516c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Waltersstatic dbus_bool_t
11521919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergbus_driver_handle_reload_config (DBusConnection *connection,
11531919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 BusTransaction *transaction,
11541919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusMessage    *message,
11551919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusError      *error)
11561919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg{
11571919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  BusContext *context;
115845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  DBusMessage *reply;
11591919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
11601919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
11611919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
116245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  reply = NULL;
116345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
11641919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  context = bus_connection_get_context (connection);
11651919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  if (!bus_context_reload_config (context, error))
116645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    goto failed;
11671919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
116845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  reply = dbus_message_new_method_return (message);
116945ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  if (reply == NULL)
117045ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    goto oom;
117145ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
117245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  if (! bus_transaction_send_from_driver (transaction, connection, reply))
117345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    goto oom;
117445ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
117545ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  dbus_message_unref (reply);
117645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  return TRUE;
117745ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
117845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J oom:
117945ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  BUS_SET_OOM (error);
118045ef0fbc4f0f5441425484be3662b2c44d2554b3John (J
118145ef0fbc4f0f5441425484be3662b2c44d2554b3John (J failed:
118245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  _DBUS_ASSERT_ERROR_IS_SET (error);
118345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  if (reply)
118445ef0fbc4f0f5441425484be3662b2c44d2554b3John (J    dbus_message_unref (reply);
118545ef0fbc4f0f5441425484be3662b2c44d2554b3John (J  return FALSE;
11861919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg}
11871919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
118829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of
118929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items
119029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow)
119129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
119229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct
119329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
119429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  const char *name;
11955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  const char *in_args;
11965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  const char *out_args;
119729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t (* handler) (DBusConnection *connection,
119829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
119929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusMessage    *message,
120029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error);
120129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = {
12025b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "RequestName",
12035b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
12045b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
12055b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_acquire_service },
1206b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen  { "ReleaseName",
1207b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    DBUS_TYPE_STRING_AS_STRING,
1208b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    DBUS_TYPE_UINT32_AS_STRING,
1209b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen    bus_driver_handle_release_service },
12105b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "StartServiceByName",
12115b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING,
12125b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
12135b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_activate_service },
12145b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "Hello",
12155b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
12165b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12175b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_hello },
12185b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "NameHasOwner",
12195b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12205b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_BOOLEAN_AS_STRING,
12215b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_service_exists },
12225b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "ListNames",
12235b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
12245b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
12255b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_list_services },
12265b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "AddMatch",
12275b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12285b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
12295b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_add_match },
12305b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "RemoveMatch",
12315b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12325b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
12335b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_remove_match },
12345b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetNameOwner",
12355b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12365b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12375b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_service_owner },
12385b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetConnectionUnixUser",
12395b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12405b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
12415b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_connection_unix_user },
12425b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "GetConnectionUnixProcessID",
12435b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_STRING_AS_STRING,
12445b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    DBUS_TYPE_UINT32_AS_STRING,
12455b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_get_connection_unix_process_id },
12469a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters  { "GetConnectionSELinuxSecurityContext",
12476c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters    DBUS_TYPE_STRING_AS_STRING,
12489a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters    DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING,
12499a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters    bus_driver_handle_get_connection_selinux_security_context },
12505b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington  { "ReloadConfig",
12515b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
12525b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    "",
12535b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington    bus_driver_handle_reload_config }
125429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
125529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
125641f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonstatic dbus_bool_t
1257030cc1e53c6216853e08e27b92f72db80d001873Colin Walterswrite_args_for_direction (DBusString *xml,
1258030cc1e53c6216853e08e27b92f72db80d001873Colin Walters			  const char *signature,
1259030cc1e53c6216853e08e27b92f72db80d001873Colin Walters			  dbus_bool_t in)
1260030cc1e53c6216853e08e27b92f72db80d001873Colin Walters{
1261030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  DBusTypeReader typereader;
1262030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  DBusString sigstr;
1263030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  int current_type;
1264030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1265030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  _dbus_string_init_const (&sigstr, signature);
1266030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  _dbus_type_reader_init_types_only (&typereader, &sigstr, 0);
1267030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1268030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  while ((current_type = _dbus_type_reader_get_current_type (&typereader)) != DBUS_TYPE_INVALID)
1269030cc1e53c6216853e08e27b92f72db80d001873Colin Walters    {
1270030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      const DBusString *subsig;
1271030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      int start, len;
1272030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1273030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      _dbus_type_reader_get_signature (&typereader, &subsig, &start, &len);
12746180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters      if (!_dbus_string_append_printf (xml, "      <arg direction=\"%s\" type=\"",
12756180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters				       in ? "in" : "out"))
12766180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters	goto oom;
12776180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters      if (!_dbus_string_append_len (xml,
12786180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters				    _dbus_string_get_const_data (subsig) + start,
12796180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters				    len))
12806180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters	goto oom;
12816180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters      if (!_dbus_string_append (xml, "\"/>\n"))
1282030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
1283030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1284030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      _dbus_type_reader_next (&typereader);
1285030cc1e53c6216853e08e27b92f72db80d001873Colin Walters    }
1286030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  return TRUE;
1287030cc1e53c6216853e08e27b92f72db80d001873Colin Walters oom:
1288030cc1e53c6216853e08e27b92f72db80d001873Colin Walters  return FALSE;
1289030cc1e53c6216853e08e27b92f72db80d001873Colin Walters}
1290030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1291030cc1e53c6216853e08e27b92f72db80d001873Colin Waltersstatic dbus_bool_t
129241f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonbus_driver_handle_introspect (DBusConnection *connection,
129341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                              BusTransaction *transaction,
129441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                              DBusMessage    *message,
129541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                              DBusError      *error)
129641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington{
129741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  DBusString xml;
129841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  DBusMessage *reply;
129941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  const char *v_STRING;
130085fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  int i;
130141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
130241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_verbose ("Introspect() on bus driver\n");
130341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
130441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
130541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
130641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  reply = NULL;
130741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
130841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! dbus_message_get_args (message, error,
130941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington			       DBUS_TYPE_INVALID))
131041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
131141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
131241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      return FALSE;
131341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
131441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
131541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_init (&xml))
131641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    {
131741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      BUS_SET_OOM (error);
131841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington      return FALSE;
131941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    }
132041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
132141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE))
132241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
132341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "<node>\n"))
132441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
1325248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!_dbus_string_append_printf (&xml, "  <interface name=\"%s\">\n", DBUS_INTERFACE_INTROSPECTABLE))
132641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
132741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "    <method name=\"Introspect\">\n"))
132841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
13293dea5c183f65c3f924fb442bf606dfeb50f028a4Colin Walters  if (!_dbus_string_append_printf (&xml, "      <arg name=\"data\" direction=\"out\" type=\"%s\"/>\n", DBUS_TYPE_STRING_AS_STRING))
133041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
133141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "    </method>\n"))
133241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
133341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "  </interface>\n"))
133485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    goto oom;
133585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
133685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  if (!_dbus_string_append_printf (&xml, "  <interface name=\"%s\">\n",
1337248895207dc15914ac7970a6d1431308075dca1dColin Walters                                   DBUS_INTERFACE_DBUS))
133885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    goto oom;
133985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
134085fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  i = 0;
134185fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
134285fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    {
1343030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
134485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      if (!_dbus_string_append_printf (&xml, "    <method name=\"%s\">\n",
134585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington                                       message_handlers[i].name))
134685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington        goto oom;
134785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
1348030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      if (!write_args_for_direction (&xml, message_handlers[i].in_args, TRUE))
1349030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
1350030cc1e53c6216853e08e27b92f72db80d001873Colin Walters
1351030cc1e53c6216853e08e27b92f72db80d001873Colin Walters      if (!write_args_for_direction (&xml, message_handlers[i].out_args, FALSE))
1352030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
135385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
135485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      if (!_dbus_string_append (&xml, "    </method>\n"))
1355030cc1e53c6216853e08e27b92f72db80d001873Colin Walters	goto oom;
135685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
135785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington      ++i;
135885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington    }
135966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
136066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "    <signal name=\"NameOwnerChanged\">\n"))
136166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
136266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
136366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "      <arg type=\"s\"/>\n"))
136466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
136566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
136666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "      <arg type=\"s\"/>\n"))
136766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
136866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
136966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "      <arg type=\"s\"/>\n"))
137066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
137166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
137266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "    </signal>\n"))
137366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
137466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
137566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
137666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
137766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "    <signal name=\"NameLost\">\n"))
137866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
137966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
138066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "      <arg type=\"s\"/>\n"))
138166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
138266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
138366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "    </signal>\n"))
138466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
138566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
138666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
138766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
138866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "    <signal name=\"NameAcquired\">\n"))
138966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
139066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
139166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "      <arg type=\"s\"/>\n"))
139266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
139366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
139466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!_dbus_string_append_printf (&xml, "    </signal>\n"))
139566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto oom;
139666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
139766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
139885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington
139985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington  if (!_dbus_string_append (&xml, "  </interface>\n"))
140041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
140141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
140241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (!_dbus_string_append (&xml, "</node>\n"))
140341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
140441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
140541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  reply = dbus_message_new_method_return (message);
140641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (reply == NULL)
140741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
140841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
140941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  v_STRING = _dbus_string_get_const_data (&xml);
141041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! dbus_message_append_args (reply,
141141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                  DBUS_TYPE_STRING, &v_STRING,
141241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                  DBUS_TYPE_INVALID))
141341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
141441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
141541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (! bus_transaction_send_from_driver (transaction, connection, reply))
141641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    goto oom;
141741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
141841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  dbus_message_unref (reply);
141941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_string_free (&xml);
142041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
142141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  return TRUE;
142241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
142341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington oom:
142441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  BUS_SET_OOM (error);
142541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
142641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (reply)
142741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    dbus_message_unref (reply);
142841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
142941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  _dbus_string_free (&xml);
143041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
143141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  return FALSE;
143241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington}
143341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
143429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
143539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection,
143629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
143729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			   DBusMessage    *message,
143829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error)
143939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
144041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  const char *name, *sender, *interface;
144129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int i;
144290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
144390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
144468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
144568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
144668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
144768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
144868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      return TRUE; /* we just ignore this */
144968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
145068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
145141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (dbus_message_is_method_call (message,
1452248895207dc15914ac7970a6d1431308075dca1dColin Walters                                   DBUS_INTERFACE_INTROSPECTABLE,
145341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                                   "Introspect"))
145441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington    return bus_driver_handle_introspect (connection, transaction, message, error);
145541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
145641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  interface = dbus_message_get_interface (message);
145741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (interface == NULL)
1458248895207dc15914ac7970a6d1431308075dca1dColin Walters    interface = DBUS_INTERFACE_DBUS;
145941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
146068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (dbus_message_get_member (message) != NULL);
146141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington
146268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  name = dbus_message_get_member (message);
146368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  sender = dbus_message_get_sender (message);
146429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
146541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington  if (strcmp (interface,
1466248895207dc15914ac7970a6d1431308075dca1dColin Walters              DBUS_INTERFACE_DBUS) != 0)
146768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
146868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got message to unknown interface \"%s\"\n",
146941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington                     interface);
147068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      goto unknown;
147168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
147268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
147368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("Driver got a method call: %s\n",
147468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington		 dbus_message_get_member (message));
147539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
1476e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  /* security checks should have kept this from getting here */
147768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0);
1478777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
147929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  i = 0;
148029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
148129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
148229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (strcmp (message_handlers[i].name, name) == 0)
148329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
14845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington          _dbus_verbose ("Found driver handler for %s\n", name);
14855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
14865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington          if (!dbus_message_has_signature (message, message_handlers[i].in_args))
14875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington            {
14885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
14895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _dbus_verbose ("Call to %s has wrong args (%s, expected %s)\n",
14905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                             name, dbus_message_get_signature (message),
14915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                             message_handlers[i].in_args);
14925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
14935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              dbus_set_error (error, DBUS_ERROR_INVALID_ARGS,
14945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              "Call to %s has wrong args (%s, expected %s)\n",
14955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              name, dbus_message_get_signature (message),
14965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington                              message_handlers[i].in_args);
14975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
14985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington              return FALSE;
14995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington            }
15005b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington
150129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if ((* message_handlers[i].handler) (connection, transaction, message, error))
1502eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1503eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1504eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler succeeded\n");
1505eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return TRUE;
1506eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
150729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          else
1508eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1509eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
1510eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler returned failure\n");
1511eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return FALSE;
1512eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
151329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
151429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
151529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      ++i;
151629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
151729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
151868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington unknown:
151968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("No driver handler for message \"%s\"\n",
152068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                 name);
1521eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
15221d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD,
152329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  "%s does not understand message %s",
1524248895207dc15914ac7970a6d1431308075dca1dColin Walters                  DBUS_SERVICE_DBUS, name);
152529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
152629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return FALSE;
1527ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
1528ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
1529ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid
1530ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection)
1531ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
153229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* FIXME Does nothing for now, should unregister the connection
153329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * with the bus driver.
153429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
153539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
1536