driver.c revision 030cc1e53c6216853e08e27b92f72db80d001873
1aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson/* -*- mode: C; c-file-style: "gnu" -*- */ 2c414488fe62605ebda5e875fc2db05c6b3dd199fHavoc Pennington/* driver.c Bus client (driver) 3aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * Copyright (C) 2003 CodeFactory AB 55b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington * Copyright (C) 2003, 2004, 2005 Red Hat, Inc. 6aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 8aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 9aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is free software; you can redistribute it and/or modify 10aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * it under the terms of the GNU General Public License as published by 11aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * the Free Software Foundation; either version 2 of the License, or 12aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * (at your option) any later version. 13aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 14aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is distributed in the hope that it will be useful, 15aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of 16aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * GNU General Public License for more details. 18aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 19aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * You should have received a copy of the GNU General Public License 20aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * along with this program; if not, write to the Free Software 21aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * 23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */ 24aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 25f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h" 26aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h" 27aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h" 2839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h" 29aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h" 30a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h" 3102dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h" 32aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h> 3339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h> 34030cc1e53c6216853e08e27b92f72db80d001873Colin Walters#include <dbus/dbus-marshal-recursive.h> 35aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h> 36aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 3729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection, 3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 4385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieubus_driver_send_service_owner_changed (const char *service_name, 4485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu const char *old_owner, 4585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu const char *new_owner, 4685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu BusTransaction *transaction, 4785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBusError *error) 48a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 4939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson DBusMessage *message; 5029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *null_service; 5290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 5390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington null_service = ""; 568873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_verbose ("sending name owner changed: %s [%s -> %s]\n", 57dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington service_name, 5885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner ? old_owner : null_service, 5985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu new_owner ? new_owner : null_service); 603f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson 61248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_signal (DBUS_PATH_DBUS, 62248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 638873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged"); 64b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 6529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 7039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 71248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 7285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto oom; 7385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 7485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (!dbus_message_append_args (message, 759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &service_name, 769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, old_owner ? &old_owner : &null_service, 779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, new_owner ? &new_owner : &null_service, 78e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 7985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto oom; 8039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 81dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_assert (dbus_message_has_signature (message, "sss")); 82dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 83a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington retval = bus_dispatch_matches (transaction, NULL, NULL, message, error); 8429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 87a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 8885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu oom: 89a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson dbus_message_unref (message); 9085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu BUS_SET_OOM (error); 9185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu return FALSE; 92a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 93a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 9429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 95ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection, 9629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *service_name, 9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 99ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 100ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *message; 101ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 10290ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 10390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 104248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_signal (DBUS_PATH_DBUS, 105248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 1068873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameLost"); 107b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 113ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 114b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) || 115b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_append_args (message, 1169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &service_name, 117e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 12229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 12329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 124777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, message)) 12529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 13229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 135ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 136ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 138ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection, 13929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *service_name, 14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 142ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 143ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *message; 144ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 14590ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 14690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 147248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_signal (DBUS_PATH_DBUS, 148248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 1498873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameAcquired"); 150c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 15129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 156ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 157b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) || 158b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_append_args (message, 1599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &service_name, 160e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 16129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 16229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 16329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 167777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, message)) 16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 17029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 178ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 179ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 180aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t 1816ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry, 1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusString *str) 183aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 184d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* We never want to use the same unique client name twice, because 185d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * we want to guarantee that if you send a message to a given unique 186d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * name, you always get the same application. So we use two numbers 187d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * for INT_MAX * INT_MAX combinations, should be pretty safe against 188d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * wraparound. 189d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 190b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* FIXME these should be in BusRegistry rather than static vars */ 191d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_major_number = 0; 192d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_minor_number = 0; 193d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington int len; 194b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 195aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson len = _dbus_string_get_length (str); 196aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 197d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington while (TRUE) 198aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson { 199d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* start out with 1-0, go to 1-1, 1-2, 1-3, 200d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * up to 1-MAXINT, then 2-0, 2-1, etc. 201d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_minor_number <= 0) 203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington { 204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_major_number += 1; 205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number = 0; 206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_major_number <= 0) 207d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added"); 208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington } 209d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 210d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_major_number > 0); 211d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_minor_number >= 0); 212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* appname:MAJOR-MINOR */ 214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append (str, ":")) 216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_major_number)) 219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 22175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (!_dbus_string_append (str, ".")) 222d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_minor_number)) 225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number += 1; 228aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 229aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Check if a client with the name exists */ 2306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (bus_registry_lookup (registry, str) == NULL) 231aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson break; 232aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* drop the number again, try the next one. */ 234aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_set_length (str, len); 235aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson } 236aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 237aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 238aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 239aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 24029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 241a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection, 24229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 24329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 24429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 245aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 246aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString unique_name; 247aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusService *service; 24829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 2496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 250983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnections *connections; 25190ed1d84588a84697051e643175452c50d682eceHavoc Pennington 25290ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 253983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 2541658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (bus_connection_is_active (connection)) 2551658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 2561658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu /* We already handled an Hello message for this connection. */ 2571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_set_error (error, DBUS_ERROR_FAILED, 2581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu "Already handled an Hello message"); 2591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu return FALSE; 2601658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 2611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 262983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Note that when these limits are exceeded we don't disconnect the 263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * connection; we just sort of leave it hanging there until it times 264983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * out or disconnects itself or is dropped due to the max number of 265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * incomplete connections. It's even OK if the connection wants to 266983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * retry the hello message, we support that. 267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections = bus_connection_get_connections (connection); 269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!bus_connections_check_limits (connections, connection, 270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington error)) 271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 276fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&unique_name)) 27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 27829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 281f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 2836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 2846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!create_unique_client_name (registry, &unique_name)) 28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 29197ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 292e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (!bus_connection_complete (connection, &unique_name, error)) 29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 294e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, 29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_get_name (connection))) 30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 304d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson 30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_driver_send_welcome_message (connection, message, transaction, error)) 30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 30797ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 308aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Create the service */ 3096ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_ensure (registry, 3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington &unique_name, connection, transaction, error); 31129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service == NULL) 31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 313ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 31429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_service_set_prohibit_replacement (service, TRUE); 315aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 316a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (bus_connection_is_active (connection)); 31729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 31829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0: 320aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_free (&unique_name); 32129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 322aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 323aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 32429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 325aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection, 32629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 32729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 329aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 330aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusMessage *welcome; 331aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const char *name; 33290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 33390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 334aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson name = bus_connection_get_name (connection); 336aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (name != NULL); 337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 338b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington welcome = dbus_message_new_method_return (hello_message); 33929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (welcome == NULL) 34029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 34129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 34439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 34529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (welcome, 3469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &name, 347e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 34829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 3545b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _dbus_assert (dbus_message_has_signature (welcome, DBUS_TYPE_STRING_AS_STRING)); 355dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 356777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, welcome)) 35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 367aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 368aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 370a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection, 37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 374a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 375a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson DBusMessage *reply; 37629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int len; 377a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson char **services; 3786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 3799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int i; 3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter sub; 38290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 38390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 3846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 3866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 387b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 38829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 393a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 3946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!bus_registry_list_services (registry, &services, &len)) 39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 4009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40131988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (reply, &iter); 40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 4039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, 4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING_AS_STRING, 4059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &sub)) 40629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 41239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 413970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington { 414970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington /* Include the bus driver in the list */ 415248895207dc15914ac7970a6d1431308075dca1dColin Walters const char *v_STRING = DBUS_SERVICE_DBUS; 416970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING, 417970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington &v_STRING)) 418970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington { 419970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington dbus_free_string_array (services); 420970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington dbus_message_unref (reply); 421970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington BUS_SET_OOM (error); 422970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington return FALSE; 423970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington } 424970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington } 425970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington 4269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < len) 4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 4299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING, 4309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &services[i])) 4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free_string_array (services); 4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (reply); 4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington BUS_SET_OOM (error); 4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 4369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 4379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_close_container (&iter, &sub)) 4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free_string_array (services); 4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (reply); 4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington BUS_SET_OOM (error); 4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 44829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 44929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 450777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 451a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington { 45229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 45429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 45629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 45929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 460a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington } 461a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 462a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 46329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 46434e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection, 46529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 468aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 469ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 470aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString service_name; 4719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 472ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson int service_reply; 4738a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu dbus_uint32_t flags; 47429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 4756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 47690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 47790ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4786ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 480ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 481c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson if (!dbus_message_get_args (message, error, 48229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 48329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 484e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 48529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 486ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 48798ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags); 4886c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington 4896c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington retval = FALSE; 4906c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington reply = NULL; 491aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 492aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_init_const (&service_name, name); 493ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 4946be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!bus_registry_acquire_service (registry, connection, 4956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington &service_name, flags, 4966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington &service_reply, transaction, 4976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error)) 4986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 499aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 500b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 50129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 505ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson } 50629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 5079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID)) 50829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 51029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 512ba60374e251cca8fe351b7dd4def595069323885James Willcox 513777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 51429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 51929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 52129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 526aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 52729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 528ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection, 52929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 53029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 532ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 533ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 534ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusString service_name; 535ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson BusService *service; 53662e465339a306fa564b69935da494dad6e1b474aHavoc Pennington dbus_bool_t service_exists; 5379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 53829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 5396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 54090ed1d84588a84697051e643175452c50d682eceHavoc Pennington 54190ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 5426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 5436ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 54439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 54529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 54629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 547e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 549ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 5512091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge 552248895207dc15914ac7970a6d1431308075dca1dColin Walters if (strcmp (name, DBUS_SERVICE_DBUS) == 0) 5532091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge { 5542091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge service_exists = TRUE; 5552091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge } 5562091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge else 5572091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge { 5582091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge _dbus_string_init_const (&service_name, name); 5592091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge service = bus_registry_lookup (registry, &service_name); 5602091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge service_exists = service != NULL; 5612091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge } 56229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 563b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 56429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 56529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 56629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 56729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 56829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 56929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 57029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, 5719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_BOOLEAN, &service_exists, 57229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 57329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 57429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 57529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 57629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 57729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 578777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 57929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 58029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 58129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 58229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 58329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 58429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 58529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 58629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 58729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 58929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 59029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 591aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 59239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 594f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection, 59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 598f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{ 599f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson dbus_uint32_t flags; 6009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 60129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 6026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusActivation *activation; 6036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 60490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 60590ed1d84588a84697051e643175452c50d682eceHavoc Pennington 6066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington activation = bus_connection_get_activation (connection); 607f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 611e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 612eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 613eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 6148873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_verbose ("No memory to get arguments to StartServiceByName\n"); 615eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return FALSE; 616eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 617f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 619f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 62093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!bus_activation_activate_service (activation, connection, transaction, FALSE, 621e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington message, name, error)) 622eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 623eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 624eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("bus_activation_activate_service() failed\n"); 625eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington goto out; 626eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 632f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson} 633f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 634a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 635a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_ack_reply (DBusConnection *connection, 636a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 637a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 638a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 639a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 640a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *reply; 641a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 642a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington reply = dbus_message_new_method_return (message); 643a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (reply == NULL) 644a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 645a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 646a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 647a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 648a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 649a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 650a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 651a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 652a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (reply); 653a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 654a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 655a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 656a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (reply); 657a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 658a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 659a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 660a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 661a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 662a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_add_match (DBusConnection *connection, 663a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 664a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 665a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 666a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 667a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule; 6689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 669a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusString str; 670a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 671a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 672a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 673a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 674a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington text = NULL; 675a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = NULL; 676a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 677a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (bus_connection_get_n_match_rules (connection) >= 678a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction))) 679a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 680a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 681a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "Connection \"%s\" is not allowed to add more match rules " 682a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "(increase limits in configuration file if required)", 683a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_is_active (connection) ? 684a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_get_name (connection) : 685a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "(inactive)"); 686a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 687a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 688a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 689a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!dbus_message_get_args (message, error, 690a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_STRING, &text, 691a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_INVALID)) 692a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 693a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_verbose ("No memory to get arguments to AddMatch\n"); 694a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 695a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 696a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 697a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_string_init_const (&str, text); 698a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 699a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = bus_match_rule_parse (connection, &str, error); 700a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule == NULL) 701a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 702a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 703a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_connection_get_matchmaker (connection); 704a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 705a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_matchmaker_add_rule (matchmaker, rule)) 706a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 707a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 708a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 709a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 710a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 711a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!send_ack_reply (connection, transaction, 712a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message, error)) 713a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 714a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_matchmaker_remove_rule (matchmaker, rule); 715a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 716a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 717a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 718a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 719a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 720a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 721a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 722a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed: 723a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 724a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule) 725a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 726a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 727a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 728a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 729a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 730a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_remove_match (DBusConnection *connection, 731a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 732a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 733a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 734a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 735a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule; 7369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 737a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusString str; 738a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 739a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 740a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 741a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 742a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington text = NULL; 743a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = NULL; 744a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 745a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!dbus_message_get_args (message, error, 746a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_STRING, &text, 747a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_INVALID)) 748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_verbose ("No memory to get arguments to RemoveMatch\n"); 750a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 751a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 752a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 753a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_string_init_const (&str, text); 754a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 755a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = bus_match_rule_parse (connection, &str, error); 756a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule == NULL) 757a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 758a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 759a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* Send the ack before we remove the rule, since the ack is undone 760a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * on transaction cancel, but rule removal isn't. 761a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 762a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!send_ack_reply (connection, transaction, 763a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message, error)) 764a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 765a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 766a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_connection_get_matchmaker (connection); 767a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 768a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error)) 769a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 770a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 771a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 772a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 773a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 774a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 775a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed: 776a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 777a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule) 778a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 779a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 780a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 781a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 782a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieustatic dbus_bool_t 783a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieubus_driver_handle_get_service_owner (DBusConnection *connection, 784a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BusTransaction *transaction, 785a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusMessage *message, 786a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusError *error) 787a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu{ 7889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 789a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu const char *base_name; 790a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusString str; 791a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BusRegistry *registry; 792a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BusService *service; 793a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusMessage *reply; 794a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 795a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu _DBUS_ASSERT_ERROR_IS_CLEAR (error); 796a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 797a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu registry = bus_connection_get_registry (connection); 798a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 799a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu text = NULL; 800a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu reply = NULL; 801a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 802a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (! dbus_message_get_args (message, error, 803a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBUS_TYPE_STRING, &text, 804a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBUS_TYPE_INVALID)) 805a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto failed; 806a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 807a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu _dbus_string_init_const (&str, text); 808a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu service = bus_registry_lookup (registry, &str); 80941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (service == NULL && 810248895207dc15914ac7970a6d1431308075dca1dColin Walters _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS)) 81141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 81241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington /* ORG_FREEDESKTOP_DBUS owns itself */ 813248895207dc15914ac7970a6d1431308075dca1dColin Walters base_name = DBUS_SERVICE_DBUS; 81441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 81541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington else if (service == NULL) 816a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu { 817a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu dbus_set_error (error, 81841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 81941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington "Could not get owner of name '%s': no such name", text); 820a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto failed; 821a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu } 82241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington else 823a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu { 82441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington base_name = bus_connection_get_name (bus_service_get_primary_owner (service)); 82541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (base_name == NULL) 82641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 82741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington /* FIXME - how is this error possible? */ 82841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington dbus_set_error (error, 82941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_ERROR_FAILED, 83041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington "Could not determine unique name for '%s'", text); 83141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto failed; 83241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 83341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_assert (*base_name == ':'); 834a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu } 83541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 83641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_assert (base_name != NULL); 837a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 838a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu reply = dbus_message_new_method_return (message); 839a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (reply == NULL) 840a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto oom; 841a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 842a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (! dbus_message_append_args (reply, 8439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &base_name, 844a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBUS_TYPE_INVALID)) 845a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto oom; 846a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 847a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (! bus_transaction_send_from_driver (transaction, connection, reply)) 848a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto oom; 849a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 850a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu dbus_message_unref (reply); 851a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 852a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu return TRUE; 853a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 854a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu oom: 855a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BUS_SET_OOM (error); 856a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 857a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu failed: 858a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu _DBUS_ASSERT_ERROR_IS_SET (error); 859a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (reply) 860a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu dbus_message_unref (reply); 861a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu return FALSE; 862a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu} 863a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 8641919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergstatic dbus_bool_t 8652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieubus_driver_handle_get_connection_unix_user (DBusConnection *connection, 8662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BusTransaction *transaction, 8672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusMessage *message, 8682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusError *error) 8692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{ 8709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service; 8712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusString str; 8722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BusRegistry *registry; 8732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BusService *serv; 8742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusConnection *conn; 8752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusMessage *reply; 8762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu unsigned long uid; 8779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t uid32; 8782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 8792779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _DBUS_ASSERT_ERROR_IS_CLEAR (error); 8802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 8812779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu registry = bus_connection_get_registry (connection); 8822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 8832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu service = NULL; 8842779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu reply = NULL; 8852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 8862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (! dbus_message_get_args (message, error, 8872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_STRING, &service, 8882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_INVALID)) 8892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto failed; 8902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 8912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_verbose ("asked for UID of connection %s\n", service); 8922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 8932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_string_init_const (&str, service); 8942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu serv = bus_registry_lookup (registry, &str); 8952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (serv == NULL) 8962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 8972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_set_error (error, 8988873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 8998873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "Could not get UID of name '%s': no such name", service); 9002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto failed; 9012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 9022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu conn = bus_service_get_primary_owner (serv); 9042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9052779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu reply = dbus_message_new_method_return (message); 9062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (reply == NULL) 9072779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto oom; 9082779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9092779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (!dbus_connection_get_unix_user (conn, &uid)) 9102779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 9112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_set_error (error, 9122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_ERROR_FAILED, 9132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu "Could not determine UID for '%s'", service); 9142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto failed; 9152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 9162779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington uid32 = uid; 9182779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (! dbus_message_append_args (reply, 9199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &uid32, 9202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_INVALID)) 9212779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto oom; 9222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (! bus_transaction_send_from_driver (transaction, connection, reply)) 9242779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto oom; 9252779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9262779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (reply); 9272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return TRUE; 9292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu oom: 9312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BUS_SET_OOM (error); 9322779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9332779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu failed: 9342779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _DBUS_ASSERT_ERROR_IS_SET (error); 9352779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (reply) 9362779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (reply); 9372779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return FALSE; 9382779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu} 9392779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9402779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t 941c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenbus_driver_handle_get_connection_unix_process_id (DBusConnection *connection, 942c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BusTransaction *transaction, 943c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusMessage *message, 944c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusError *error) 945c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{ 9469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service; 947c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusString str; 948c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BusRegistry *registry; 949c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BusService *serv; 950c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusConnection *conn; 951c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusMessage *reply; 952c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen unsigned long pid; 9539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t pid32; 954c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 955c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _DBUS_ASSERT_ERROR_IS_CLEAR (error); 956c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 957c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen registry = bus_connection_get_registry (connection); 958c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 959c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen service = NULL; 960c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen reply = NULL; 961c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 962c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (! dbus_message_get_args (message, error, 963c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_STRING, &service, 964c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_INVALID)) 965c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto failed; 966c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 967c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_verbose ("asked for PID of connection %s\n", service); 968c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 969c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_string_init_const (&str, service); 970c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen serv = bus_registry_lookup (registry, &str); 971c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (serv == NULL) 972c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 973c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_set_error (error, 9748873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 9758873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "Could not get PID of name '%s': no such name", service); 976c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto failed; 977c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 978c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 979c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen conn = bus_service_get_primary_owner (serv); 980c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 981c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen reply = dbus_message_new_method_return (message); 982c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (reply == NULL) 983c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto oom; 984c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 985c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!dbus_connection_get_unix_process_id (conn, &pid)) 986c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 987c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_set_error (error, 988c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, 989c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen "Could not determine PID for '%s'", service); 990c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto failed; 991c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 992c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 9939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington pid32 = pid; 994c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (! dbus_message_append_args (reply, 9959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &pid32, 996c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_INVALID)) 997c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto oom; 998c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 999c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (! bus_transaction_send_from_driver (transaction, connection, reply)) 1000c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto oom; 1001c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1002c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (reply); 1003c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1004c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1005c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1006c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen oom: 1007c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BUS_SET_OOM (error); 1008c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1009c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen failed: 1010c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _DBUS_ASSERT_ERROR_IS_SET (error); 1011c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (reply) 1012c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (reply); 1013c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return FALSE; 1014c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen} 1015c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1016c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t 10171919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergbus_driver_handle_reload_config (DBusConnection *connection, 10181919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg BusTransaction *transaction, 10191919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg DBusMessage *message, 10201919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg DBusError *error) 10211919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg{ 10221919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg BusContext *context; 10231919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg dbus_bool_t retval; 10241919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 10251919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg _DBUS_ASSERT_ERROR_IS_CLEAR (error); 10261919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 10271919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg retval = FALSE; 10281919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 10291919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg context = bus_connection_get_context (connection); 10301919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg if (!bus_context_reload_config (context, error)) 10311919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg { 10321919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg _DBUS_ASSERT_ERROR_IS_SET (error); 10331919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg goto out; 10341919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg } 10351919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 10361919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg retval = TRUE; 10371919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 10381919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg out: 10391919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg return retval; 10401919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg} 10411919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 104229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of 104329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items 104429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow) 104529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 104629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct 104729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 104829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *name; 10495b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington const char *in_args; 10505b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington const char *out_args; 105129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t (* handler) (DBusConnection *connection, 105229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 105329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 105429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 105529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = { 10565b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "RequestName", 10575b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING, 10585b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 10595b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_acquire_service }, 10605b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "StartServiceByName", 10615b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING, 10625b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 10635b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_activate_service }, 10645b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "Hello", 10655b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 10665b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10675b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_hello }, 10685b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "NameHasOwner", 10695b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10705b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_BOOLEAN_AS_STRING, 10715b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_service_exists }, 10725b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "ListNames", 10735b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 10745b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING, 10755b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_list_services }, 10765b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "AddMatch", 10775b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10785b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 10795b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_add_match }, 10805b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "RemoveMatch", 10815b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10825b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 10835b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_remove_match }, 10845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "GetNameOwner", 10855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_get_service_owner }, 10885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "GetConnectionUnixUser", 10895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 10915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_get_connection_unix_user }, 10925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "GetConnectionUnixProcessID", 10935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 10945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 10955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_get_connection_unix_process_id }, 10965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "ReloadConfig", 10975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 10985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 10995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_reload_config } 110029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 110129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 110241f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonstatic dbus_bool_t 1103030cc1e53c6216853e08e27b92f72db80d001873Colin Walterswrite_args_for_direction (DBusString *xml, 1104030cc1e53c6216853e08e27b92f72db80d001873Colin Walters const char *signature, 1105030cc1e53c6216853e08e27b92f72db80d001873Colin Walters dbus_bool_t in) 1106030cc1e53c6216853e08e27b92f72db80d001873Colin Walters{ 1107030cc1e53c6216853e08e27b92f72db80d001873Colin Walters DBusTypeReader typereader; 1108030cc1e53c6216853e08e27b92f72db80d001873Colin Walters DBusString sigstr; 1109030cc1e53c6216853e08e27b92f72db80d001873Colin Walters int current_type; 1110030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1111030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_string_init_const (&sigstr, signature); 1112030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_type_reader_init_types_only (&typereader, &sigstr, 0); 1113030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1114030cc1e53c6216853e08e27b92f72db80d001873Colin Walters while ((current_type = _dbus_type_reader_get_current_type (&typereader)) != DBUS_TYPE_INVALID) 1115030cc1e53c6216853e08e27b92f72db80d001873Colin Walters { 1116030cc1e53c6216853e08e27b92f72db80d001873Colin Walters const DBusString *subsig; 1117030cc1e53c6216853e08e27b92f72db80d001873Colin Walters int start, len; 1118030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1119030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_type_reader_get_signature (&typereader, &subsig, &start, &len); 1120030cc1e53c6216853e08e27b92f72db80d001873Colin Walters if (!_dbus_string_append_printf (xml, " <arg direction=\"%s\" type=\"%s\"/>\n", in ? "in" : "out", _dbus_string_get_const_data_len (subsig, start, len))) 1121030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 1122030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1123030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_type_reader_next (&typereader); 1124030cc1e53c6216853e08e27b92f72db80d001873Colin Walters } 1125030cc1e53c6216853e08e27b92f72db80d001873Colin Walters return TRUE; 1126030cc1e53c6216853e08e27b92f72db80d001873Colin Walters oom: 1127030cc1e53c6216853e08e27b92f72db80d001873Colin Walters return FALSE; 1128030cc1e53c6216853e08e27b92f72db80d001873Colin Walters} 1129030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1130030cc1e53c6216853e08e27b92f72db80d001873Colin Waltersstatic dbus_bool_t 113141f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonbus_driver_handle_introspect (DBusConnection *connection, 113241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington BusTransaction *transaction, 113341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusMessage *message, 113441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusError *error) 113541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington{ 113641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusString xml; 113741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusMessage *reply; 113841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington const char *v_STRING; 113985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington int i; 114041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 114141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_verbose ("Introspect() on bus driver\n"); 114241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 114341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 114441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 114541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington reply = NULL; 114641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 114741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (! dbus_message_get_args (message, error, 114841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_TYPE_INVALID)) 114941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 115041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 115141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return FALSE; 115241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 115341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 115441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_init (&xml)) 115541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 115641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington BUS_SET_OOM (error); 115741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return FALSE; 115841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 115941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 116041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE)) 116141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 116241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, "<node>\n")) 116341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 1164248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!_dbus_string_append_printf (&xml, " <interface name=\"%s\">\n", DBUS_INTERFACE_INTROSPECTABLE)) 116541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 116641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, " <method name=\"Introspect\">\n")) 116741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 11683dea5c183f65c3f924fb442bf606dfeb50f028a4Colin Walters if (!_dbus_string_append_printf (&xml, " <arg name=\"data\" direction=\"out\" type=\"%s\"/>\n", DBUS_TYPE_STRING_AS_STRING)) 116941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 117041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, " </method>\n")) 117141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 117241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, " </interface>\n")) 117385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington goto oom; 117485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 117585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append_printf (&xml, " <interface name=\"%s\">\n", 1176248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS)) 117785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington goto oom; 117885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 117985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington i = 0; 118085fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington while (i < _DBUS_N_ELEMENTS (message_handlers)) 118185fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington { 1182030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 118385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append_printf (&xml, " <method name=\"%s\">\n", 118485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington message_handlers[i].name)) 118585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington goto oom; 118685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 1187030cc1e53c6216853e08e27b92f72db80d001873Colin Walters if (!write_args_for_direction (&xml, message_handlers[i].in_args, TRUE)) 1188030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 1189030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1190030cc1e53c6216853e08e27b92f72db80d001873Colin Walters if (!write_args_for_direction (&xml, message_handlers[i].out_args, FALSE)) 1191030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 119285fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 119385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append (&xml, " </method>\n")) 1194030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 119585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 119685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington ++i; 119785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington } 119885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 119985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append (&xml, " </interface>\n")) 120041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 120141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 120241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, "</node>\n")) 120341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 120441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 120541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington reply = dbus_message_new_method_return (message); 120641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (reply == NULL) 120741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 120841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 120941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington v_STRING = _dbus_string_get_const_data (&xml); 121041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (! dbus_message_append_args (reply, 121141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_TYPE_STRING, &v_STRING, 121241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_TYPE_INVALID)) 121341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 121441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 121541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (! bus_transaction_send_from_driver (transaction, connection, reply)) 121641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 121741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 121841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington dbus_message_unref (reply); 121941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_string_free (&xml); 122041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 122141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return TRUE; 122241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 122341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington oom: 122441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington BUS_SET_OOM (error); 122541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 122641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (reply) 122741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington dbus_message_unref (reply); 122841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 122941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_string_free (&xml); 123041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 123141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return FALSE; 123241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington} 123341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 123429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 123539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection, 123629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 123729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 123829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 123939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 124041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington const char *name, *sender, *interface; 124129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int i; 124290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 124390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 124468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 124568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL) 124668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington { 124768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("Driver got a non-method-call message, ignoring\n"); 124868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return TRUE; /* we just ignore this */ 124968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington } 125068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 125141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (dbus_message_is_method_call (message, 1252248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_INTROSPECTABLE, 125341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington "Introspect")) 125441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return bus_driver_handle_introspect (connection, transaction, message, error); 125541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 125641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington interface = dbus_message_get_interface (message); 125741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (interface == NULL) 1258248895207dc15914ac7970a6d1431308075dca1dColin Walters interface = DBUS_INTERFACE_DBUS; 125941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 126068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (dbus_message_get_member (message) != NULL); 126141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 126268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington name = dbus_message_get_member (message); 126368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington sender = dbus_message_get_sender (message); 126429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 126541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (strcmp (interface, 1266248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS) != 0) 126768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington { 126868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("Driver got message to unknown interface \"%s\"\n", 126941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington interface); 127068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington goto unknown; 127168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington } 127268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 127368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("Driver got a method call: %s\n", 127468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington dbus_message_get_member (message)); 127539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 1276e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington /* security checks should have kept this from getting here */ 127768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0); 1278777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 127929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington i = 0; 128029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (i < _DBUS_N_ELEMENTS (message_handlers)) 128129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 128229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (strcmp (message_handlers[i].name, name) == 0) 128329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 12845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _dbus_verbose ("Found driver handler for %s\n", name); 12855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington 12865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington if (!dbus_message_has_signature (message, message_handlers[i].in_args)) 12875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { 12885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 12895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _dbus_verbose ("Call to %s has wrong args (%s, expected %s)\n", 12905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington name, dbus_message_get_signature (message), 12915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington message_handlers[i].in_args); 12925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington 12935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 12945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "Call to %s has wrong args (%s, expected %s)\n", 12955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington name, dbus_message_get_signature (message), 12965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington message_handlers[i].in_args); 12975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 12985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington return FALSE; 12995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington } 13005b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington 130129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if ((* message_handlers[i].handler) (connection, transaction, message, error)) 1302eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 1303eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 1304eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Driver handler succeeded\n"); 1305eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return TRUE; 1306eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 130729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 1308eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 1309eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 1310eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Driver handler returned failure\n"); 1311eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return FALSE; 1312eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 131329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 131429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 131529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington ++i; 131629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 131729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 131868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington unknown: 131968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("No driver handler for message \"%s\"\n", 132068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington name); 1321eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington 13221d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD, 132329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington "%s does not understand message %s", 1324248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_SERVICE_DBUS, name); 132529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 132629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 1327ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 1328ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 1329ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid 1330ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection) 1331ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 133229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* FIXME Does nothing for now, should unregister the connection 133329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * with the bus driver. 133429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 133539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 1336