driver.c revision 1658c8afe59166c9aa77549a3ac6a2e389327638
1aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson/* -*- mode: C; c-file-style: "gnu" -*- */
2c414488fe62605ebda5e875fc2db05c6b3dd199fHavoc Pennington/* driver.c  Bus client (driver)
3aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * Copyright (C) 2003 CodeFactory AB
551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * Copyright (C) 2003 Red Hat, Inc.
6aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
8aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
9aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is free software; you can redistribute it and/or modify
10aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * it under the terms of the GNU General Public License as published by
11aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * the Free Software Foundation; either version 2 of the License, or
12aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * (at your option) any later version.
13aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
14aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is distributed in the hope that it will be useful,
15aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
16aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * GNU General Public License for more details.
18aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
19aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * You should have received a copy of the GNU General Public License
20aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * along with this program; if not, write to the Free Software
21aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */
24aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
25f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h"
26aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h"
27aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h"
2839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
29aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h"
30a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
3102dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
32aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h>
3339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
34aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h>
35aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
3629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
3729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusMessage    *hello_message,
3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    BusTransaction *transaction,
3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusError      *error);
4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_deleted (const char     *service_name,
4329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
4429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
45a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
4639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  DBusMessage *message;
4729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4890ed1d84588a84697051e643175452c50d682eceHavoc Pennington
4990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
51ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  _dbus_verbose ("sending service deleted: %s\n", service_name);
523f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson
535fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  message = dbus_message_new_signal (DBUS_PATH_ORG_FREEDESKTOP_DBUS,
545fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                     DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
5568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                     "ServiceDeleted");
56b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
5729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
5829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
5929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
6029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
6129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
6239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
6368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) ||
6429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      !dbus_message_append_args (message,
6529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
66e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
7029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
7129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
7239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
73a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = bus_dispatch_matches (transaction, NULL, NULL, message, error);
7429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (message);
7529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
7629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
77a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
78a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
7929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
8029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_created (const char     *service_name,
8129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
8229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
83a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
84a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *message;
8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
8690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
8790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
895fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  message = dbus_message_new_signal (DBUS_PATH_ORG_FREEDESKTOP_DBUS,
905fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                     DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
9168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                     "ServiceCreated");
92b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
9329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
9429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
9629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
98a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
10029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
10129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
10229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
10329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
10429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
10502dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson
10629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
10729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
108e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
11429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
115a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = bus_dispatch_matches (transaction, NULL, NULL, message, error);
116a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  dbus_message_unref (message);
11729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
119a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
120a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
122ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection,
12329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			      const char     *service_name,
12429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              BusTransaction *transaction,
12529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusError      *error)
126ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
127ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
128ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
12990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
13090ed1d84588a84697051e643175452c50d682eceHavoc Pennington
1315fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  message = dbus_message_new_signal (DBUS_PATH_ORG_FREEDESKTOP_DBUS,
1325fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                     DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
13368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                     "ServiceLost");
134b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
13629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
13829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
13929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
140ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
141b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
142b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
14329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
144e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
14529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
14629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
14729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
14829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
14929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
15029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
151777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
15729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
15829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
16029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
16129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
162ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
163ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
165ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection,
16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const char     *service_name,
16729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
169ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
170ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
171ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
17290ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
17390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
1745fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  message = dbus_message_new_signal (DBUS_PATH_ORG_FREEDESKTOP_DBUS,
1755fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                     DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
17668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                     "ServiceAcquired");
177c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
17929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
18029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
18229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
183ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
184b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) ||
185b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      !dbus_message_append_args (message,
18629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
187e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
194777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
19529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
19629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
19729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
19829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
19929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
20029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
20429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
205ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
206ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
207aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t
2086ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry,
2096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                           DBusString  *str)
210aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
211d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  /* We never want to use the same unique client name twice, because
212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * we want to guarantee that if you send a message to a given unique
213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * name, you always get the same application. So we use two numbers
214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * for INT_MAX * INT_MAX combinations, should be pretty safe against
215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * wraparound.
216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   */
217b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  /* FIXME these should be in BusRegistry rather than static vars */
218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_major_number = 0;
219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_minor_number = 0;
220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  int len;
221b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
222aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  len = _dbus_string_get_length (str);
223aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  while (TRUE)
225aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    {
226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* start out with 1-0, go to 1-1, 1-2, 1-3,
227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       * up to 1-MAXINT, then 2-0, 2-1, etc.
228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       */
229d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (next_minor_number <= 0)
230d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        {
231d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_major_number += 1;
232d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_minor_number = 0;
233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          if (next_major_number <= 0)
234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington            _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
235d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        }
236d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
237d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_major_number > 0);
238d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_minor_number >= 0);
239d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
240d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* appname:MAJOR-MINOR */
241d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
242d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, ":"))
243d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
244d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
245d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_major_number))
246d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
247d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
24875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (!_dbus_string_append (str, "."))
249d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
250d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
251d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_minor_number))
252d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
253d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
254d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      next_minor_number += 1;
255aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
256aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      /* Check if a client with the name exists */
2576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (bus_registry_lookup (registry, str) == NULL)
258aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson	break;
259aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
260d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* drop the number again, try the next one. */
261aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      _dbus_string_set_length (str, len);
262aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    }
263aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
264aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
265aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
266aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
268a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection,
26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         BusTransaction *transaction,
27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusMessage    *message,
27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusError      *error)
272aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
273aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString unique_name;
274aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusService *service;
27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
2766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
277983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  BusConnections *connections;
27890ed1d84588a84697051e643175452c50d682eceHavoc Pennington
27990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
280983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
2811658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (bus_connection_is_active (connection))
2821658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
2831658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      /* We already handled an Hello message for this connection. */
2841658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      dbus_set_error (error, DBUS_ERROR_FAILED,
2851658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                      "Already handled an Hello message");
2861658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      return FALSE;
2871658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
2881658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
289983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* Note that when these limits are exceeded we don't disconnect the
290983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * connection; we just sort of leave it hanging there until it times
291983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * out or disconnects itself or is dropped due to the max number of
292983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * incomplete connections. It's even OK if the connection wants to
293983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * retry the hello message, we support that.
294983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   */
295983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  connections = bus_connection_get_connections (connection);
296983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  if (!bus_connections_check_limits (connections, connection,
297983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                                     error))
298983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
299983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
300983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
301983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
303fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&unique_name))
30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
30729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
308f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
30929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
3136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!create_unique_client_name (registry, &unique_name))
31429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
31529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
31629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
31729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
31897ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
319e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (!bus_connection_complete (connection, &unique_name, error))
32029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
321e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
32229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
32329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
32429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
32529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message,
32629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                bus_connection_get_name (connection)))
32729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
32929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
33029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
331d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson
33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_driver_send_welcome_message (connection, message, transaction, error))
33329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
33497ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  /* Create the service */
3366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_ensure (registry,
3376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                 &unique_name, connection, transaction, error);
33829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
33929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
340ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
34129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_service_set_prohibit_replacement (service, TRUE);
342aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
343a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert (bus_connection_is_active (connection));
34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
34529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0:
347aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_free (&unique_name);
34829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
349aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
350aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
352aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection,
35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *hello_message,
35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
35529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
356aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
357aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusMessage *welcome;
358aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  const char *name;
35990ed1d84588a84697051e643175452c50d682eceHavoc Pennington
36090ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
361aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
362aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  name = bus_connection_get_name (connection);
363aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (name != NULL);
364aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
365b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  welcome = dbus_message_new_method_return (hello_message);
36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (welcome == NULL)
36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
36829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
37139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (welcome,
37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, name,
374e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
37629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
37929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
381777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, welcome))
38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
38329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
38429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
38529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
38629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
38729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
38829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
392aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
393aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
39429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
395a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection,
39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *message,
39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
399a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
400a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *reply;
40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int len;
402a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  char **services;
4036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
40490ed1d84588a84697051e643175452c50d682eceHavoc Pennington
40590ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
4076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
4086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
409b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
41329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
41429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
415a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
4166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_registry_list_services (registry, &services, &len))
41729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
41829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
41929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
42029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
42129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
42229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
42329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
424c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, services, len,
425e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                                 DBUS_TYPE_INVALID))
42629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
42729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free_string_array (services);
42829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
42929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
43029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
43129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
43239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
43329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free_string_array (services);
43429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
435777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
436a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    {
43729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
43829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
43929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
44029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
44129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
44229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
44329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
44429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
445a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    }
446a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
447a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
44829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
44934e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection,
45029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   BusTransaction *transaction,
45129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusMessage    *message,
45229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusError      *error)
453aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
454ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
455aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString service_name;
456ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  char *name;
457ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  int service_reply;
4588a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu  dbus_uint32_t flags;
45929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
46190ed1d84588a84697051e643175452c50d682eceHavoc Pennington
46290ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
4646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
465ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
466c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson  if (!dbus_message_get_args (message, error,
46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
46829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
469e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
47029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
471ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
47229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_verbose ("Trying to own service %s with flags 0x%x\n", name, flags);
4736c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington
4746c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  retval = FALSE;
4756c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  reply = NULL;
476aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
477aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_init_const (&service_name, name);
478ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
4796be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!bus_registry_acquire_service (registry, connection,
4806be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_name, flags,
4816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_reply, transaction,
4826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     error))
4836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    goto out;
484aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
485b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
48629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
48729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
48829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
48929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
490ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
49129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4926be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, service_reply, DBUS_TYPE_INVALID))
49329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
49429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
49529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
49629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
497ba60374e251cca8fe351b7dd4def595069323885James Willcox
498777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
49929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
50029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
50129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
50529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
50629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
507ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  dbus_free (name);
50829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
51029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
512aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
51329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
514ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection,
51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage    *message,
51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
518ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
519ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
520ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusString service_name;
521ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
5222091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge  dbus_bool_t service_exists;
523ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  char *name;
52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
52690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
52790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
5286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
53039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
53229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
533e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
53429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
535ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
53629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
5372091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge
5382091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge  if (strcmp (name, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) == 0)
5392091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
5402091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = TRUE;
5412091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
5422091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge  else
5432091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    {
5442091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      _dbus_string_init_const (&service_name, name);
5452091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service = bus_registry_lookup (registry, &service_name);
5462091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge      service_exists = service != NULL;
5472091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge    }
54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
549b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
55129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
55329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
55429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
55529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
55629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
5572091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge                                 DBUS_TYPE_BOOLEAN, service_exists,
55829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
55929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
56029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
56129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
56229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
56329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
564777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
56529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
56629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
56729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
56829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
56929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
57029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
57129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
57229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
57329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
57429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
575aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson  dbus_free (name);
57629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
57729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
578aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
57939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
58029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
581f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection,
58229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    BusTransaction *transaction,
58329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusMessage    *message,
58429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusError      *error)
585f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{
586f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  dbus_uint32_t flags;
587f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  char *name;
58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
5906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
59190ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
59290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
5936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  activation = bus_connection_get_activation (connection);
594f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
598e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox                              DBUS_TYPE_INVALID))
599eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
600eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
601eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("No memory to get arguments to ActivateService\n");
602eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      return FALSE;
603eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
604f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
60529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
606f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
60793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
608e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                        message, name, error))
609eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
610eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
611eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("bus_activation_activate_service() failed\n");
612eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      goto out;
613eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
61429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (name);
61929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
620f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson}
621f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
622a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
623a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_ack_reply (DBusConnection *connection,
624a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                BusTransaction *transaction,
625a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusMessage    *message,
626a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                DBusError      *error)
627a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
628a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusMessage *reply;
629a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
630a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  reply = dbus_message_new_method_return (message);
631a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (reply == NULL)
632a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
633a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
634a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
635a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
636a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
637a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
638a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
639a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
640a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_message_unref (reply);
641a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
642a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
643a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
644a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_message_unref (reply);
645a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
646a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
647a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
648a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
649a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
650a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_add_match (DBusConnection *connection,
651a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             BusTransaction *transaction,
652a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusMessage    *message,
653a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             DBusError      *error)
654a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
655a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
656a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  char *text;
657a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
658a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
659a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
660a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
661a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
662a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
663a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
664a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
665a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (bus_connection_get_n_match_rules (connection) >=
666a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction)))
667a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
668a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
669a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "Connection \"%s\" is not allowed to add more match rules "
670a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(increase limits in configuration file if required)",
671a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_is_active (connection) ?
672a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      bus_connection_get_name (connection) :
673a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      "(inactive)");
674a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
675a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
676a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
677a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
678a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
679a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
680a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
681a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to AddMatch\n");
682a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
683a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
684a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
685a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
686a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
687a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
688a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
689a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
690a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
691a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
692a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
693a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_add_rule (matchmaker, rule))
694a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
695a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
696a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
697a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
698a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
699a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
700a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
701a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
702a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      bus_matchmaker_remove_rule (matchmaker, rule);
703a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
704a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
705a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
706a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
707a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_free (text);
708a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
709a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
710a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
711a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
712a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
713a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
714a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
715a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (text)
716a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    dbus_free (text);
717a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
718a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
719a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
720a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
721a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_remove_match (DBusConnection *connection,
722a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                BusTransaction *transaction,
723a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusMessage    *message,
724a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                DBusError      *error)
725a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
726a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchRule *rule;
727a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  char *text;
728a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusString str;
729a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
730a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
731a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
732a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
733a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  text = NULL;
734a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = NULL;
735a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
736a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_message_get_args (message, error,
737a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_STRING, &text,
738a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                              DBUS_TYPE_INVALID))
739a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
740a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_verbose ("No memory to get arguments to RemoveMatch\n");
741a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
742a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
743a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
744a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_string_init_const (&str, text);
745a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
746a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  rule = bus_match_rule_parse (connection, &str, error);
747a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule == NULL)
748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
750a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* Send the ack before we remove the rule, since the ack is undone
751a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   * on transaction cancel, but rule removal isn't.
752a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   */
753a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!send_ack_reply (connection, transaction,
754a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                       message, error))
755a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
756a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
757a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_connection_get_matchmaker (connection);
758a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
759a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error))
760a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto failed;
761a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
762a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  bus_match_rule_unref (rule);
763a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_free (text);
764a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
765a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return TRUE;
766a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
767a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed:
768a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
769a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (rule)
770a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    bus_match_rule_unref (rule);
771a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (text)
772a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    dbus_free (text);
773a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return FALSE;
774a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
775a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
776a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieustatic dbus_bool_t
777a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieubus_driver_handle_get_service_owner (DBusConnection *connection,
778a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     BusTransaction *transaction,
779a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusMessage    *message,
780a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				     DBusError      *error)
781a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu{
782a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  char *text;
783a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  const char *base_name;
784a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusString str;
785a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusRegistry *registry;
786a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BusService *service;
787a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  DBusMessage *reply;
788a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
789a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
790a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
791a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  registry = bus_connection_get_registry (connection);
792a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
793a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  text = NULL;
794a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = NULL;
795a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
796a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_get_args (message, error,
797a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_STRING, &text,
798a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu			       DBUS_TYPE_INVALID))
799a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
800a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
801a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _dbus_string_init_const (&str, text);
802a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  service = bus_registry_lookup (registry, &str);
803a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (service == NULL)
804a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
805a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      dbus_set_error (error,
806a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu		      DBUS_ERROR_SERVICE_HAS_NO_OWNER,
807a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu		      "Could not get owner of service '%s': no such service", text);
808a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
809a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
810a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
811a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  base_name = bus_connection_get_name (bus_service_get_primary_owner (service));
812a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (base_name == NULL)
813a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    {
814a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      dbus_set_error (error,
815a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu		      DBUS_ERROR_FAILED,
816a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu		      "Could not determine base service for '%s'", text);
817a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu      goto failed;
818a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    }
819a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _dbus_assert (*base_name == ':');
820a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
821a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  reply = dbus_message_new_method_return (message);
822a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply == NULL)
823a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
824a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
825a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! dbus_message_append_args (reply,
826a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				  DBUS_TYPE_STRING, base_name,
827a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu				  DBUS_TYPE_INVALID))
828a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
829a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
830a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
831a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    goto oom;
832a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
833a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  dbus_message_unref (reply);
834a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  dbus_free (text);
835a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
836a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return TRUE;
837a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
838a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu oom:
839a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  BUS_SET_OOM (error);
840a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
841a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu failed:
842a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
843a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  if (reply)
844a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu    dbus_message_unref (reply);
845a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  dbus_free (text);
846a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  return FALSE;
847a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu}
848a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu
8491919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergstatic dbus_bool_t
8502779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieubus_driver_handle_get_connection_unix_user (DBusConnection *connection,
8512779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            BusTransaction *transaction,
8522779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusMessage    *message,
8532779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                            DBusError      *error)
8542779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{
8552779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  char *service;
8562779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusString str;
8572779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusRegistry *registry;
8582779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BusService *serv;
8592779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusConnection *conn;
8602779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusMessage *reply;
8612779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  unsigned long uid;
8622779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8632779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
8642779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  registry = bus_connection_get_registry (connection);
8662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  service = NULL;
8682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = NULL;
8692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8702779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_get_args (message, error,
8712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_STRING, &service,
8722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu			       DBUS_TYPE_INVALID))
8732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
8742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_verbose ("asked for UID of connection %s\n", service);
8762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8772779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_string_init_const (&str, service);
8782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  serv = bus_registry_lookup (registry, &str);
8792779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (serv == NULL)
8802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
8812779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
8822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu		      DBUS_ERROR_SERVICE_HAS_NO_OWNER,
8832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu		      "Could not get owner of service '%s': no such service", service);
8842779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
8852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
8862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  conn = bus_service_get_primary_owner (serv);
8882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  reply = dbus_message_new_method_return (message);
8902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply == NULL)
8912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
8922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
8932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!dbus_connection_get_unix_user (conn, &uid))
8942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
8952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_set_error (error,
8962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      DBUS_ERROR_FAILED,
8972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                      "Could not determine UID for '%s'", service);
8982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto failed;
8992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
9002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! dbus_message_append_args (reply,
9022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_UINT32, (dbus_uint32_t) uid,
9032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_INVALID))
9042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9052779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (! bus_transaction_send_from_driver (transaction, connection, reply))
9072779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto oom;
9082779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9092779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_message_unref (reply);
9102779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_free (service);
9112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return TRUE;
9132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu oom:
9152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  BUS_SET_OOM (error);
9162779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9172779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu failed:
9182779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _DBUS_ASSERT_ERROR_IS_SET (error);
9192779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (reply)
9202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    dbus_message_unref (reply);
9212779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_free (service);
9222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return FALSE;
9232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu}
9242779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
9252779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t
926c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenbus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
927c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  BusTransaction *transaction,
928c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusMessage    *message,
929c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen						  DBusError      *error)
930c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{
931c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  char *service;
932c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusString str;
933c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusRegistry *registry;
934c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BusService *serv;
935c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusConnection *conn;
936c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusMessage *reply;
937c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  unsigned long pid;
938c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
939c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
940c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
941c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  registry = bus_connection_get_registry (connection);
942c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
943c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  service = NULL;
944c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = NULL;
945c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
946c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_get_args (message, error,
947c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_STRING, &service,
948c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen			       DBUS_TYPE_INVALID))
949c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
950c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
951c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_verbose ("asked for PID of connection %s\n", service);
952c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
953c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_string_init_const (&str, service);
954c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  serv = bus_registry_lookup (registry, &str);
955c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (serv == NULL)
956c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
957c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
958c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen		      DBUS_ERROR_SERVICE_HAS_NO_OWNER,
959c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen		      "Could not get owner of service '%s': no such service", service);
960c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
961c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
962c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
963c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  conn = bus_service_get_primary_owner (serv);
964c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
965c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  reply = dbus_message_new_method_return (message);
966c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply == NULL)
967c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
968c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
969c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!dbus_connection_get_unix_process_id (conn, &pid))
970c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
971c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_set_error (error,
972c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN,
973c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                      "Could not determine PID for '%s'", service);
974c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto failed;
975c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
976c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
977c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! dbus_message_append_args (reply,
978c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_UINT32, (dbus_uint32_t) pid,
979c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_INVALID))
980c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
981c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
982c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (! bus_transaction_send_from_driver (transaction, connection, reply))
983c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto oom;
984c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
985c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_message_unref (reply);
986c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_free (service);
987c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
988c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return TRUE;
989c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
990c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen oom:
991c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  BUS_SET_OOM (error);
992c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
993c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen failed:
994c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _DBUS_ASSERT_ERROR_IS_SET (error);
995c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (reply)
996c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    dbus_message_unref (reply);
997c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_free (service);
998c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return FALSE;
999c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen}
1000c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1001c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t
10021919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergbus_driver_handle_reload_config (DBusConnection *connection,
10031919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 BusTransaction *transaction,
10041919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusMessage    *message,
10051919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg				 DBusError      *error)
10061919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg{
10071919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  BusContext *context;
10081919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  dbus_bool_t retval;
10091919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10101919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
10111919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10121919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  retval = FALSE;
10131919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10141919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  context = bus_connection_get_context (connection);
10151919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  if (!bus_context_reload_config (context, error))
10161919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg    {
10171919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg      _DBUS_ASSERT_ERROR_IS_SET (error);
10181919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg      goto out;
10191919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg    }
10201919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10211919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  retval = TRUE;
10221919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
10231919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg out:
10241919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  return retval;
10251919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg}
10261919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg
102729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of
102829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items
102929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow)
103029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
103129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct
103229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
103329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  const char *name;
103429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t (* handler) (DBusConnection *connection,
103529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
103629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusMessage    *message,
103729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error);
103829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = {
103968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  { "AcquireService", bus_driver_handle_acquire_service },
104068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  { "ActivateService", bus_driver_handle_activate_service },
104168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  { "Hello", bus_driver_handle_hello },
104268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  { "ServiceExists", bus_driver_handle_service_exists },
1043a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  { "ListServices", bus_driver_handle_list_services },
1044a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  { "AddMatch", bus_driver_handle_add_match },
1045a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu  { "RemoveMatch", bus_driver_handle_remove_match },
10461919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  { "GetServiceOwner", bus_driver_handle_get_service_owner },
10472779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  { "GetConnectionUnixUser", bus_driver_handle_get_connection_unix_user },
1048c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  { "GetConnectionUnixProcessID", bus_driver_handle_get_connection_unix_process_id },
10491919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg  { "ReloadConfig", bus_driver_handle_reload_config }
105029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
105129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
105229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
105339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection,
105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			   DBusMessage    *message,
105629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error)
105739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
105839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  const char *name, *sender;
105929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int i;
106090ed1d84588a84697051e643175452c50d682eceHavoc Pennington
106190ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
106268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
106368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
106468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
106568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
106668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      return TRUE; /* we just ignore this */
106768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
106868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
106968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (dbus_message_get_interface (message) != NULL);
107068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (dbus_message_get_member (message) != NULL);
107168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
107268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  name = dbus_message_get_member (message);
107368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  sender = dbus_message_get_sender (message);
107429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
107568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (strcmp (dbus_message_get_interface (message),
107668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington              DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS) != 0)
107768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    {
107868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      _dbus_verbose ("Driver got message to unknown interface \"%s\"\n",
107968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                     dbus_message_get_interface (message));
108068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      goto unknown;
108168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington    }
108268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
108368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("Driver got a method call: %s\n",
108468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington		 dbus_message_get_member (message));
108539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
1086e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  /* security checks should have kept this from getting here */
108768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0);
108829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
10893251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  if (dbus_message_get_reply_serial (message) != 0)
1090777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1091777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      _dbus_verbose ("Client sent a reply to the bus driver, ignoring it\n");
1092777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      return TRUE;
1093777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1094777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
109529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  i = 0;
109629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
109729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
109829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (strcmp (message_handlers[i].name, name) == 0)
109929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
1100eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington          _dbus_verbose ("Running driver handler for %s\n", name);
110129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if ((* message_handlers[i].handler) (connection, transaction, message, error))
1102eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1103eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1104eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler succeeded\n");
1105eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return TRUE;
1106eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
110729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          else
1108eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
1109eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
1110eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler returned failure\n");
1111eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return FALSE;
1112eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
111329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
111429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
111529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      ++i;
111629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
111729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
111868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington unknown:
111968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  _dbus_verbose ("No driver handler for message \"%s\"\n",
112068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                 name);
1121eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
11221d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD,
112329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  "%s does not understand message %s",
112468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                  DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, name);
112529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
112629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return FALSE;
1127ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
1128ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
1129ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid
1130ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection)
1131ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
113229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* FIXME Does nothing for now, should unregister the connection
113329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * with the bus driver.
113429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
113539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
1136