driver.c revision e55fd2c6706e41f6933e1656ac3da7527ee2514f
1aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson/* -*- mode: C; c-file-style: "gnu" -*- */ 2c414488fe62605ebda5e875fc2db05c6b3dd199fHavoc Pennington/* driver.c Bus client (driver) 3aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 4aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Copyright (C) 2003 CodeFactory AB 5aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 6aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Licensed under the Academic Free License version 1.2 7aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 8aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is free software; you can redistribute it and/or modify 9aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * it under the terms of the GNU General Public License as published by 10aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * the Free Software Foundation; either version 2 of the License, or 11aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * (at your option) any later version. 12aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 13aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is distributed in the hope that it will be useful, 14aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of 15aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * GNU General Public License for more details. 17aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 18aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * You should have received a copy of the GNU General Public License 19aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * along with this program; if not, write to the Free Software 20aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */ 23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 24f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h" 25aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h" 26aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h" 2739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h" 28aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h" 2902dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h" 30aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h> 3139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h> 32aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h> 33aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 3429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection, 3529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 3629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 3729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_deleted (const char *service_name, 4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 43a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 4439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson DBusMessage *message; 4529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 4690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 4790ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 49ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson _dbus_verbose ("sending service deleted: %s\n", service_name); 503f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson 5129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (DBUS_SERVICE_BROADCAST, 5229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_DELETED); 5329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 5429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 5529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 5629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 5729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 5839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 5929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) || 6029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington !dbus_message_append_args (message, 6129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, service_name, 6229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 6329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 6429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 6529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 6839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = bus_dispatch_broadcast_message (transaction, message, error); 7029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 7129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 7229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 73a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 74a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 7529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 7629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_created (const char *service_name, 7729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 7829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 79a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 80a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson DBusMessage *message; 8129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 8290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 8390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 8429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (DBUS_SERVICE_BROADCAST, 8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_CREATED); 8729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 8929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 9029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 9129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 92a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 9329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 9429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 9629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 9902dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson 10029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (message, 10129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, service_name, 10229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 10329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 10429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 10529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 10629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 10729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = bus_dispatch_broadcast_message (transaction, message, error); 110a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson dbus_message_unref (message); 11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 113a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 114a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 11529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 116ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection, 11729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *service_name, 11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 120ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 121ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *message; 122ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 12390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 12490ed1d84588a84697051e643175452c50d682eceHavoc Pennington 12529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (bus_connection_get_name (connection), 12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_LOST); 12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 132ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 13629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 13829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 139ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (message, 14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, service_name, 14229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 14329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 14429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 14529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 14629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 14729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 14829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 14929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_message (transaction, connection, message)) 15029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 15129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 15729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 15829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 15929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 160ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 161ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 16229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 163ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection, 16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *service_name, 16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 167ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 168ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *message; 169ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 17090ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 17190ed1d84588a84697051e643175452c50d682eceHavoc Pennington 17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (bus_connection_get_name (connection), 17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_ACQUIRED); 17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 179ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 18029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 18229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 18329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 18429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 18529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 186ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 18729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (message, 18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, service_name, 18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 19429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 19529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 19629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_message (transaction, connection, message)) 19729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 19829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 19929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 20029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 20429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 20529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 20629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 207ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 208ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 209aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t 2106ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry, 2116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusString *str) 212aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* We never want to use the same unique client name twice, because 214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * we want to guarantee that if you send a message to a given unique 215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * name, you always get the same application. So we use two numbers 216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * for INT_MAX * INT_MAX combinations, should be pretty safe against 217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * wraparound. 218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_major_number = 0; 220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_minor_number = 0; 221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington int len; 222aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 223aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson len = _dbus_string_get_length (str); 224aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington while (TRUE) 226aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson { 227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* start out with 1-0, go to 1-1, 1-2, 1-3, 228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * up to 1-MAXINT, then 2-0, 2-1, etc. 229d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 230d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_minor_number <= 0) 231d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington { 232d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_major_number += 1; 233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number = 0; 234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_major_number <= 0) 235d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added"); 236d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington } 237d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 238d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_major_number > 0); 239d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_minor_number >= 0); 240d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 241d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* appname:MAJOR-MINOR */ 242d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 243d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append (str, ":")) 244d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 245d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 246d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_major_number)) 247d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 248d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 249d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append (str, "-")) 250d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 251d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 252d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_minor_number)) 253d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 254d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 255d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number += 1; 256aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 257aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Check if a client with the name exists */ 2586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (bus_registry_lookup (registry, str) == NULL) 259aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson break; 260aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 261d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* drop the number again, try the next one. */ 262aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_set_length (str, len); 263aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson } 264aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 265aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 266aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 267aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 269a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection, 27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 27229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 273aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 274aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString unique_name; 275aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusService *service; 27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 2776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 27890ed1d84588a84697051e643175452c50d682eceHavoc Pennington 27990ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 281fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&unique_name)) 28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 286f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 2886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 2896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!create_unique_client_name (registry, &unique_name)) 29229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 29429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 29697ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_connection_set_name (connection, &unique_name)) 29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, 30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_get_name (connection))) 30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 30729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 30829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 309d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson 31029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_driver_send_welcome_message (connection, message, transaction, error)) 31129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 31297ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 313aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Create the service */ 3146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_ensure (registry, 3156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington &unique_name, connection, transaction, error); 31629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service == NULL) 31729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 318ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_service_set_prohibit_replacement (service, TRUE); 320aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 32129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 32229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 32329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0: 324aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_free (&unique_name); 32529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 326aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 327aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 329aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection, 33029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 33129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 333aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 334aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusMessage *welcome; 335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const char *name; 33690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 33790ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 338aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 339aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson name = bus_connection_get_name (connection); 340aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (name != NULL); 341aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington welcome = dbus_message_new_reply (hello_message); 34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (welcome == NULL) 34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 34529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 34729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 34839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (welcome, DBUS_SERVICE_DBUS)) 35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 355f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 35629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (welcome, 35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, name, 35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL)) 35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_message (transaction, connection, welcome)) 36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 36829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 37429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 376aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 377aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 379a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection, 38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 38129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 383a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 384a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson DBusMessage *reply; 38529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int len; 386a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson char **services; 3876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 38890ed1d84588a84697051e643175452c50d682eceHavoc Pennington 38990ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 3906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 3926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 39329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_reply (message); 39429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 399a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 4006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!bus_registry_list_services (registry, &services, &len)) 40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 40429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 40529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 40629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, 40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING_ARRAY, services, len, 40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 41329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 41429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 41529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 41639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 41729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 41829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 41929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_message (transaction, connection, reply)) 420a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington { 42129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 42229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 42329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 42429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 42529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 42629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 42729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 42829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 429a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington } 430a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 431a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 43229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 43334e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection, 43429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 43529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 43629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 437aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 438ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 439aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString service_name; 440ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson BusService *service; 441ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson char *name; 442ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson int service_reply; 443ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson int flags; 44429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 44529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *old_owner; 44629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusConnection *current_owner; 4476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 44890ed1d84588a84697051e643175452c50d682eceHavoc Pennington 44990ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 452ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, 45429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington error, 45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 45629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 459ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 46029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_verbose ("Trying to own service %s with flags 0x%x\n", name, flags); 461aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 46229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 46329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = NULL; 464aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 465aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_init_const (&service_name, name); 46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 4676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_lookup (registry, &service_name); 468ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 46929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service != NULL) 47029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington old_owner = bus_service_get_primary_owner (service); 47129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 47229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington old_owner = NULL; 473aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 47429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_reply (message); 47529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 47629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 47729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 47829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 479ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson } 48029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 48129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service == NULL) 482ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson { 4836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_ensure (registry, 4846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington &service_name, connection, transaction, error); 48529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service == NULL) 48629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 48729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 48829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 48929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington current_owner = bus_service_get_primary_owner (service); 49029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 49129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (old_owner == NULL) 49229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 49329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (current_owner == connection); 49429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 495ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson bus_service_set_prohibit_replacement (service, 49629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington (flags & DBUS_SERVICE_FLAG_PROHIBIT_REPLACEMENT)); 49729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 49829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington service_reply = DBUS_SERVICE_REPLY_PRIMARY_OWNER; 49929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 50029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else if (old_owner == connection) 50129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington service_reply = DBUS_SERVICE_REPLY_ALREADY_OWNER; 50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else if (!((flags & DBUS_SERVICE_FLAG_REPLACE_EXISTING))) 50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington service_reply = DBUS_SERVICE_REPLY_SERVICE_EXISTS; 50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else if (bus_service_get_prohibit_replacement (service)) 50529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 50629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Queue the connection */ 50729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_service_add_owner (service, connection, 50829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction, error)) 50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 510ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington service_reply = DBUS_SERVICE_REPLY_IN_QUEUE; 51229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 51329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 51429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Replace the current owner */ 51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* We enqueue the new owner and remove the first one because 51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * that will cause ServiceAcquired and ServiceLost messages to 51929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * be sent. 52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 521ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* FIXME this is broken, if the remove_owner fails 52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * we don't undo the add_owner 52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * (easiest fix is probably to move all this to 52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * services.c and have a single routine for it) 52629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 52729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 52829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_service_add_owner (service, connection, 52929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction, error)) 53029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 53229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_service_remove_owner (service, old_owner, 53329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction, error)) 53429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 53529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 53629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (connection == bus_service_get_primary_owner (service)); 537ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson service_reply = DBUS_SERVICE_REPLY_PRIMARY_OWNER; 538ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson } 539ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 54029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, service_reply, 0)) 54129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 54229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 54329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 54429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 545ba60374e251cca8fe351b7dd4def595069323885James Willcox 54629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_message (transaction, connection, reply)) 54729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 54929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 55129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 55329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 55429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 555ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson dbus_free (name); 55629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 55729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 55829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 55929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 560aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 56129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 562ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection, 56329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 56429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 56529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 566ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 567ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 568ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusString service_name; 569ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson BusService *service; 570ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson char *name; 57129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 5726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 57390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 57490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 5756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 57739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 57829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 57929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 58029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 58129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 582ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 58329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 58429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 585aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson _dbus_string_init_const (&service_name, name); 5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_lookup (registry, &service_name); 587ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_reply (message); 58929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 59029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 59129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 59229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 59429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS)) 59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 59829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 59929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 60029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 60129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, 60229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, service != NULL, 60329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 60429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 60529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 60629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 60729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_message (transaction, connection, reply)) 61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 61129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 61329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 61429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 61929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 620aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson dbus_free (name); 62129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 62229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 623aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 62439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 62529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 626f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection, 62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 630f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{ 631f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson dbus_uint32_t flags; 632f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson char *name; 63329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 6346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusActivation *activation; 6356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 63690ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 63790ed1d84588a84697051e643175452c50d682eceHavoc Pennington 6386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington activation = bus_connection_get_activation (connection); 639f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 64029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 64229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 64329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 64429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 645f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 64629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 647f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 648e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!bus_activation_activate_service (activation, connection, transaction, 649e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington message, name, error)) 65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 65129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 65229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 65329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 65429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (name); 65629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 657f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson} 658f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of 66029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items 66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow) 66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct 66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *name; 66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t (* handler) (DBusConnection *connection, 66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = { 67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_ACQUIRE_SERVICE, bus_driver_handle_acquire_service }, 67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_ACTIVATE_SERVICE, bus_driver_handle_activate_service }, 67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_HELLO, bus_driver_handle_hello }, 67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_SERVICE_EXISTS, bus_driver_handle_service_exists }, 67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_LIST_SERVICES, bus_driver_handle_list_services } 67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 67939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection, 68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 68339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 68439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson const char *name, *sender; 68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int i; 68690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 68790ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 68939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson _dbus_verbose ("Driver got a message: %s\n", 69039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson dbus_message_get_name (message)); 69139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 69239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson name = dbus_message_get_name (message); 69339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson sender = dbus_message_get_sender (message); 69439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 69539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (sender == NULL && (strcmp (name, DBUS_MESSAGE_HELLO) != 0)) 69639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson { 69729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 69829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington "Client tried to send a message other than %s without being registered", 69929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_HELLO); 70029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 70139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson dbus_connection_disconnect (connection); 70229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 70329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 70429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 70529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington i = 0; 70629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (i < _DBUS_N_ELEMENTS (message_handlers)) 70729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 70829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (strcmp (message_handlers[i].name, name) == 0) 70929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 71029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if ((* message_handlers[i].handler) (connection, transaction, message, error)) 71129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 71229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 71329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 71429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 71529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 71629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington ++i; 71729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 71829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 71929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_set_error (error, DBUS_ERROR_UNKNOWN_MESSAGE, 72029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington "%s does not understand message %s", 72129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_SERVICE_DBUS, name); 72229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 72329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 724ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 725ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 726ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid 727ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection) 728ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 72929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* FIXME Does nothing for now, should unregister the connection 73029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * with the bus driver. 73129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 73239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 733