driver.c revision b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebf
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" 306c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters#include "selinux.h" 31a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h" 3202dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h" 33aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h> 3439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h> 35030cc1e53c6216853e08e27b92f72db80d001873Colin Walters#include <dbus/dbus-marshal-recursive.h> 36aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h> 37aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection, 3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 4329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 4485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieubus_driver_send_service_owner_changed (const char *service_name, 4585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu const char *old_owner, 4685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu const char *new_owner, 4785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu BusTransaction *transaction, 4885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBusError *error) 49a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 5039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson DBusMessage *message; 5129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *null_service; 5390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 5490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington null_service = ""; 578873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_verbose ("sending name owner changed: %s [%s -> %s]\n", 58dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington service_name, 5985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner ? old_owner : null_service, 6085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu new_owner ? new_owner : null_service); 613f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson 62248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_signal (DBUS_PATH_DBUS, 63248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 648873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged"); 65b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 6829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 7029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 7139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 72248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS)) 7385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto oom; 7485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 7585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (!dbus_message_append_args (message, 769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &service_name, 779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, old_owner ? &old_owner : &null_service, 789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, new_owner ? &new_owner : &null_service, 79e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 8085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto oom; 8139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 82dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_assert (dbus_message_has_signature (message, "sss")); 83dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 84a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington retval = bus_dispatch_matches (transaction, NULL, NULL, message, error); 8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 88a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 8985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu oom: 90a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson dbus_message_unref (message); 9185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu BUS_SET_OOM (error); 9285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu return FALSE; 93a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 94a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 96ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection, 9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *service_name, 9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 9929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 100ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 101ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *message; 102ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 10390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 10490ed1d84588a84697051e643175452c50d682eceHavoc Pennington 105248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_signal (DBUS_PATH_DBUS, 106248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 1078873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameLost"); 108b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 11329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 114ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 115b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) || 116b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_append_args (message, 1179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &service_name, 118e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 12029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 12129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 12229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 12329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 12429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 125777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, message)) 12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 13229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 136ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 137ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 13829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 139ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection, 14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *service_name, 14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 14229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 143ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 144ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *message; 145ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 14690ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 14790ed1d84588a84697051e643175452c50d682eceHavoc Pennington 148248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_signal (DBUS_PATH_DBUS, 149248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 1508873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameAcquired"); 151c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (message == NULL) 15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 157ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 158b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (!dbus_message_set_destination (message, bus_connection_get_name (connection)) || 159b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington !dbus_message_append_args (message, 1609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &service_name, 161e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 16229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 16329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 16729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 168777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, message)) 16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (message); 17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 179ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 180ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 181aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t 1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry, 1836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington DBusString *str) 184aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 185d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* We never want to use the same unique client name twice, because 186d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * we want to guarantee that if you send a message to a given unique 187d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * name, you always get the same application. So we use two numbers 188d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * for INT_MAX * INT_MAX combinations, should be pretty safe against 189d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * wraparound. 190d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 191b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington /* FIXME these should be in BusRegistry rather than static vars */ 192d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_major_number = 0; 193d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington static int next_minor_number = 0; 194d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington int len; 195b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington 196aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson len = _dbus_string_get_length (str); 197aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 198d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington while (TRUE) 199aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson { 200d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* start out with 1-0, go to 1-1, 1-2, 1-3, 201d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington * up to 1-MAXINT, then 2-0, 2-1, etc. 202d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington */ 203d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_minor_number <= 0) 204d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington { 205d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_major_number += 1; 206d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number = 0; 207d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (next_major_number <= 0) 208d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added"); 209d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington } 210d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 211d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_major_number > 0); 212d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington _dbus_assert (next_minor_number >= 0); 213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* appname:MAJOR-MINOR */ 215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append (str, ":")) 217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_major_number)) 220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 22275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington if (!_dbus_string_append (str, ".")) 223d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 224d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington if (!_dbus_string_append_int (str, next_minor_number)) 226d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington return FALSE; 227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington 228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington next_minor_number += 1; 229aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 230aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Check if a client with the name exists */ 2316ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (bus_registry_lookup (registry, str) == NULL) 232aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson break; 233aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington /* drop the number again, try the next one. */ 235aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_set_length (str, len); 236aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson } 237aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 238aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson return TRUE; 239aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 240aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 24129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 242a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection, 24329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 24429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 24529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 246aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 247aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString unique_name; 248aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson BusService *service; 24929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 2506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 251983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington BusConnections *connections; 25290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 25390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 254983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington 2551658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (bus_connection_is_active (connection)) 2561658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 2571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu /* We already handled an Hello message for this connection. */ 2581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_set_error (error, DBUS_ERROR_FAILED, 2591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu "Already handled an Hello message"); 2601658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu return FALSE; 2611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 2621658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 263983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington /* Note that when these limits are exceeded we don't disconnect the 264983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * connection; we just sort of leave it hanging there until it times 265983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * out or disconnects itself or is dropped due to the max number of 266983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * incomplete connections. It's even OK if the connection wants to 267983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington * retry the hello message, we support that. 268983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington */ 269983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington connections = bus_connection_get_connections (connection); 270983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington if (!bus_connections_check_limits (connections, connection, 271983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington error)) 272983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington { 273983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 274983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington return FALSE; 275983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington } 27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 277fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&unique_name)) 27829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 282f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 2846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 2856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 2876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!create_unique_client_name (registry, &unique_name)) 28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 29297ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 293e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington if (!bus_connection_complete (connection, &unique_name, error)) 29429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 295e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 29629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, 30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_get_name (connection))) 30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 305d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson 30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_driver_send_welcome_message (connection, message, transaction, error)) 30729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 30897ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson 309aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson /* Create the service */ 3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_ensure (registry, 3116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington &unique_name, connection, transaction, error); 31229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service == NULL) 31329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out_0; 314ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 31529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_service_set_prohibit_replacement (service, TRUE); 316aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 317a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (bus_connection_is_active (connection)); 31829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 32029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0: 321aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_free (&unique_name); 32229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 323aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 324aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 32529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 326aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection, 32729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *hello_message, 32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 32929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 330aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 331aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusMessage *welcome; 332aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson const char *name; 33390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 33490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 336aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson name = bus_connection_get_name (connection); 337aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_assert (name != NULL); 338aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 339b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington welcome = dbus_message_new_method_return (hello_message); 34029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (welcome == NULL) 34129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 34539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (welcome, 3479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &name, 348e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 3555b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _dbus_assert (dbus_message_has_signature (welcome, DBUS_TYPE_STRING_AS_STRING)); 356dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 357777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, welcome)) 35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (welcome); 36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 368aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 369aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 371a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection, 37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 37429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 375a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{ 376a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson DBusMessage *reply; 37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int len; 378a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson char **services; 3796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington int i; 3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter iter; 3829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessageIter sub; 38390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 38490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 3856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 3866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 3876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 388b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 39329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 394a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 3956ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington if (!bus_registry_list_services (registry, &services, &len)) 39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 40029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 4019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 40231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington dbus_message_iter_init_append (reply, &iter); 40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, 4059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING_AS_STRING, 4069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &sub)) 40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 41339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 414970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington { 415970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington /* Include the bus driver in the list */ 416248895207dc15914ac7970a6d1431308075dca1dColin Walters const char *v_STRING = DBUS_SERVICE_DBUS; 417970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING, 418970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington &v_STRING)) 419970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington { 420970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington dbus_free_string_array (services); 421970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington dbus_message_unref (reply); 422970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington BUS_SET_OOM (error); 423970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington return FALSE; 424970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington } 425970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington } 426970be5fda36ea575973a9e7f25389e2ef173b940Havoc Pennington 4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington i = 0; 4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington while (i < len) 4299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 4309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING, 4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington &services[i])) 4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free_string_array (services); 4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (reply); 4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington BUS_SET_OOM (error); 4369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 4379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington ++i; 4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_iter_close_container (&iter, &sub)) 4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_free_string_array (services); 4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (reply); 4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington BUS_SET_OOM (error); 4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 4489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 44929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_free_string_array (services); 45029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 451777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 452a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington { 45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 45429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 45629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 45929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 46029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 461a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington } 462a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson} 463a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson 46429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 46534e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection, 46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 46729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 46829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 469aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{ 470ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 471aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson DBusString service_name; 4729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 473b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen dbus_uint32_t service_reply; 4748a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu dbus_uint32_t flags; 47529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 4766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 47790ed1d84588a84697051e643175452c50d682eceHavoc Pennington 47890ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 4806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 481ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 482c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson if (!dbus_message_get_args (message, error, 48329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 48429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 485e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 48629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 487ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 48898ad8a8ec6626f7f5c78915b6bdf2be688b4839fHavoc Pennington _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags); 4896c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington 4906c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington retval = FALSE; 4916c241c1035a74f9ad4a526424a0be5c816bc61cbHavoc Pennington reply = NULL; 492aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 493aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson _dbus_string_init_const (&service_name, name); 494ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 4956be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!bus_registry_acquire_service (registry, connection, 4966be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington &service_name, flags, 4976be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington &service_reply, transaction, 4986be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington error)) 4996be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 500aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 501b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 50529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 506ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson } 50729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 5089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID)) 50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 51029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 51229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 513ba60374e251cca8fe351b7dd4def595069323885James Willcox 514777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 51929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 52129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 52629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 527aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson 52829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 529b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueenbus_driver_handle_release_service (DBusConnection *connection, 530b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen BusTransaction *transaction, 531b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBusMessage *message, 532b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBusError *error) 533b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen{ 534b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBusMessage *reply; 535b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBusString service_name; 536b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen const char *name; 537b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen dbus_uint32_t service_reply; 538b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen dbus_bool_t retval; 539b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen BusRegistry *registry; 540b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 541b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen _DBUS_ASSERT_ERROR_IS_CLEAR (error); 542b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 543b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen registry = bus_connection_get_registry (connection); 544b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 545b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen if (!dbus_message_get_args (message, error, 546b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBUS_TYPE_STRING, &name, 547b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBUS_TYPE_INVALID)) 548b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen return FALSE; 549b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 550b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen _dbus_verbose ("Trying to release name %s\n", name); 551b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 552b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen retval = FALSE; 553b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen reply = NULL; 554b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 555b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen _dbus_string_init_const (&service_name, name); 556b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 557b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen if (!bus_registry_release_service (registry, connection, 558b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen &service_name, &service_reply, 559b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen transaction, error)) 560b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen goto out; 561b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 562b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen reply = dbus_message_new_method_return (message); 563b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen if (reply == NULL) 564b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen { 565b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen BUS_SET_OOM (error); 566b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen goto out; 567b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen } 568b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 569b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, &service_reply, DBUS_TYPE_INVALID)) 570b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen { 571b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen BUS_SET_OOM (error); 572b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen goto out; 573b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen } 574b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 575b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen if (!bus_transaction_send_from_driver (transaction, connection, reply)) 576b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen { 577b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen BUS_SET_OOM (error); 578b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen goto out; 579b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen } 580b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 581b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen retval = TRUE; 582b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 583b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen out: 584b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen if (reply) 585b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen dbus_message_unref (reply); 586b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen return retval; 587b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen} 588b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen 589b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueenstatic dbus_bool_t 590ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection, 59129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 59229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 594ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 595ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusMessage *reply; 596ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusString service_name; 597ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson BusService *service; 59862e465339a306fa564b69935da494dad6e1b474aHavoc Pennington dbus_bool_t service_exists; 5999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 60029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 6016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 60290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 60390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 6046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 6056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 60639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 60729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 609e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 611ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 6132091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge 614248895207dc15914ac7970a6d1431308075dca1dColin Walters if (strcmp (name, DBUS_SERVICE_DBUS) == 0) 6152091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge { 6162091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge service_exists = TRUE; 6172091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge } 6182091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge else 6192091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge { 6202091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge _dbus_string_init_const (&service_name, name); 6212091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge service = bus_registry_lookup (registry, &service_name); 6222091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge service_exists = service != NULL; 6232091cdd4e1c58318ac75533e2ea4a92292e1783cJon Trowbridge } 62429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 625b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington reply = dbus_message_new_method_return (message); 62629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply == NULL) 62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 63029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 63129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 63229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_append_args (reply, 6339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_BOOLEAN, &service_exists, 63429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 0)) 63529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 63629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 63729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 63829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 63929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 640777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 64229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (error); 64329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 64429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 64529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 64629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 64729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 64829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 64929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (reply) 65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_message_unref (reply); 65129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 65229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 653aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson} 65439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 656f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection, 65729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 65829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 660f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{ 661f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson dbus_uint32_t flags; 6629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t retval; 6646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusActivation *activation; 6656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington 66690ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 66790ed1d84588a84697051e643175452c50d682eceHavoc Pennington 6686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington activation = bus_connection_get_activation (connection); 669f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_get_args (message, error, 67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_STRING, &name, 67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBUS_TYPE_UINT32, &flags, 673e9cb382daf7cef6396d1777c99f27a050f7ad4a8James Willcox DBUS_TYPE_INVALID)) 674eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 675eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 6768873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_verbose ("No memory to get arguments to StartServiceByName\n"); 677eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return FALSE; 678eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 679f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = FALSE; 681f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 68293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!bus_activation_activate_service (activation, connection, transaction, FALSE, 683e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington message, name, error)) 684eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 685eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 686eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("bus_activation_activate_service() failed\n"); 687eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington goto out; 688eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 68929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 69029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington retval = TRUE; 69129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 69229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 69329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return retval; 694f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson} 695f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson 696a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 697a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_ack_reply (DBusConnection *connection, 698a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 699a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 700a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 701a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 702a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *reply; 703a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 704a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington reply = dbus_message_new_method_return (message); 705a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (reply == NULL) 706a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 707a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 708a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 709a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 710a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 711a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_transaction_send_from_driver (transaction, connection, reply)) 712a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 713a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 714a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (reply); 715a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 716a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 717a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 718a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (reply); 719a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 720a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 721a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 722a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 723a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 724a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_add_match (DBusConnection *connection, 725a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 726a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 727a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 728a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 729a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule; 7309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 731a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusString str; 732a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 733a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 734a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 735a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 736a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington text = NULL; 737a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = NULL; 738a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 739a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (bus_connection_get_n_match_rules (connection) >= 740a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_context_get_max_match_rules_per_connection (bus_transaction_get_context (transaction))) 741a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 742a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 743a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "Connection \"%s\" is not allowed to add more match rules " 744a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "(increase limits in configuration file if required)", 745a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_is_active (connection) ? 746a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_get_name (connection) : 747a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "(inactive)"); 748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 750a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 751a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!dbus_message_get_args (message, error, 752a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_STRING, &text, 753a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_INVALID)) 754a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 755a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_verbose ("No memory to get arguments to AddMatch\n"); 756a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 757a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 758a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 759a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_string_init_const (&str, text); 760a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 761a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = bus_match_rule_parse (connection, &str, error); 762a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule == NULL) 763a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 764a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 765a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_connection_get_matchmaker (connection); 766a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 767a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_matchmaker_add_rule (matchmaker, rule)) 768a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 769a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 770a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 771a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 772a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 773a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!send_ack_reply (connection, transaction, 774a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message, error)) 775a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 776a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_matchmaker_remove_rule (matchmaker, rule); 777a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 778a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 779a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 780a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 781a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 782a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 783a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 784a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed: 785a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 786a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule) 787a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 788a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 789a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 790a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 791a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 792a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_driver_handle_remove_match (DBusConnection *connection, 793a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 794a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 795a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 796a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 797a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchRule *rule; 7989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 799a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusString str; 800a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 801a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 802a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 803a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 804a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington text = NULL; 805a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = NULL; 806a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 807a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!dbus_message_get_args (message, error, 808a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_STRING, &text, 809a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_INVALID)) 810a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 811a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_verbose ("No memory to get arguments to RemoveMatch\n"); 812a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 813a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 814a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 815a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_string_init_const (&str, text); 816a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 817a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule = bus_match_rule_parse (connection, &str, error); 818a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule == NULL) 819a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 820a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 821a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* Send the ack before we remove the rule, since the ack is undone 822a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * on transaction cancel, but rule removal isn't. 823a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 824a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!send_ack_reply (connection, transaction, 825a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message, error)) 826a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 827a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 828a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_connection_get_matchmaker (connection); 829a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 830a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_matchmaker_remove_rule_by_value (matchmaker, rule, error)) 831a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto failed; 832a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 833a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 834a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 835a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 836a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 837a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington failed: 838a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 839a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (rule) 840a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_match_rule_unref (rule); 841a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 842a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 843a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 844a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieustatic dbus_bool_t 845a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieubus_driver_handle_get_service_owner (DBusConnection *connection, 846a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BusTransaction *transaction, 847a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusMessage *message, 848a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusError *error) 849a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu{ 8509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 851a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu const char *base_name; 852a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusString str; 853a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BusRegistry *registry; 854a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BusService *service; 855a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBusMessage *reply; 856a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 857a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu _DBUS_ASSERT_ERROR_IS_CLEAR (error); 858a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 859a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu registry = bus_connection_get_registry (connection); 860a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 861a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu text = NULL; 862a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu reply = NULL; 863a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 864a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (! dbus_message_get_args (message, error, 865a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBUS_TYPE_STRING, &text, 866a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBUS_TYPE_INVALID)) 867a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto failed; 868a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 869a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu _dbus_string_init_const (&str, text); 870a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu service = bus_registry_lookup (registry, &str); 87141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (service == NULL && 872248895207dc15914ac7970a6d1431308075dca1dColin Walters _dbus_string_equal_c_str (&str, DBUS_SERVICE_DBUS)) 87341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 87441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington /* ORG_FREEDESKTOP_DBUS owns itself */ 875248895207dc15914ac7970a6d1431308075dca1dColin Walters base_name = DBUS_SERVICE_DBUS; 87641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 87741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington else if (service == NULL) 878a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu { 879a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu dbus_set_error (error, 88041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 88141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington "Could not get owner of name '%s': no such name", text); 882a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto failed; 883a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu } 88441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington else 885a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu { 88641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington base_name = bus_connection_get_name (bus_service_get_primary_owner (service)); 88741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (base_name == NULL) 88841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 88941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington /* FIXME - how is this error possible? */ 89041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington dbus_set_error (error, 89141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_ERROR_FAILED, 89241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington "Could not determine unique name for '%s'", text); 89341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto failed; 89441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 89541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_assert (*base_name == ':'); 896a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu } 89741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 89841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_assert (base_name != NULL); 899a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 900a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu reply = dbus_message_new_method_return (message); 901a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (reply == NULL) 902a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto oom; 903a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 904a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (! dbus_message_append_args (reply, 9059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &base_name, 906a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu DBUS_TYPE_INVALID)) 907a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto oom; 908a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 909a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (! bus_transaction_send_from_driver (transaction, connection, reply)) 910a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu goto oom; 911a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 912a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu dbus_message_unref (reply); 913a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 914a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu return TRUE; 915a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 916a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu oom: 917a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu BUS_SET_OOM (error); 918a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 919a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu failed: 920a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu _DBUS_ASSERT_ERROR_IS_SET (error); 921a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu if (reply) 922a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu dbus_message_unref (reply); 923a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu return FALSE; 924a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu} 925a470eaa0789662d3d3e1f0a23e75c7be2ab574ccOlivier Andrieu 9261919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergstatic dbus_bool_t 9272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieubus_driver_handle_get_connection_unix_user (DBusConnection *connection, 9282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BusTransaction *transaction, 9292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusMessage *message, 9302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusError *error) 9312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{ 9329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service; 9332779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusString str; 9342779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BusRegistry *registry; 9352779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BusService *serv; 9362779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusConnection *conn; 9372779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusMessage *reply; 9382779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu unsigned long uid; 9399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t uid32; 9402779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9412779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _DBUS_ASSERT_ERROR_IS_CLEAR (error); 9422779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9432779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu registry = bus_connection_get_registry (connection); 9442779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9452779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu service = NULL; 9462779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu reply = NULL; 9472779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9482779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (! dbus_message_get_args (message, error, 9492779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_STRING, &service, 9502779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_INVALID)) 9512779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto failed; 9522779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9532779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_verbose ("asked for UID of connection %s\n", service); 9542779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9552779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_string_init_const (&str, service); 9562779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu serv = bus_registry_lookup (registry, &str); 9572779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (serv == NULL) 9582779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 9592779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_set_error (error, 9608873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 9618873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "Could not get UID of name '%s': no such name", service); 9622779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto failed; 9632779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 9642779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu conn = bus_service_get_primary_owner (serv); 9662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu reply = dbus_message_new_method_return (message); 9682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (reply == NULL) 9692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto oom; 9702779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (!dbus_connection_get_unix_user (conn, &uid)) 9722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 9732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_set_error (error, 9742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_ERROR_FAILED, 9752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu "Could not determine UID for '%s'", service); 9762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto failed; 9772779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 9782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington uid32 = uid; 9802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (! dbus_message_append_args (reply, 9819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &uid32, 9822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_INVALID)) 9832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto oom; 9842779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (! bus_transaction_send_from_driver (transaction, connection, reply)) 9862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto oom; 9872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (reply); 9892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return TRUE; 9912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu oom: 9932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu BUS_SET_OOM (error); 9942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 9952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu failed: 9962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _DBUS_ASSERT_ERROR_IS_SET (error); 9972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (reply) 9982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (reply); 9992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return FALSE; 10002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu} 10012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 10022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t 1003c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenbus_driver_handle_get_connection_unix_process_id (DBusConnection *connection, 1004c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BusTransaction *transaction, 1005c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusMessage *message, 1006c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusError *error) 1007c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{ 10089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service; 1009c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusString str; 1010c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BusRegistry *registry; 1011c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BusService *serv; 1012c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusConnection *conn; 1013c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusMessage *reply; 1014c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen unsigned long pid; 10159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t pid32; 1016c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1017c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _DBUS_ASSERT_ERROR_IS_CLEAR (error); 1018c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1019c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen registry = bus_connection_get_registry (connection); 1020c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1021c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen service = NULL; 1022c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen reply = NULL; 1023c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1024c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (! dbus_message_get_args (message, error, 1025c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_STRING, &service, 1026c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_INVALID)) 1027c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto failed; 1028c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1029c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_verbose ("asked for PID of connection %s\n", service); 1030c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1031c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_string_init_const (&str, service); 1032c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen serv = bus_registry_lookup (registry, &str); 1033c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (serv == NULL) 1034c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1035c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_set_error (error, 10368873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 10378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "Could not get PID of name '%s': no such name", service); 1038c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto failed; 1039c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1040c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1041c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen conn = bus_service_get_primary_owner (serv); 1042c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1043c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen reply = dbus_message_new_method_return (message); 1044c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (reply == NULL) 1045c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto oom; 1046c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1047c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!dbus_connection_get_unix_process_id (conn, &pid)) 1048c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1049c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_set_error (error, 1050c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, 1051c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen "Could not determine PID for '%s'", service); 1052c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto failed; 1053c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1054c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 10559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington pid32 = pid; 1056c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (! dbus_message_append_args (reply, 10579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &pid32, 1058c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_INVALID)) 1059c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto oom; 1060c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1061c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (! bus_transaction_send_from_driver (transaction, connection, reply)) 1062c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto oom; 1063c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1064c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (reply); 1065c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1066c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1067c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1068c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen oom: 1069c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen BUS_SET_OOM (error); 1070c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1071c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen failed: 1072c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _DBUS_ASSERT_ERROR_IS_SET (error); 1073c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (reply) 1074c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (reply); 1075c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return FALSE; 1076c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen} 1077c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1078c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t 10799a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Waltersbus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection, 10809a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters BusTransaction *transaction, 10819a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters DBusMessage *message, 10829a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters DBusError *error) 10836c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters{ 10846c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters const char *service; 10856c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBusString str; 10866c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters BusRegistry *registry; 10876c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters BusService *serv; 10886c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBusConnection *conn; 10896c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBusMessage *reply; 10906c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters BusSELinuxID *context; 10916c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 10926c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters _DBUS_ASSERT_ERROR_IS_CLEAR (error); 10936c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 10946c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters registry = bus_connection_get_registry (connection); 10956c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 10966c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters service = NULL; 10976c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters reply = NULL; 10986c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 10996c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters if (! dbus_message_get_args (message, error, 11006c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBUS_TYPE_STRING, &service, 11016c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBUS_TYPE_INVALID)) 11026c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters goto failed; 11036c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11046c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters _dbus_verbose ("asked for security context of connection %s\n", service); 11056c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11066c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters _dbus_string_init_const (&str, service); 11076c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters serv = bus_registry_lookup (registry, &str); 11086c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters if (serv == NULL) 11096c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters { 11106c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters dbus_set_error (error, 11116c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBUS_ERROR_NAME_HAS_NO_OWNER, 11126c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters "Could not get security context of name '%s': no such name", service); 11136c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters goto failed; 11146c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters } 11156c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11166c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters conn = bus_service_get_primary_owner (serv); 11176c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11186c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters reply = dbus_message_new_method_return (message); 11196c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters if (reply == NULL) 11206c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters goto oom; 11216c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11226c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters context = bus_connection_get_selinux_id (conn); 11236c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters if (!context) 11246c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters { 11256c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters dbus_set_error (error, 11269a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN, 11276c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters "Could not determine security context for '%s'", service); 11286c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters goto failed; 11296c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters } 11306c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11319a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters if (! bus_selinux_append_context (reply, context, error)) 11329a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters goto failed; 11336c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11346c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters if (! bus_transaction_send_from_driver (transaction, connection, reply)) 11356c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters goto oom; 11366c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11376c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters dbus_message_unref (reply); 11386c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11396c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters return TRUE; 11406c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11416c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters oom: 11426c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters BUS_SET_OOM (error); 11436c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11446c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters failed: 11456c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters _DBUS_ASSERT_ERROR_IS_SET (error); 11466c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters if (reply) 11476c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters dbus_message_unref (reply); 11486c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters return FALSE; 11496c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters} 11506c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters 11516c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Waltersstatic dbus_bool_t 11521919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsbergbus_driver_handle_reload_config (DBusConnection *connection, 11531919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg BusTransaction *transaction, 11541919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg DBusMessage *message, 11551919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg DBusError *error) 11561919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg{ 11571919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg BusContext *context; 115845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J DBusMessage *reply; 11591919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 11601919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg _DBUS_ASSERT_ERROR_IS_CLEAR (error); 11611919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 116245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J reply = NULL; 116345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J 11641919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg context = bus_connection_get_context (connection); 11651919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg if (!bus_context_reload_config (context, error)) 116645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J goto failed; 11671919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 116845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J reply = dbus_message_new_method_return (message); 116945ef0fbc4f0f5441425484be3662b2c44d2554b3John (J if (reply == NULL) 117045ef0fbc4f0f5441425484be3662b2c44d2554b3John (J goto oom; 117145ef0fbc4f0f5441425484be3662b2c44d2554b3John (J 117245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J if (! bus_transaction_send_from_driver (transaction, connection, reply)) 117345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J goto oom; 117445ef0fbc4f0f5441425484be3662b2c44d2554b3John (J 117545ef0fbc4f0f5441425484be3662b2c44d2554b3John (J dbus_message_unref (reply); 117645ef0fbc4f0f5441425484be3662b2c44d2554b3John (J return TRUE; 117745ef0fbc4f0f5441425484be3662b2c44d2554b3John (J 117845ef0fbc4f0f5441425484be3662b2c44d2554b3John (J oom: 117945ef0fbc4f0f5441425484be3662b2c44d2554b3John (J BUS_SET_OOM (error); 118045ef0fbc4f0f5441425484be3662b2c44d2554b3John (J 118145ef0fbc4f0f5441425484be3662b2c44d2554b3John (J failed: 118245ef0fbc4f0f5441425484be3662b2c44d2554b3John (J _DBUS_ASSERT_ERROR_IS_SET (error); 118345ef0fbc4f0f5441425484be3662b2c44d2554b3John (J if (reply) 118445ef0fbc4f0f5441425484be3662b2c44d2554b3John (J dbus_message_unref (reply); 118545ef0fbc4f0f5441425484be3662b2c44d2554b3John (J return FALSE; 11861919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg} 11871919d92d850f247d70cb6821724c4908bf70eedaKristian Høgsberg 118829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of 118929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items 119029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow) 119129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 119229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct 119329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 119429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington const char *name; 11955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington const char *in_args; 11965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington const char *out_args; 119729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_bool_t (* handler) (DBusConnection *connection, 119829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 119929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 120029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error); 120129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = { 12025b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "RequestName", 12035b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING, 12045b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 12055b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_acquire_service }, 1206b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen { "ReleaseName", 1207b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBUS_TYPE_STRING_AS_STRING, 1208b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen DBUS_TYPE_UINT32_AS_STRING, 1209b5e4d26adec0a9ec37a1bae7aeb5a68344b78ebfRobert McQueen bus_driver_handle_release_service }, 12105b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "StartServiceByName", 12115b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_UINT32_AS_STRING, 12125b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 12135b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_activate_service }, 12145b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "Hello", 12155b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 12165b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12175b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_hello }, 12185b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "NameHasOwner", 12195b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12205b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_BOOLEAN_AS_STRING, 12215b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_service_exists }, 12225b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "ListNames", 12235b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 12245b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING, 12255b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_list_services }, 12265b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "AddMatch", 12275b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12285b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 12295b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_add_match }, 12305b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "RemoveMatch", 12315b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12325b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 12335b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_remove_match }, 12345b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "GetNameOwner", 12355b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12365b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12375b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_get_service_owner }, 12385b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "GetConnectionUnixUser", 12395b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12405b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 12415b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_get_connection_unix_user }, 12425b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "GetConnectionUnixProcessID", 12435b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_STRING_AS_STRING, 12445b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington DBUS_TYPE_UINT32_AS_STRING, 12455b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_get_connection_unix_process_id }, 12469a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters { "GetConnectionSELinuxSecurityContext", 12476c191520c8b33cd7e550a6e3d9d853c25f552f54Colin Walters DBUS_TYPE_STRING_AS_STRING, 12489a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING, 12499a94a1350bb93ea395812dd3c983e13e17c1bcb1Colin Walters bus_driver_handle_get_connection_selinux_security_context }, 12505b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { "ReloadConfig", 12515b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 12525b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "", 12535b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington bus_driver_handle_reload_config } 125429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}; 125529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 125641f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonstatic dbus_bool_t 1257030cc1e53c6216853e08e27b92f72db80d001873Colin Walterswrite_args_for_direction (DBusString *xml, 1258030cc1e53c6216853e08e27b92f72db80d001873Colin Walters const char *signature, 1259030cc1e53c6216853e08e27b92f72db80d001873Colin Walters dbus_bool_t in) 1260030cc1e53c6216853e08e27b92f72db80d001873Colin Walters{ 1261030cc1e53c6216853e08e27b92f72db80d001873Colin Walters DBusTypeReader typereader; 1262030cc1e53c6216853e08e27b92f72db80d001873Colin Walters DBusString sigstr; 1263030cc1e53c6216853e08e27b92f72db80d001873Colin Walters int current_type; 1264030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1265030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_string_init_const (&sigstr, signature); 1266030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_type_reader_init_types_only (&typereader, &sigstr, 0); 1267030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1268030cc1e53c6216853e08e27b92f72db80d001873Colin Walters while ((current_type = _dbus_type_reader_get_current_type (&typereader)) != DBUS_TYPE_INVALID) 1269030cc1e53c6216853e08e27b92f72db80d001873Colin Walters { 1270030cc1e53c6216853e08e27b92f72db80d001873Colin Walters const DBusString *subsig; 1271030cc1e53c6216853e08e27b92f72db80d001873Colin Walters int start, len; 1272030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1273030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_type_reader_get_signature (&typereader, &subsig, &start, &len); 12746180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters if (!_dbus_string_append_printf (xml, " <arg direction=\"%s\" type=\"", 12756180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters in ? "in" : "out")) 12766180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters goto oom; 12776180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters if (!_dbus_string_append_len (xml, 12786180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters _dbus_string_get_const_data (subsig) + start, 12796180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters len)) 12806180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters goto oom; 12816180ae6941aea083f5b8f3c4d3f16c928935bcafColin Walters if (!_dbus_string_append (xml, "\"/>\n")) 1282030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 1283030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1284030cc1e53c6216853e08e27b92f72db80d001873Colin Walters _dbus_type_reader_next (&typereader); 1285030cc1e53c6216853e08e27b92f72db80d001873Colin Walters } 1286030cc1e53c6216853e08e27b92f72db80d001873Colin Walters return TRUE; 1287030cc1e53c6216853e08e27b92f72db80d001873Colin Walters oom: 1288030cc1e53c6216853e08e27b92f72db80d001873Colin Walters return FALSE; 1289030cc1e53c6216853e08e27b92f72db80d001873Colin Walters} 1290030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1291030cc1e53c6216853e08e27b92f72db80d001873Colin Waltersstatic dbus_bool_t 129241f52c96d651003b3d0a266a582d401228a8368eHavoc Penningtonbus_driver_handle_introspect (DBusConnection *connection, 129341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington BusTransaction *transaction, 129441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusMessage *message, 129541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusError *error) 129641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington{ 129741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusString xml; 129841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBusMessage *reply; 129941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington const char *v_STRING; 130085fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington int i; 130141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 130241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_verbose ("Introspect() on bus driver\n"); 130341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 130441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 130541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 130641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington reply = NULL; 130741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 130841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (! dbus_message_get_args (message, error, 130941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_TYPE_INVALID)) 131041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 131141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 131241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return FALSE; 131341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 131441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 131541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_init (&xml)) 131641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington { 131741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington BUS_SET_OOM (error); 131841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return FALSE; 131941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington } 132041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 132141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE)) 132241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 132341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, "<node>\n")) 132441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 1325248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!_dbus_string_append_printf (&xml, " <interface name=\"%s\">\n", DBUS_INTERFACE_INTROSPECTABLE)) 132641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 132741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, " <method name=\"Introspect\">\n")) 132841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 13293dea5c183f65c3f924fb442bf606dfeb50f028a4Colin Walters if (!_dbus_string_append_printf (&xml, " <arg name=\"data\" direction=\"out\" type=\"%s\"/>\n", DBUS_TYPE_STRING_AS_STRING)) 133041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 133141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, " </method>\n")) 133241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 133341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, " </interface>\n")) 133485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington goto oom; 133585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 133685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append_printf (&xml, " <interface name=\"%s\">\n", 1337248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS)) 133885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington goto oom; 133985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 134085fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington i = 0; 134185fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington while (i < _DBUS_N_ELEMENTS (message_handlers)) 134285fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington { 1343030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 134485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append_printf (&xml, " <method name=\"%s\">\n", 134585fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington message_handlers[i].name)) 134685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington goto oom; 134785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 1348030cc1e53c6216853e08e27b92f72db80d001873Colin Walters if (!write_args_for_direction (&xml, message_handlers[i].in_args, TRUE)) 1349030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 1350030cc1e53c6216853e08e27b92f72db80d001873Colin Walters 1351030cc1e53c6216853e08e27b92f72db80d001873Colin Walters if (!write_args_for_direction (&xml, message_handlers[i].out_args, FALSE)) 1352030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 135385fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 135485fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append (&xml, " </method>\n")) 1355030cc1e53c6216853e08e27b92f72db80d001873Colin Walters goto oom; 135685fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 135785fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington ++i; 135885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington } 135966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 136066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <signal name=\"NameOwnerChanged\">\n")) 136166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 136266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 136366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <arg type=\"s\"/>\n")) 136466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 136566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 136666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <arg type=\"s\"/>\n")) 136766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 136866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 136966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <arg type=\"s\"/>\n")) 137066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 137166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 137266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " </signal>\n")) 137366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 137466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 137566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 137666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 137766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <signal name=\"NameLost\">\n")) 137866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 137966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 138066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <arg type=\"s\"/>\n")) 138166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 138266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 138366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " </signal>\n")) 138466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 138566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 138666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 138766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 138866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <signal name=\"NameAcquired\">\n")) 138966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 139066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 139166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " <arg type=\"s\"/>\n")) 139266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 139366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 139466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!_dbus_string_append_printf (&xml, " </signal>\n")) 139566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto oom; 139666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 139766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 139885fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington 139985fb9ff93c91bc500b91759d044e3dfd951c7868Havoc Pennington if (!_dbus_string_append (&xml, " </interface>\n")) 140041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 140141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 140241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (!_dbus_string_append (&xml, "</node>\n")) 140341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 140441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 140541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington reply = dbus_message_new_method_return (message); 140641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (reply == NULL) 140741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 140841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 140941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington v_STRING = _dbus_string_get_const_data (&xml); 141041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (! dbus_message_append_args (reply, 141141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_TYPE_STRING, &v_STRING, 141241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington DBUS_TYPE_INVALID)) 141341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 141441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 141541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (! bus_transaction_send_from_driver (transaction, connection, reply)) 141641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington goto oom; 141741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 141841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington dbus_message_unref (reply); 141941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_string_free (&xml); 142041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 142141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return TRUE; 142241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 142341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington oom: 142441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington BUS_SET_OOM (error); 142541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 142641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (reply) 142741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington dbus_message_unref (reply); 142841f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 142941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington _dbus_string_free (&xml); 143041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 143141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return FALSE; 143241f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington} 143341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 143429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 143539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection, 143629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction, 143729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusMessage *message, 143829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *error) 143939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 144041f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington const char *name, *sender, *interface; 144129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington int i; 144290ed1d84588a84697051e643175452c50d682eceHavoc Pennington 144390ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 144468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 144568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL) 144668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington { 144768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("Driver got a non-method-call message, ignoring\n"); 144868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington return TRUE; /* we just ignore this */ 144968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington } 145068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 145141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (dbus_message_is_method_call (message, 1452248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_INTROSPECTABLE, 145341f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington "Introspect")) 145441f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington return bus_driver_handle_introspect (connection, transaction, message, error); 145541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 145641f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington interface = dbus_message_get_interface (message); 145741f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (interface == NULL) 1458248895207dc15914ac7970a6d1431308075dca1dColin Walters interface = DBUS_INTERFACE_DBUS; 145941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 146068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (dbus_message_get_member (message) != NULL); 146141f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington 146268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington name = dbus_message_get_member (message); 146368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington sender = dbus_message_get_sender (message); 146429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 146541f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington if (strcmp (interface, 1466248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS) != 0) 146768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington { 146868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("Driver got message to unknown interface \"%s\"\n", 146941f52c96d651003b3d0a266a582d401228a8368eHavoc Pennington interface); 147068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington goto unknown; 147168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington } 147268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 147368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("Driver got a method call: %s\n", 147468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington dbus_message_get_member (message)); 147539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 1476e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington /* security checks should have kept this from getting here */ 147768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0); 1478777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 147929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington i = 0; 148029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (i < _DBUS_N_ELEMENTS (message_handlers)) 148129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 148229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (strcmp (message_handlers[i].name, name) == 0) 148329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 14845b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _dbus_verbose ("Found driver handler for %s\n", name); 14855b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington 14865b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington if (!dbus_message_has_signature (message, message_handlers[i].in_args)) 14875b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington { 14885b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 14895b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _dbus_verbose ("Call to %s has wrong args (%s, expected %s)\n", 14905b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington name, dbus_message_get_signature (message), 14915b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington message_handlers[i].in_args); 14925b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington 14935b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, 14945b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington "Call to %s has wrong args (%s, expected %s)\n", 14955b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington name, dbus_message_get_signature (message), 14965b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington message_handlers[i].in_args); 14975b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 14985b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington return FALSE; 14995b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington } 15005b26893cdddddc82dd8d278b9f4bb449f9aac59eHavoc Pennington 150129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if ((* message_handlers[i].handler) (connection, transaction, message, error)) 1502eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 1503eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 1504eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Driver handler succeeded\n"); 1505eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return TRUE; 1506eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 150729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 1508eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington { 1509eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (error); 1510eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington _dbus_verbose ("Driver handler returned failure\n"); 1511eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington return FALSE; 1512eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington } 151329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 151429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 151529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington ++i; 151629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 151729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 151868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington unknown: 151968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington _dbus_verbose ("No driver handler for message \"%s\"\n", 152068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington name); 1521eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington 15221d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD, 152329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington "%s does not understand message %s", 1524248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_SERVICE_DBUS, name); 152529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 152629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 1527ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson} 1528ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 1529ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid 1530ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection) 1531ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{ 153229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* FIXME Does nothing for now, should unregister the connection 153329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * with the bus driver. 153429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 153539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 1536