driver.c revision 777707ed8dff6958972a93894a87ec1945c65c14
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 5229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (DBUS_SERVICE_BROADCAST, 5329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_DELETED); 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 8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (DBUS_SERVICE_BROADCAST, 8729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_CREATED); 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 12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (bus_connection_get_name (connection), 12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_LOST); 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 16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington message = dbus_message_new (bus_connection_get_name (connection), 16729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_SERVICE_ACQUIRED); 16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 173ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (message, 17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, service_name, 17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 17929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 18029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 18229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 183777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, message)) 18429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 18529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 18629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 18729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 194ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 195ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 196aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t 1976ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry, 1986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusString *str) 199aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 200d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* We never want to use the same unique client name twice, because 201d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * we want to guarantee that if you send a message to a given unique 202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * name, you always get the same application. So we use two numbers 203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * for INT_MAX * INT_MAX combinations, should be pretty safe against 204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * wraparound. 205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_major_number = 0; 207d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_minor_number = 0; 208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington int len; 209aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 210aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson len = _dbus_string_get_length (str); 211aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington while (TRUE) 213aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson { 214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* start out with 1-0, go to 1-1, 1-2, 1-3, 215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * up to 1-MAXINT, then 2-0, 2-1, etc. 216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_minor_number <= 0) 218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington { 219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_major_number += 1; 220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number = 0; 221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_major_number <= 0) 222d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added"); 223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington } 224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_major_number > 0); 226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_minor_number >= 0); 227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* appname:MAJOR-MINOR */ 229d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 230d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append (str, ":")) 231d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 232d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_major_number)) 234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 235d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 236d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append (str, "-")) 237d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 238d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 239d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_minor_number)) 240d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 241d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 242d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number += 1; 243aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 244aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Check if a client with the name exists */ 2456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (bus_registry_lookup (registry, str) == NULL) 246aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson break; 247aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 248d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* drop the number again, try the next one. */ 249aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_set_length (str, len); 250aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson } 251aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 252aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 253aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 254aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 25529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 256a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection, 25729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 25829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 25929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 260aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 261aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString unique_name; 262aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusService *service; 26329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 2646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 26590ed1d84588a84697051e643175452c50d682eceHavoc Pennington 26690ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 268fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&unique_name)) 26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 27229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 273f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 27429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 2756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 2766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!create_unique_client_name (registry, &unique_name)) 27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 28397ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_connection_set_name (connection, &unique_name)) 28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, 29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_get_name (connection))) 29229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 29429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 296d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson 29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_driver_send_welcome_message (connection, message, transaction, error)) 29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29997ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 300aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Create the service */ 3016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_ensure (registry, 3026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington &unique_name, connection, transaction, error); 30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service == NULL) 30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 305ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_service_set_prohibit_replacement (service, TRUE); 307aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 30829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 30929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 31029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0: 311aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_free (&unique_name); 31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 313aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 314aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 31529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 316aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection, 31729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 31829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 320aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 321aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusMessage *welcome; 322aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const char *name; 32390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 32490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 325aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 326aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson name = bus_connection_get_name (connection); 327aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (name != NULL); 328aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 32929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington welcome = dbus_message_new_reply (hello_message); 33029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (welcome == NULL) 33129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 33329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 33429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 33539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 33629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (welcome, 33729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, name, 33829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington NULL)) 33929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 34029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 34129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 345777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, welcome)) 34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 34729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 34829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 35529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 356aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 357aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 359a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection, 36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 363a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 364a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson DBusMessage *reply; 36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int len; 366a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson char **services; 3676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 36890ed1d84588a84697051e643175452c50d682eceHavoc Pennington 36990ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 3706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 3726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_reply (message); 37429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 37629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 379a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 3806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!bus_registry_list_services (registry, &services, &len)) 38129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 38329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 38429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 38529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 38629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 38729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, 388c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, services, len, 38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 39329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 39429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 39639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 399777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 400a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington { 40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 40429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 40529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 40629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 409a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington } 410a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 411a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 41334e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection, 41429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 41529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 41629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 417aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 418ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 419aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString service_name; 420ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson char *name; 421ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson int service_reply; 422ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson int flags; 42329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 4246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 42590ed1d84588a84697051e643175452c50d682eceHavoc Pennington 42690ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 429ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 430c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson if (!dbus_message_get_args (message, error, 43129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 43229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 43329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 43429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 435ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 43629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_verbose ("Trying to own service %s with flags 0x%x\n", name, flags); 4376c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington 4386c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington retval = FALSE; 4396c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington reply = NULL; 440aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 441aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_init_const (&service_name, name); 442ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 4436be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!bus_registry_acquire_service (registry, connection, 4446be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington &service_name, flags, 4456be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington &service_reply, transaction, 4466be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error)) 4476be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 448aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 44929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_reply (message); 45029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 45129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 45229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 454ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson } 45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 4566be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, service_reply, DBUS_TYPE_INVALID)) 45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 45929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 46029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 461ba60374e251cca8fe351b7dd4def595069323885James Willcox 462777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 46329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 46429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 46529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 46829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 46929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 47029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 471ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson dbus_free (name); 47229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 47329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 47429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 47529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 476aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 47729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 478ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection, 47929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 48029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 48129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 482ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 483ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 484ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusString service_name; 485ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson BusService *service; 486ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson char *name; 48729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 4886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 48990ed1d84588a84697051e643175452c50d682eceHavoc Pennington 49090ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 49339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 49429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 49529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 49629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 49729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 498ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 49929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 50029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 501aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson _dbus_string_init_const (&service_name, name); 5026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_lookup (registry, &service_name); 503ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington reply = dbus_message_new_reply (message); 50529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 50629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 50729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 50829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 51029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, 51229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, service != NULL, 51329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 51429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 519777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 52129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 52629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 52729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 52829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 52929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 530aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson dbus_free (name); 53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 53229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 533aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 53439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 53529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 536f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection, 53729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 53829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 53929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 540f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{ 541f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson dbus_uint32_t flags; 542f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson char *name; 54329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 5446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusActivation *activation; 5456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 54690ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 54790ed1d84588a84697051e643175452c50d682eceHavoc Pennington 5486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington activation = bus_connection_get_activation (connection); 549f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 55129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 55329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 554eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 555eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 556eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("No memory to get arguments to ActivateService\n"); 557eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return FALSE; 558eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 559f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 56029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 561f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 562e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!bus_activation_activate_service (activation, connection, transaction, 563e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington message, name, error)) 564eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 565eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 566eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("bus_activation_activate_service() failed\n"); 567eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington goto out; 568eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 56929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 57029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 57129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 57229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 57329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free (name); 57429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 575f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson} 576f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 57729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of 57829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items 57929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow) 58029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 58129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct 58229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 58329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *name; 58429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t (* handler) (DBusConnection *connection, 58529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 58629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 58729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = { 58929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_ACQUIRE_SERVICE, bus_driver_handle_acquire_service }, 59029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_ACTIVATE_SERVICE, bus_driver_handle_activate_service }, 59129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_HELLO, bus_driver_handle_hello }, 59229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_SERVICE_EXISTS, bus_driver_handle_service_exists }, 59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { DBUS_MESSAGE_LIST_SERVICES, bus_driver_handle_list_services } 59429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 59739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection, 59829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 59929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 60029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 60139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 60239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson const char *name, *sender; 60329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int i; 60490ed1d84588a84697051e643175452c50d682eceHavoc Pennington 60590ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 60629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 60739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson _dbus_verbose ("Driver got a message: %s\n", 60839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson dbus_message_get_name (message)); 60939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 61039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson name = dbus_message_get_name (message); 61139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson sender = dbus_message_get_sender (message); 61239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 61339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson if (sender == NULL && (strcmp (name, DBUS_MESSAGE_HELLO) != 0)) 61439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson { 61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington "Client tried to send a message other than %s without being registered", 61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_MESSAGE_HELLO); 61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 61939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson dbus_connection_disconnect (connection); 62029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 62129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 62229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 623777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (dbus_message_get_reply_serial (message) != -1) 624777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington { 625777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington _dbus_verbose ("Client sent a reply to the bus driver, ignoring it\n"); 626777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return TRUE; 627777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington } 628777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington i = 0; 63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (i < _DBUS_N_ELEMENTS (message_handlers)) 63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 63229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (strcmp (message_handlers[i].name, name) == 0) 63329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 634eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Running driver handler for %s\n", name); 63529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if ((* message_handlers[i].handler) (connection, transaction, message, error)) 636eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 637eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 638eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Driver handler succeeded\n"); 639eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return TRUE; 640eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 642eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 643eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 644eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Driver handler returned failure\n"); 645eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return FALSE; 646eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 64729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 64829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 64929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington ++i; 65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 65129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 652eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("No driver handler for %s\n", name); 653eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington 65429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_set_error (error, DBUS_ERROR_UNKNOWN_MESSAGE, 65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington "%s does not understand message %s", 65629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_SERVICE_DBUS, name); 65729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 65829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 659ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 660ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 661ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid 662ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection) 663ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* FIXME Does nothing for now, should unregister the connection 66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * with the bus driver. 66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 66739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 668