driver.c revision e8d396efef695b9868b0112c4a6266c97678fa8a
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 *
7aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Licensed under the Academic Free License version 1.2
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"
3002dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
31aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h>
3239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
33aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h>
34aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
3529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
3629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusMessage    *hello_message,
3729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    BusTransaction *transaction,
3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusError      *error);
3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_deleted (const char     *service_name,
4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
4329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
44a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
4539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  DBusMessage *message;
4629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4790ed1d84588a84697051e643175452c50d682eceHavoc Pennington
4890ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
50ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  _dbus_verbose ("sending service deleted: %s\n", service_name);
513f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson
52c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  message = dbus_message_new (DBUS_MESSAGE_SERVICE_DELETED,
53c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington                              DBUS_SERVICE_BROADCAST);
5429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
5529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
5629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
5729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
5829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
5939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
6029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) ||
6129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      !dbus_message_append_args (message,
6229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
6329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
6429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
6529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
6939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
70777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  retval = bus_dispatch_broadcast_message (transaction, NULL, message, error);
7129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (message);
7229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
7329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
74a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
75a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
7629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
7729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_created (const char     *service_name,
7829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
7929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
80a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
81a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *message;
8229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
8390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
8490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
86c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  message = dbus_message_new (DBUS_MESSAGE_SERVICE_CREATED,
87c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington                              DBUS_SERVICE_BROADCAST);
8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
8929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
9029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
9129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
9229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
93a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
9629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
9929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
10002dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson
10129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
10229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
10329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
10429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
10529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
10629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
10729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
110777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  retval = bus_dispatch_broadcast_message (transaction, NULL, message, error);
111a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  dbus_message_unref (message);
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
114a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
115a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
11629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
117ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection,
11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			      const char     *service_name,
11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              BusTransaction *transaction,
12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusError      *error)
121ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
122ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
123ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
12490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
12590ed1d84588a84697051e643175452c50d682eceHavoc Pennington
126c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  message = dbus_message_new (DBUS_MESSAGE_SERVICE_LOST,
127c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington                              bus_connection_get_name (connection));
12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
13229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
133ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
13629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
13929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
14229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
143777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
14429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
14529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
14629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
14729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
14829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
14929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
15029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
154ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
155ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
157ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection,
15829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const char     *service_name,
15929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
16029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
161ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
162ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
163ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
16490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
16590ed1d84588a84697051e643175452c50d682eceHavoc Pennington
166c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  message = dbus_message_new (DBUS_MESSAGE_SERVICE_ACQUIRED,
167c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington                              bus_connection_get_name (connection));
168c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
17029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
174ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
18029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
18229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
18329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
184777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, message))
18529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
18629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
18729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
19429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
195ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
196ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
197aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t
1986ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry,
1996ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                           DBusString  *str)
200aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
201d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  /* We never want to use the same unique client name twice, because
202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * we want to guarantee that if you send a message to a given unique
203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * name, you always get the same application. So we use two numbers
204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * for INT_MAX * INT_MAX combinations, should be pretty safe against
205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * wraparound.
206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   */
207b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  /* FIXME these should be in BusRegistry rather than static vars */
208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_major_number = 0;
209d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_minor_number = 0;
210d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  int len;
211b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
212aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  len = _dbus_string_get_length (str);
213aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  while (TRUE)
215aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    {
216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* start out with 1-0, go to 1-1, 1-2, 1-3,
217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       * up to 1-MAXINT, then 2-0, 2-1, etc.
218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       */
219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (next_minor_number <= 0)
220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        {
221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_major_number += 1;
222d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_minor_number = 0;
223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          if (next_major_number <= 0)
224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington            _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        }
226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_major_number > 0);
228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_minor_number >= 0);
229d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
230d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* appname:MAJOR-MINOR */
231d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
232d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, ":"))
233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
235d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_major_number))
236d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
237d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
238d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, "-"))
239d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
240d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
241d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_minor_number))
242d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
243d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
244d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      next_minor_number += 1;
245aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
246aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      /* Check if a client with the name exists */
2476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (bus_registry_lookup (registry, str) == NULL)
248aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson	break;
249aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
250d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* drop the number again, try the next one. */
251aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      _dbus_string_set_length (str, len);
252aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    }
253aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
254aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
255aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
256aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
25729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
258a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection,
25929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         BusTransaction *transaction,
26029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusMessage    *message,
26129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusError      *error)
262aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
263aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString unique_name;
264aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusService *service;
26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
2666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  BusConnections *connections;
26890ed1d84588a84697051e643175452c50d682eceHavoc Pennington
26990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* Note that when these limits are exceeded we don't disconnect the
272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * connection; we just sort of leave it hanging there until it times
273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * out or disconnects itself or is dropped due to the max number of
274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * incomplete connections. It's even OK if the connection wants to
275983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   * retry the hello message, we support that.
276983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington   */
277983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  connections = bus_connection_get_connections (connection);
278983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  if (!bus_connections_check_limits (connections, connection,
279983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                                     error))
280983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
281983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
282983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
283983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
285fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&unique_name))
28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
290f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
2926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
2936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
29429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
2956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!create_unique_client_name (registry, &unique_name))
29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
30097ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
301e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (!bus_connection_complete (connection, &unique_name, error))
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
303e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
30729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message,
30829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                bus_connection_get_name (connection)))
30929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
31029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
31129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
313d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson
31429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_driver_send_welcome_message (connection, message, transaction, error))
31529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
31697ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
317aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  /* Create the service */
3186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_ensure (registry,
3196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                 &unique_name, connection, transaction, error);
32029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
32129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
322ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
32329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_service_set_prohibit_replacement (service, TRUE);
324aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
32529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
32629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
32729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0:
328aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_free (&unique_name);
32929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
330aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
331aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
333aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection,
33429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *hello_message,
33529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
33629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
338aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusMessage *welcome;
339aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  const char *name;
34090ed1d84588a84697051e643175452c50d682eceHavoc Pennington
34190ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
342aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
343aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  name = bus_connection_get_name (connection);
344aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (name != NULL);
345aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  welcome = dbus_message_new_reply (hello_message);
34729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (welcome == NULL)
34829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
35239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (welcome,
35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, name,
35529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 NULL))
35629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
362777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, welcome))
36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
36829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
373aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
374aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
376a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection,
37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *message,
37929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
380a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
381a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *reply;
38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int len;
383a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  char **services;
3846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
38590ed1d84588a84697051e643175452c50d682eceHavoc Pennington
38690ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
3896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_reply (message);
39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
39429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
396a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
3976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_registry_list_services (registry, &services, &len))
39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
40029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
40429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
405c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, services, len,
40629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free_string_array (services);
40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
41339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
41429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free_string_array (services);
41529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
416777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
417a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    {
41829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
41929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
42029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
42129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
42229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
42329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
42429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
42529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
426a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    }
427a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
428a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
42929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
43034e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection,
43129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   BusTransaction *transaction,
43229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusMessage    *message,
43329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusError      *error)
434aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
435ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
436aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString service_name;
437ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  char *name;
438ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  int service_reply;
439ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  int flags;
44029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
44290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
44390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
4456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
446ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
447c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson  if (!dbus_message_get_args (message, error,
44829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
44929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
45029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              0))
45129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
452ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_verbose ("Trying to own service %s with flags 0x%x\n", name, flags);
4546c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington
4556c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  retval = FALSE;
4566c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington  reply = NULL;
457aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
458aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_init_const (&service_name, name);
459ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
4606be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!bus_registry_acquire_service (registry, connection,
4616be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_name, flags,
4626be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     &service_reply, transaction,
4636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                                     error))
4646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    goto out;
465aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_reply (message);
46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
46829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
46929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
47029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
471ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
47229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, service_reply, DBUS_TYPE_INVALID))
47429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
47529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
47629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
47729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
478ba60374e251cca8fe351b7dd4def595069323885James Willcox
479777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
48029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
48129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
48229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
48329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
48429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
48529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
48629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
48729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
488ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  dbus_free (name);
48929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
49029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
49129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
49229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
493aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
49429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
495ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection,
49629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
49729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage    *message,
49829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
499ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
500ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
501ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusString service_name;
502ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
503ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  char *name;
50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
50690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
50790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
5086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
51039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
51229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
51329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              0))
51429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
515ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
518aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson  _dbus_string_init_const (&service_name, name);
5196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_lookup (registry, &service_name);
520ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
52129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_reply (message);
52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
52629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
52729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
52829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
52929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_UINT32, service != NULL,
53029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
53229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
53329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
53429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
53529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
536777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!bus_transaction_send_from_driver (transaction, connection, reply))
53729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
53829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
53929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
54029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
54129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
54229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
54329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
54429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
54529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
54629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
547aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson  dbus_free (name);
54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
54929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
550aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
55139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
553f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection,
55429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    BusTransaction *transaction,
55529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusMessage    *message,
55629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusError      *error)
557f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{
558f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  dbus_uint32_t flags;
559f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  char *name;
56029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5616ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
5626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
56390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
56490ed1d84588a84697051e643175452c50d682eceHavoc Pennington
5656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  activation = bus_connection_get_activation (connection);
566f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
56729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
56829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
56929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
57029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              0))
571eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
572eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
573eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("No memory to get arguments to ActivateService\n");
574eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      return FALSE;
575eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
576f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
57729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
578f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
579e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!bus_activation_activate_service (activation, connection, transaction,
580e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                        message, name, error))
581eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    {
582eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (error);
583eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      _dbus_verbose ("bus_activation_activate_service() failed\n");
584eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington      goto out;
585eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington    }
58629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
58729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
58929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
59029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (name);
59129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
592f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson}
593f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
59429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of
59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items
59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow)
59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
59829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct
59929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
60029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  const char *name;
60129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t (* handler) (DBusConnection *connection,
60229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
60329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusMessage    *message,
60429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error);
60529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = {
60629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_ACQUIRE_SERVICE, bus_driver_handle_acquire_service },
60729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_ACTIVATE_SERVICE, bus_driver_handle_activate_service },
60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_HELLO, bus_driver_handle_hello },
60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_SERVICE_EXISTS, bus_driver_handle_service_exists },
61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_LIST_SERVICES, bus_driver_handle_list_services }
61129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
61439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection,
61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			   DBusMessage    *message,
61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error)
61839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
61939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  const char *name, *sender;
62029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int i;
62190ed1d84588a84697051e643175452c50d682eceHavoc Pennington
62290ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
62329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
62439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  _dbus_verbose ("Driver got a message: %s\n",
62539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson		 dbus_message_get_name (message));
62639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
62739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  name = dbus_message_get_name (message);
62839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  sender = dbus_message_get_sender (message);
62939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
630e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  /* security checks should have kept this from getting here */
631e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  _dbus_assert (sender != NULL || strcmp (name, DBUS_MESSAGE_HELLO) == 0);
63229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
6334219b08bfa318443419c7a3acde28f0b237b05feHavoc Pennington  if (dbus_message_get_reply_serial (message) == 0)
634777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
635777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      _dbus_verbose ("Client sent a reply to the bus driver, ignoring it\n");
636777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      return TRUE;
637777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
638777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
63929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  i = 0;
64029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
64229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (strcmp (message_handlers[i].name, name) == 0)
64329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
644eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington          _dbus_verbose ("Running driver handler for %s\n", name);
64529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if ((* message_handlers[i].handler) (connection, transaction, message, error))
646eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
647eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
648eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler succeeded\n");
649eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return TRUE;
650eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
65129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          else
652eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            {
653eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _DBUS_ASSERT_ERROR_IS_SET (error);
654eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              _dbus_verbose ("Driver handler returned failure\n");
655eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington              return FALSE;
656eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington            }
65729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
65829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      ++i;
66029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
662eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington  _dbus_verbose ("No driver handler for %s\n", name);
663eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_set_error (error, DBUS_ERROR_UNKNOWN_MESSAGE,
66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  "%s does not understand message %s",
66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  DBUS_SERVICE_DBUS, name);
66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return FALSE;
669ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
670ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
671ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid
672ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection)
673ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* FIXME Does nothing for now, should unregister the connection
67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * with the bus driver.
67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
67739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
678