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