1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson/* dispatch.c Message dispatcher 339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * 439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * Copyright (C) 2003 CodeFactory AB 59c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Copyright (C) 2003, 2004, 2005 Red Hat, Inc. 693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * Copyright (C) 2004 Imendio HB 739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * 843605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 9b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering * 1039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * This program is free software; you can redistribute it and/or modify 1139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * it under the terms of the GNU General Public License as published by 1239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * the Free Software Foundation; either version 2 of the License, or 1339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * (at your option) any later version. 1439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * 1539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * This program is distributed in the hope that it will be useful, 1639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of 1739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * GNU General Public License for more details. 19b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering * 2039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * You should have received a copy of the GNU General Public License 2139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * along with this program; if not, write to the Free Software 225baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 2339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * 2439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson */ 2539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 26dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 2739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h" 2839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "connection.h" 2939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "driver.h" 306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "services.h" 3193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#include "activation.h" 3202dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h" 336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "bus.h" 34a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h" 353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#include "test.h" 3639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h> 3739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <string.h> 3839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 39004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 40004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#include <dbus/dbus-sysdeps-unix.h> 41004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#include <unistd.h> 42004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#endif 43004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 440ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker#ifndef TEST_CONNECTION 450ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker/* 460ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker TODO autotools: 470ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker move to build system as already done for cmake 480ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker*/ 4973b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#ifdef DBUS_UNIX 5073b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#define TEST_CONNECTION "debug-pipe:name=test-server" 5173b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#else 5273b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#define TEST_CONNECTION "tcp:host=localhost,port=1234" 5373b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#endif 540ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker#endif 5573b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker 5629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t 57a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_one_message (DBusConnection *connection, 58a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusContext *context, 59a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *sender, 60a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *addressed_recipient, 61a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 62a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusTransaction *transaction, 63a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 6439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 6564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_context_check_security_policy (context, transaction, 66a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington sender, 67a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington addressed_recipient, 68777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington connection, 69a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message, 70777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington NULL)) 71777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington return TRUE; /* silently don't send it */ 7289f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering 7389f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering if (dbus_message_contains_unix_fds(message) && 7489f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering !dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD)) 7589f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering return TRUE; /* silently don't send it */ 76b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 77a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_transaction_send (transaction, 78777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington connection, 79a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message)) 8029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 81a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 8229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 8329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 8429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 8639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 8739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t 89a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_dispatch_matches (BusTransaction *transaction, 90a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *sender, 91a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *addressed_recipient, 92a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message, 93a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError *error) 9439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError tmp_error; 966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusConnections *connections; 97a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *recipients; 98a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusMatchmaker *matchmaker; 99a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusList *link; 100a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BusContext *context; 10190ed1d84588a84697051e643175452c50d682eceHavoc Pennington 10290ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 103a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 104a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* sender and recipient can both be NULL for the bus driver, 105a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * or for signals with no particular recipient 106a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 107a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 108a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (sender == NULL || bus_connection_is_active (sender)); 10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (dbus_message_get_sender (message) != NULL); 11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1113a2753e667e565f18f124b632fe720b70b018d05Will Thompson context = bus_transaction_get_context (transaction); 1123a2753e667e565f18f124b632fe720b70b018d05Will Thompson 1133a2753e667e565f18f124b632fe720b70b018d05Will Thompson /* First, send the message to the addressed_recipient, if there is one. */ 1143a2753e667e565f18f124b632fe720b70b018d05Will Thompson if (addressed_recipient != NULL) 1153a2753e667e565f18f124b632fe720b70b018d05Will Thompson { 1163a2753e667e565f18f124b632fe720b70b018d05Will Thompson if (!bus_context_check_security_policy (context, transaction, 1173a2753e667e565f18f124b632fe720b70b018d05Will Thompson sender, addressed_recipient, 1183a2753e667e565f18f124b632fe720b70b018d05Will Thompson addressed_recipient, 1193a2753e667e565f18f124b632fe720b70b018d05Will Thompson message, error)) 1203a2753e667e565f18f124b632fe720b70b018d05Will Thompson return FALSE; 1213a2753e667e565f18f124b632fe720b70b018d05Will Thompson 1223a2753e667e565f18f124b632fe720b70b018d05Will Thompson if (dbus_message_contains_unix_fds (message) && 1233a2753e667e565f18f124b632fe720b70b018d05Will Thompson !dbus_connection_can_send_type (addressed_recipient, 1243a2753e667e565f18f124b632fe720b70b018d05Will Thompson DBUS_TYPE_UNIX_FD)) 1253a2753e667e565f18f124b632fe720b70b018d05Will Thompson { 1263a2753e667e565f18f124b632fe720b70b018d05Will Thompson dbus_set_error (error, 1273a2753e667e565f18f124b632fe720b70b018d05Will Thompson DBUS_ERROR_NOT_SUPPORTED, 1283a2753e667e565f18f124b632fe720b70b018d05Will Thompson "Tried to send message with Unix file descriptors" 1293a2753e667e565f18f124b632fe720b70b018d05Will Thompson "to a client that doesn't support that."); 1303a2753e667e565f18f124b632fe720b70b018d05Will Thompson return FALSE; 1313a2753e667e565f18f124b632fe720b70b018d05Will Thompson } 1323a2753e667e565f18f124b632fe720b70b018d05Will Thompson 1333a2753e667e565f18f124b632fe720b70b018d05Will Thompson /* Dispatch the message */ 1343a2753e667e565f18f124b632fe720b70b018d05Will Thompson if (!bus_transaction_send (transaction, addressed_recipient, message)) 1353a2753e667e565f18f124b632fe720b70b018d05Will Thompson { 1363a2753e667e565f18f124b632fe720b70b018d05Will Thompson BUS_SET_OOM (error); 1373a2753e667e565f18f124b632fe720b70b018d05Will Thompson return FALSE; 1383a2753e667e565f18f124b632fe720b70b018d05Will Thompson } 1393a2753e667e565f18f124b632fe720b70b018d05Will Thompson } 1403a2753e667e565f18f124b632fe720b70b018d05Will Thompson 1413a2753e667e565f18f124b632fe720b70b018d05Will Thompson /* Now dispatch to others who look interested in this message */ 1426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington connections = bus_transaction_get_connections (transaction); 14329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_init (&tmp_error); 144a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington matchmaker = bus_context_get_matchmaker (context); 145a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 146a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington recipients = NULL; 14785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (!bus_matchmaker_get_recipients (matchmaker, connections, 148a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington sender, addressed_recipient, message, 149a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington &recipients)) 150a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 151a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington BUS_SET_OOM (error); 152a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 153a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 154a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 155a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington link = _dbus_list_get_first_link (&recipients); 156a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington while (link != NULL) 157a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 158a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *dest; 159a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 160a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dest = link->data; 161a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 162a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!send_one_message (dest, context, sender, addressed_recipient, 163a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message, transaction, &tmp_error)) 164a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington break; 165a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 166a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington link = _dbus_list_get_next_link (&recipients, link); 167a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 169a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_list_clear (&recipients); 170b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (dbus_error_is_set (&tmp_error)) 17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_move_error (&tmp_error, error); 17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return FALSE; 17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington return TRUE; 17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 17929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 1801d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Penningtonstatic DBusHandlerResult 1813bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonbus_dispatch (DBusConnection *connection, 1823bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusMessage *message) 18339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 18495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *sender, *service_name; 18529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError error; 18629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BusTransaction *transaction; 1876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusContext *context; 1881d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington DBusHandlerResult result; 189a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *addressed_recipient; 190b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1911d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington result = DBUS_HANDLER_RESULT_HANDLED; 192b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = NULL; 194a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington addressed_recipient = NULL; 19529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_init (&error); 196b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington context = bus_connection_get_context (connection); 1986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington _dbus_assert (context != NULL); 199b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 20029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* If we can't even allocate an OOM error, we just go to sleep 20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * until we can. 20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington while (!bus_connection_preallocate_oom_error (connection)) 204df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 205b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 20629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Ref connection in case we disconnect it at some point in here */ 20729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_ref (connection); 208b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 209e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Pennington service_name = dbus_message_get_destination (message); 21029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 21195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE 21295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington { 21395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *interface_name, *member_name, *error_name; 21495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 21595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington interface_name = dbus_message_get_interface (message); 21695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington member_name = dbus_message_get_member (message); 21795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington error_name = dbus_message_get_error_name (message); 218b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 21995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington _dbus_verbose ("DISPATCH: %s %s %s to %s\n", 22095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington interface_name ? interface_name : "(no interface)", 22195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington member_name ? member_name : "(no member)", 22295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington error_name ? error_name : "(no error name)", 22395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington service_name ? service_name : "peer"); 22495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington } 22595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington#endif /* DBUS_ENABLE_VERBOSE_MODE */ 226b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 227a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* If service_name is NULL, if it's a signal we send it to all 22875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * connections with a match rule. If it's not a signal, there 22975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * are some special cases here but mostly we just bail out. 23029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 23129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (service_name == NULL) 232a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 23368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_signal (message, 234248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_LOCAL, 23568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington "Disconnected")) 236a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 237a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington bus_connection_disconnected (connection); 238a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 239a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 24029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 241a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL) 242a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 243a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* DBusConnection also handles some of these automatically, we leave 244a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * it to do so. 245a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 246a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 247a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 248a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 24929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 250b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 25129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Create our transaction */ 2526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington transaction = bus_transaction_new (context); 25329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction == NULL) 25429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 25529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (&error); 25629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 25729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 258b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 25929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Assign a sender to the message */ 26029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (bus_connection_is_active (connection)) 261fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson { 26229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington sender = bus_connection_get_name (connection); 26329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (sender != NULL); 26473d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson 26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_message_set_sender (message, sender)) 26629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington BUS_SET_OOM (&error); 26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington goto out; 26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 27073d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson 27173d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson /* We need to refetch the service name here, because 27273d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson * dbus_message_set_sender can cause the header to be 27373d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson * reallocated, and thus the service_name pointer will become 27473d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson * invalid. 27573d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson */ 276e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Pennington service_name = dbus_message_get_destination (message); 277fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson } 278b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 279a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (service_name && 280248895207dc15914ac7970a6d1431308075dca1dColin Walters strcmp (service_name, DBUS_SERVICE_DBUS) == 0) /* to bus driver */ 28139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson { 28264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington if (!bus_context_check_security_policy (context, transaction, 283a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington connection, NULL, NULL, message, &error)) 284e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington { 285e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Security policy rejected message\n"); 286e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington goto out; 287e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington } 288e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington 289248895207dc15914ac7970a6d1431308075dca1dColin Walters _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS); 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_driver_handle_message (connection, transaction, message, &error)) 291e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington goto out; 29239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson } 29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */ 29439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson { 29539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson _dbus_verbose ("Received message from non-registered client. Disconnecting.\n"); 29611fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 297a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 29839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson } 299a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else if (service_name != NULL) /* route to named service */ 30039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson { 301ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson DBusString service_string; 302ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson BusService *service; 3036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington BusRegistry *registry; 304ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 305a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (service_name != NULL); 306b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington registry = bus_connection_get_registry (connection); 308b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 309ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson _dbus_string_init_const (&service_string, service_name); 3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington service = bus_registry_lookup (registry, &service_string); 311ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 3128873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (service == NULL && dbus_message_get_auto_start (message)) 31393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 314075945f611290f2b9db9a4ed6cf5433f2fd85785John (J BusActivation *activation; 315075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* We can't do the security policy check here, since the addressed 316075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * recipient service doesn't exist yet. We do it before sending the 317075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * message after the service has been created. 318075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 319075945f611290f2b9db9a4ed6cf5433f2fd85785John (J activation = bus_connection_get_activation (connection); 320075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 321075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!bus_activation_activate_service (activation, connection, transaction, TRUE, 322075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message, service_name, &error)) 323075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3240d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&error); 3255e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin _dbus_verbose ("bus_activation_activate_service() failed: %s\n", error.name); 326075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 327075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 328b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 329075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 330075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 33193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else if (service == NULL) 33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 333777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_set_error (&error, 3348873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_NAME_HAS_NO_OWNER, 3358873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "Name \"%s\" does not exist", 336777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington service_name); 337777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington goto out; 33829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 33929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 340075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3411a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J addressed_recipient = bus_service_get_primary_owners_connection (service); 342a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (addressed_recipient != NULL); 34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 345a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 3463a2753e667e565f18f124b632fe720b70b018d05Will Thompson /* Now send the message to its destination (or not, if 3473a2753e667e565f18f124b632fe720b70b018d05Will Thompson * addressed_recipient == NULL), and match it against other connections' 3483a2753e667e565f18f124b632fe720b70b018d05Will Thompson * match rules. 349a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 350a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!bus_dispatch_matches (transaction, connection, addressed_recipient, message, &error)) 351a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 352b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out: 35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (dbus_error_is_set (&error)) 35529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* If we disconnected it, we won't bother to send it any error 35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * messages. 36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 361e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington _dbus_verbose ("Not sending error to connection we disconnected\n"); 36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_send_oom_error (connection, message); 36650137daea3b57a6f862691dad4f412bcc041e9bbAnders Carlsson 36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* cancel transaction due to OOM */ 36829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction != NULL) 36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_transaction_cancel_and_free (transaction); 37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = NULL; 37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 37450137daea3b57a6f862691dad4f412bcc041e9bbAnders Carlsson else 37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 37629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* Try to send the real error, if no mem to do that, send 37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * the OOM error 37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 37929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington _dbus_assert (transaction != NULL); 38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (!bus_transaction_send_error_reply (transaction, connection, 38129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington &error, message)) 38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 38329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_connection_send_oom_error (connection, message); 384b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 38529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington /* cancel transaction due to OOM */ 38629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction != NULL) 38729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 38829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_transaction_cancel_and_free (transaction); 38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington transaction = NULL; 39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 393b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 394b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_free (&error); 39639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson } 39739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (transaction != NULL) 39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 40029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington bus_transaction_execute_and_free (transaction); 40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_connection_unref (connection); 4041d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 4051d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington return result; 4063bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 4073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 4083bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic DBusHandlerResult 4091dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Penningtonbus_dispatch_message_filter (DBusConnection *connection, 4101dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington DBusMessage *message, 4111dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington void *user_data) 4123bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 4131d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington return bus_dispatch (connection, message); 41439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 41539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 416ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtondbus_bool_t 417ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonbus_dispatch_add_connection (DBusConnection *connection) 418b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering{ 4191dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington if (!dbus_connection_add_filter (connection, 4201dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington bus_dispatch_message_filter, 4211dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington NULL, NULL)) 422ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return FALSE; 423b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 42439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson return TRUE; 42539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson} 42639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson 42739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonvoid 42839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_dispatch_remove_connection (DBusConnection *connection) 42939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{ 43039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson /* Here we tell the bus driver that we want to get off. */ 43139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson bus_driver_remove_connection (connection); 432ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson 4331dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington dbus_connection_remove_filter (connection, 4341dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington bus_dispatch_message_filter, 4351dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington NULL); 436ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 4373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 4383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#ifdef DBUS_BUILD_TESTS 4393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 44093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#include <stdio.h> 44193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 442dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington/* This is used to know whether we need to block in order to finish 443dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington * sending a message, or whether the initial dbus_connection_send() 444dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington * already flushed the queue. 445dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington */ 446dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington#define SEND_PENDING(connection) (dbus_connection_has_messages_to_send (connection)) 447dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 448f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtontypedef dbus_bool_t (* Check1Func) (BusContext *context); 449f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtontypedef dbus_bool_t (* Check2Func) (BusContext *context, 450f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusConnection *connection); 451f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 452ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t check_no_leftovers (BusContext *context); 453ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 45451781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic void 45551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonblock_connection_until_message_from_bus (BusContext *context, 456dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington DBusConnection *connection, 457dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington const char *what_is_expected) 45851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington{ 459dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_verbose ("expecting: %s\n", what_is_expected); 460b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 46151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington while (dbus_connection_get_dispatch_status (connection) == 46251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington DBUS_DISPATCH_COMPLETE && 46351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_connection_get_is_connected (connection)) 46451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 46551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington bus_test_run_bus_loop (context, TRUE); 46651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington bus_test_run_clients_loop (FALSE); 46751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 46851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington} 46951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 470dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Penningtonstatic void 471dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Penningtonspin_connection_until_authenticated (BusContext *context, 472dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington DBusConnection *connection) 473dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington{ 474dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_verbose ("Spinning to auth connection %p\n", connection); 475dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington while (!dbus_connection_get_is_authenticated (connection) && 476dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_get_is_connected (connection)) 477dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington { 478dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_bus_loop (context, FALSE); 479dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (FALSE); 480dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington } 481dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_verbose (" ... done spinning to auth connection %p\n", connection); 482dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington} 483dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington 48451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington/* compensate for fact that pop_message() can return #NULL due to OOM */ 48551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic DBusMessage* 48651781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonpop_message_waiting_for_memory (DBusConnection *connection) 48751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington{ 48851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington while (dbus_connection_get_dispatch_status (connection) == 48951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington DBUS_DISPATCH_NEED_MEMORY) 49051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_wait_for_memory (); 49151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 49251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington return dbus_connection_pop_message (connection); 49351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington} 49451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 495fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieustatic DBusMessage* 496fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieuborrow_message_waiting_for_memory (DBusConnection *connection) 497fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu{ 498fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu while (dbus_connection_get_dispatch_status (connection) == 499fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu DBUS_DISPATCH_NEED_MEMORY) 500fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu _dbus_wait_for_memory (); 501fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu 502fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu return dbus_connection_borrow_message (connection); 503fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu} 504fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu 50568a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtonstatic void 506d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Penningtonwarn_unexpected_real (DBusConnection *connection, 507d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington DBusMessage *message, 508d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington const char *expected, 509d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington const char *function, 510d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington int line) 51168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington{ 512bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (message) 513bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n", 514bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington function, line, 515bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_interface (message) ? 516bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_interface (message) : "(unset)", 517bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_member (message) ? 518bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_member (message) : "(unset)", 519bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_error_name (message) ? 520bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_error_name (message) : "(unset)", 521bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington connection, 522bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington expected); 523bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington else 524bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington _dbus_warn ("%s:%d received no message on %p, expecting %s\n", 525bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington function, line, connection, expected); 52668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington} 52768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 528d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington#define warn_unexpected(connection, message, expected) \ 529d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington warn_unexpected_real (connection, message, expected, _DBUS_FUNCTION_NAME, __LINE__) 530d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington 531d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Penningtonstatic void 532d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Penningtonverbose_message_received (DBusConnection *connection, 533d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington DBusMessage *message) 534d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington{ 535d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington _dbus_verbose ("Received message interface \"%s\" member \"%s\" error name \"%s\" on %p\n", 536d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington dbus_message_get_interface (message) ? 537d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington dbus_message_get_interface (message) : "(unset)", 538d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington dbus_message_get_member (message) ? 539d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington dbus_message_get_member (message) : "(unset)", 540d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington dbus_message_get_error_name (message) ? 541d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington dbus_message_get_error_name (message) : "(unset)", 542d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington connection); 543d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington} 544d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington 54585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieutypedef enum 54685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu{ 54785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu SERVICE_CREATED, 54885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu OWNER_CHANGED, 54985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu SERVICE_DELETED 55085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} ServiceInfoKind; 55185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 552ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtontypedef struct 553ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 55485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu ServiceInfoKind expected_kind; 555ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington const char *expected_service_name; 556ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t failed; 55785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBusConnection *skip_connection; 55885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} CheckServiceOwnerChangedData; 559ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 560ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t 56185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieucheck_service_owner_changed_foreach (DBusConnection *connection, 562075945f611290f2b9db9a4ed6cf5433f2fd85785John (J void *data) 563ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 56485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData *d = data; 565ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusMessage *message; 566ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusError error; 5679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service_name, *old_owner, *new_owner; 56885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 569b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering if (d->expected_kind == SERVICE_CREATED 57085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu && connection == d->skip_connection) 57185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu return TRUE; 572ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 573ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_init (&error); 574ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington d->failed = TRUE; 575b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 57651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 577ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (message == NULL) 578ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 579ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_warn ("Did not receive a message on %p, expecting %s\n", 5808873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington connection, "NameOwnerChanged"); 581ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 582ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 58368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington else if (!dbus_message_is_signal (message, 584248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 5858873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged")) 586ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 5878873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington warn_unexpected (connection, message, "NameOwnerChanged"); 58868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 589ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 590ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 591ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 592ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 59385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu reget_service_info_data: 59485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu service_name = NULL; 59585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner = NULL; 59685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu new_owner = NULL; 59785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 59885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_message_get_args (message, &error, 59985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &service_name, 60085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &old_owner, 60185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &new_owner, 60285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_INVALID); 60385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 60485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (dbus_error_is_set (&error)) 605075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 606075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 607075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 60885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_error_free (&error); 609b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_wait_for_memory (); 61085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto reget_service_info_data; 611075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 612075945f611290f2b9db9a4ed6cf5433f2fd85785John (J else 613075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 614075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Did not get the expected arguments\n"); 615075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 616075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 617075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 61885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 61985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if ((d->expected_kind == SERVICE_CREATED && ( old_owner[0] || !new_owner[0])) 62085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu || (d->expected_kind == OWNER_CHANGED && (!old_owner[0] || !new_owner[0])) 62185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu || (d->expected_kind == SERVICE_DELETED && (!old_owner[0] || new_owner[0]))) 622ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 623cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen _dbus_warn ("inconsistent NameOwnerChanged arguments\n"); 62485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 625ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 62685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 62785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (strcmp (service_name, d->expected_service_name) != 0) 628ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 62985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("expected info on service %s, got info on %s\n", 630ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington d->expected_service_name, 631ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington service_name); 632ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 633ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 63485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 635b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering if (*service_name == ':' && new_owner[0] 63685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu && strcmp (service_name, new_owner) != 0) 63785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 63885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("inconsistent ServiceOwnedChanged message (\"%s\" [ %s -> %s ])\n", 63985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu service_name, old_owner, new_owner); 64085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 64185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 642ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 643ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 644ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington d->failed = FALSE; 645b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 646ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out: 647ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 648b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 649ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (message) 650ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_unref (message); 651ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 652ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return !d->failed; 653ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 654ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 65585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 656f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonstatic void 657ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonkill_client_connection (BusContext *context, 658ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusConnection *connection) 659f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{ 660ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington char *base_service; 661ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington const char *s; 66285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData socd; 663ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 664ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("killing connection %p\n", connection); 665b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 6668873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington s = dbus_bus_get_unique_name (connection); 667ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert (s != NULL); 668ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 669ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington while ((base_service = _dbus_strdup (s)) == NULL) 670df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 671ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 672ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_ref (connection); 673b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 674f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington /* kick in the disconnect handler that unrefs the connection */ 67511fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 676ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 6771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_test_run_everything (context); 678b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 679ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert (bus_test_client_listed (connection)); 680b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 681ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington /* Run disconnect handler in test.c */ 682ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington if (bus_connection_dispatch_one_message (connection)) 683ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("something received on connection being killed other than the disconnect"); 684b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 685ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert (!dbus_connection_get_is_connected (connection)); 686ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_connection_unref (connection); 687ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington connection = NULL; 688ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert (!bus_test_client_listed (connection)); 689b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 69085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_DELETED; 69185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = base_service; 69285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 69385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.skip_connection = NULL; 694b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 69585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 69685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu &socd); 697ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 698ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_free (base_service); 699b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 70085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 7018873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_assert_not_reached ("didn't get the expected NameOwnerChanged (deletion) messages"); 702b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 703ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!check_no_leftovers (context)) 704ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("stuff left in message queues after disconnecting a client"); 705ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 706ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 707f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void 708f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonkill_client_connection_unchecked (DBusConnection *connection) 709f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{ 710f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington /* This kills the connection without expecting it to affect 711f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington * the rest of the bus. 712b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering */ 713f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_verbose ("Unchecked kill of connection %p\n", connection); 714f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 715f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_connection_ref (connection); 71611fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 717f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington /* dispatching disconnect handler will unref once */ 718f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington if (bus_connection_dispatch_one_message (connection)) 719f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert_not_reached ("message other than disconnect dispatched after failure to register"); 720777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 721f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_assert (!bus_test_client_listed (connection)); 722777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_connection_unref (connection); 723f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington} 724f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 725ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtontypedef struct 726ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 727ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_bool_t failed; 728ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} CheckNoMessagesData; 729ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 730ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t 731ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtoncheck_no_messages_foreach (DBusConnection *connection, 732ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington void *data) 733ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 734ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington CheckNoMessagesData *d = data; 735ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBusMessage *message; 736ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 73751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 738ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (message != NULL) 739ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 74068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, "no messages"); 74168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 742ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington d->failed = TRUE; 743ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 744ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 745ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (message) 746ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_message_unref (message); 747ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return !d->failed; 748ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} 749ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 750ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t 751ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtoncheck_no_leftovers (BusContext *context) 752ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{ 753ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington CheckNoMessagesData nmd; 754ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 755ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington nmd.failed = FALSE; 756ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_test_clients_foreach (check_no_messages_foreach, 757ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington &nmd); 758b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 759ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (nmd.failed) 7609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington { 761d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("leftover message found\n"); 7629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington return FALSE; 7639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington } 764ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 765ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington return TRUE; 766f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington} 767f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 7684c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington/* returns TRUE if the correct thing happens, 7694c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington * but the correct thing may include OOM errors. 7704c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington */ 7713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t 7723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtoncheck_hello_message (BusContext *context, 7733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusConnection *connection) 7743bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 7753bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusMessage *message; 7769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *name_message; 777a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_uint32_t serial; 778f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_bool_t retval; 779f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusError error; 7809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *name; 7819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *acquired; 782777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 783777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington retval = FALSE; 784f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_error_init (&error); 785ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington name = NULL; 786ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington acquired = NULL; 787777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington message = NULL; 7889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington name_message = NULL; 789a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 790a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_verbose ("check_hello_message for %p\n", connection); 791b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 792248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 793248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 794248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 7955fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington "Hello"); 7963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 7973bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (message == NULL) 7984c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington return TRUE; 7993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 800dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_ref (connection); /* because we may get disconnected */ 801b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 8023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (!dbus_connection_send (connection, message, &serial)) 803f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington { 804f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington dbus_message_unref (message); 805dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_unref (connection); 806f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington return TRUE; 807f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington } 8084c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 809dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_assert (dbus_message_has_signature (message, "")); 810b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 8114c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington dbus_message_unref (message); 812f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington message = NULL; 8131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 814dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 815dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington { 816dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_verbose ("connection was disconnected (presumably auth failed)\n"); 817b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 818dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_unref (connection); 819b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 820dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington return TRUE; 821dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington } 822b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 823777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington /* send our message */ 824dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (SEND_PENDING (connection)); 825777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 826dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 827dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington { 828dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_verbose ("connection was disconnected (presumably auth failed)\n"); 829b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 830dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_unref (connection); 831b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 832dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington return TRUE; 833dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington } 834b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 835dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to Hello"); 8363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 837f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 838f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 839dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington _dbus_verbose ("connection was disconnected (presumably auth failed)\n"); 840b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 841777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_connection_unref (connection); 842b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 843f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return TRUE; 844f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 845777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 846777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_connection_unref (connection); 847b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 84851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 8494c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington if (message == NULL) 8504c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington { 8514c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington _dbus_warn ("Did not receive a reply to %s %d on %p\n", 85268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington "Hello", serial, connection); 853f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 8544c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington } 8554c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington 856d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington verbose_message_received (connection, message); 857f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 858248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 859e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 860e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington _dbus_warn ("Message has wrong sender %s\n", 861e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_get_sender (message) ? 862e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_get_sender (message) : "(none)"); 863e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington goto out; 864e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 865b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 866b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 867f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 86868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_error (message, 8691820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington DBUS_ERROR_NO_MEMORY)) 870f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 871f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington ; /* good, this is a valid response */ 872f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 873f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington else 874f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 87568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, "not this error"); 87668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 877f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 878f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 879f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 880f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington else 881f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 88285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData socd; 883b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 88468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) 885f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 886f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington ; /* good, expected */ 887f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 888f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington else 889f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 89068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, "method return for Hello"); 89168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 892f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 893f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 894f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 895ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry_get_hello_name: 896f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!dbus_message_get_args (message, &error, 897ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBUS_TYPE_STRING, &name, 898f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBUS_TYPE_INVALID)) 899f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 900ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 901ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 902ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("no memory to get service name arg from hello\n"); 903ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 904df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 905ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry_get_hello_name; 906ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 907ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 908ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 909ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert (dbus_error_is_set (&error)); 910ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_warn ("Did not get the expected single string argument to hello\n"); 911ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 912ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 913ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 914ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 915ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("Got hello name: %s\n", name); 916ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 9178873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington while (!dbus_bus_set_unique_name (connection, name)) 918df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 919b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 92085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_CREATED; 92185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = name; 92285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 92385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.skip_connection = connection; /* we haven't done AddMatch so won't get it ourselves */ 92485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 92585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu &socd); 926b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 92785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 928ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 9299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 9309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington name_message = message; 931ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington /* Client should also have gotten ServiceAcquired */ 9329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 93351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 934ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (message == NULL) 935ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 936ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_warn ("Expecting %s, got nothing\n", 9378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameAcquired"); 938f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington goto out; 939f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 940248895207dc15914ac7970a6d1431308075dca1dColin Walters if (! dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, 941075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "NameAcquired")) 94285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 94385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Expecting %s, got smthg else\n", 9448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameAcquired"); 94585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 94685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 947b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 948ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington retry_get_acquired_name: 949ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!dbus_message_get_args (message, &error, 950ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBUS_TYPE_STRING, &acquired, 951ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington DBUS_TYPE_INVALID)) 952ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 953ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 954ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 955ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("no memory to get service name arg from acquired\n"); 956ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington dbus_error_free (&error); 957df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington _dbus_wait_for_memory (); 958ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto retry_get_acquired_name; 959ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 960ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 961ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 962ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert (dbus_error_is_set (&error)); 963ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_warn ("Did not get the expected single string argument to ServiceAcquired\n"); 964ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 965ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 966ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 967ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 968ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_verbose ("Got acquired name: %s\n", acquired); 969f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 970ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (strcmp (acquired, name) != 0) 971ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 972ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_warn ("Acquired name is %s but expected %s\n", 973ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington acquired, name); 974ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 975ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 9769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington acquired = NULL; 977f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 978ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 979ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!check_no_leftovers (context)) 980ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington goto out; 981b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 982f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington retval = TRUE; 983b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 984f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington out: 985d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("ending - retval = %d\n", retval); 986b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 9879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_error_free (&error); 988b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 989f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (message) 990f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_message_unref (message); 9919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 9929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (name_message) 9939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (name_message); 994b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 995f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return retval; 996f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington} 997f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 998f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington/* returns TRUE if the correct thing happens, 999f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington * but the correct thing may include OOM errors. 1000f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington */ 1001f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonstatic dbus_bool_t 10021658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieucheck_double_hello_message (BusContext *context, 10031658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu DBusConnection *connection) 10041658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu{ 10051658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu DBusMessage *message; 10061658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_uint32_t serial; 10071658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_bool_t retval; 10081658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu DBusError error; 10091658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10101658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu retval = FALSE; 10111658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_error_init (&error); 10121658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu message = NULL; 10131658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10141658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu _dbus_verbose ("check_double_hello_message for %p\n", connection); 1015b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1016248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 1017248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 1018248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 10191658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu "Hello"); 10201658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10211658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (message == NULL) 10221658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu return TRUE; 1023b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10241658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (!dbus_connection_send (connection, message, &serial)) 10251658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 10261658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_message_unref (message); 10271658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu return TRUE; 10281658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 10291658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10301658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_message_unref (message); 10311658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu message = NULL; 10321658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10331658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu /* send our message */ 1034dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (SEND_PENDING (connection)); 10351658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10361658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_connection_ref (connection); /* because we may get disconnected */ 1037dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to Hello"); 10381658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10391658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (!dbus_connection_get_is_connected (connection)) 10401658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 1041d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 1042b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10431658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_connection_unref (connection); 1044b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10451658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu return TRUE; 10461658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 10471658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10481658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_connection_unref (connection); 1049b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10501658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu message = pop_message_waiting_for_memory (connection); 10511658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (message == NULL) 10521658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 10531658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu _dbus_warn ("Did not receive a reply to %s %d on %p\n", 10541658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu "Hello", serial, connection); 10551658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu goto out; 10561658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 10571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu verbose_message_received (connection, message); 10591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 1060248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 10611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 10621658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu _dbus_warn ("Message has wrong sender %s\n", 10631658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_message_get_sender (message) ? 10641658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_message_get_sender (message) : "(none)"); 10651658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu goto out; 10661658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 1067b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10681658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) 10691658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu { 10701658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu warn_unexpected (connection, message, "method return for Hello"); 10711658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu goto out; 10721658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu } 10731658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10741658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (!check_no_leftovers (context)) 10751658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu goto out; 1076b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10771658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu retval = TRUE; 1078b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10791658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu out: 10801658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_error_free (&error); 1081b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10821658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (message) 10831658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_message_unref (message); 1084b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 10851658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu return retval; 10861658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu} 10871658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 10881658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu/* returns TRUE if the correct thing happens, 10891658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu * but the correct thing may include OOM errors. 10901658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu */ 10911658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieustatic dbus_bool_t 10922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieucheck_get_connection_unix_user (BusContext *context, 10932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusConnection *connection) 10942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{ 10952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusMessage *message; 10962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_uint32_t serial; 10972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_bool_t retval; 10982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBusError error; 10992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu const char *base_service_name; 11002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_uint32_t uid; 11012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu retval = FALSE; 11032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_error_init (&error); 11042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu message = NULL; 11052779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_verbose ("check_get_connection_unix_user for %p\n", connection); 1107b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1108248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 1109248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 1110248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 11112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu "GetConnectionUnixUser"); 11122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (message == NULL) 11142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return TRUE; 11152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11168873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington base_service_name = dbus_bus_get_unique_name (connection); 11172779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 1118b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering if (!dbus_message_append_args (message, 11199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &base_service_name, 11202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_INVALID)) 11212779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (message); 11232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return TRUE; 11242779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11252779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11262779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (!dbus_connection_send (connection, message, &serial)) 11272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (message); 11292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return TRUE; 11302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11322779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu /* send our message */ 1133dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (SEND_PENDING (connection)); 11342779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11352779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (message); 11362779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu message = NULL; 11372779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11382779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_connection_ref (connection); /* because we may get disconnected */ 1139dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to GetConnectionUnixUser"); 11402779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11412779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (!dbus_connection_get_is_connected (connection)) 11422779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 1143d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 1144b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 11452779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_connection_unref (connection); 1146b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 11472779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return TRUE; 11482779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11492779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11502779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_connection_unref (connection); 11512779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11522779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu message = pop_message_waiting_for_memory (connection); 11532779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (message == NULL) 11542779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11552779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_warn ("Did not receive a reply to %s %d on %p\n", 11562779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu "GetConnectionUnixUser", serial, connection); 11572779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto out; 11582779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11592779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11602779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu verbose_message_received (connection, message); 11612779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11622779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 11632779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11642779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) 11652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu ; /* good, this is a valid response */ 11672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu else 11692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11702779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu warn_unexpected (connection, message, "not this error"); 11712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto out; 11732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu else 11762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11772779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) 11782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11792779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu ; /* good, expected */ 11802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11812779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu else 11822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu warn_unexpected (connection, message, 1184075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "method_return for GetConnectionUnixUser"); 11852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto out; 11872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 11882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu retry_get_property: 11902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 11912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (!dbus_message_get_args (message, &error, 11922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_UINT32, &uid, 11932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu DBUS_TYPE_INVALID)) 11942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 11952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 11962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 1197c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_verbose ("no memory to get uid by GetConnectionUnixUser\n"); 11982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_error_free (&error); 11992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_wait_for_memory (); 12002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto retry_get_property; 12012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 12022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu else 12032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu { 12042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu _dbus_assert (dbus_error_is_set (&error)); 1205c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetConnectionUnixUser\n"); 12062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto out; 12072779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 12082779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 12092779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu } 12102779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 12112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (!check_no_leftovers (context)) 12122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu goto out; 12132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 12142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu retval = TRUE; 12152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu 12162779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu out: 12172779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_error_free (&error); 1218b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 12192779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu if (message) 12202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu dbus_message_unref (message); 1221b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 12222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu return retval; 12232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu} 1224c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1225c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen/* returns TRUE if the correct thing happens, 1226c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * but the correct thing may include OOM errors. 1227c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen */ 1228c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t 1229c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthencheck_get_connection_unix_process_id (BusContext *context, 1230075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusConnection *connection) 1231c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{ 1232c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusMessage *message; 1233c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_uint32_t serial; 1234c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_bool_t retval; 1235c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBusError error; 1236c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen const char *base_service_name; 1237c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_uint32_t pid; 1238c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1239c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen retval = FALSE; 1240c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_error_init (&error); 1241c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen message = NULL; 1242c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1243c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_verbose ("check_get_connection_unix_process_id for %p\n", connection); 1244b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1245248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 1246248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 1247248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 1248c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen "GetConnectionUnixProcessID"); 1249c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1250c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (message == NULL) 1251c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1252c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 12538873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington base_service_name = dbus_bus_get_unique_name (connection); 1254c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1255b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering if (!dbus_message_append_args (message, 12569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &base_service_name, 1257c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_INVALID)) 1258c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1259c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (message); 1260c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1261c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1262c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1263c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!dbus_connection_send (connection, message, &serial)) 1264c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1265c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (message); 1266c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1267c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1268c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1269c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen /* send our message */ 1270dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (SEND_PENDING (connection)); 1271c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1272c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (message); 1273c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen message = NULL; 1274c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1275c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_connection_ref (connection); /* because we may get disconnected */ 1276dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to GetConnectionUnixProcessID"); 1277c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1278c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!dbus_connection_get_is_connected (connection)) 1279c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1280d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 1281b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1282c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_connection_unref (connection); 1283b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1284c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return TRUE; 1285c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1286c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1287c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_connection_unref (connection); 1288c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1289c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen message = pop_message_waiting_for_memory (connection); 1290c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (message == NULL) 1291c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1292c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_warn ("Did not receive a reply to %s %d on %p\n", 1293c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen "GetConnectionUnixProcessID", serial, connection); 1294c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto out; 1295c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1296c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1297c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen verbose_message_received (connection, message); 1298c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1299c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 1300c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1301c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) 1302c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1303c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen ; /* good, this is a valid response */ 1304c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1305bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington#ifdef DBUS_WIN 1306bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington else if (dbus_message_is_error (message, DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN)) 1307bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington { 1308bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington /* We are expecting this error, since we know in the test suite we aren't 1309bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington * talking to a client running on UNIX 1310bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington */ 1311bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington _dbus_verbose ("Windows correctly does not support GetConnectionUnixProcessID\n"); 1312bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington } 1313b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering#endif 1314c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen else 1315c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1316c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen warn_unexpected (connection, message, "not this error"); 1317b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1318c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto out; 1319c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1320c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1321c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen else 1322c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1323bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington#ifdef DBUS_WIN 1324bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington warn_unexpected (connection, message, "GetConnectionUnixProcessID to fail on Windows"); 1325bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington goto out; 1326b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering#else 1327c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) 1328c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1329c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen ; /* good, expected */ 1330c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1331c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen else 1332c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1333c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen warn_unexpected (connection, message, 1334075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "method_return for GetConnectionUnixProcessID"); 1335c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1336c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto out; 1337c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1338c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1339c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen retry_get_property: 1340c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1341c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!dbus_message_get_args (message, &error, 1342c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_UINT32, &pid, 1343c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen DBUS_TYPE_INVALID)) 1344c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1345c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 1346c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1347c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_verbose ("no memory to get pid by GetConnectionUnixProcessID\n"); 1348c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_error_free (&error); 1349c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_wait_for_memory (); 1350c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto retry_get_property; 1351c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1352c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen else 1353c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen { 1354c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_assert (dbus_error_is_set (&error)); 1355c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetConnectionUnixProcessID\n"); 1356c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto out; 1357c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1358bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington } 1359bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington else 1360bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington { 1361075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* test if returned pid is the same as our own pid 1362075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * 1363075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * @todo It would probably be good to restructure the tests 1364075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * in a way so our parent is the bus that we're testing 1365075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * cause then we can test that the pid returned matches 1366075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * getppid() 1367075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 1368bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington if (pid != (dbus_uint32_t) _dbus_getpid ()) 1369075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 1370c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_assert (dbus_error_is_set (&error)); 1371c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_warn ("Result from GetConnectionUnixProcessID is not our own pid\n"); 1372c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto out; 1373075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 1374075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 1375bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington#endif /* !DBUS_WIN */ 1376c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen } 1377c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1378c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!check_no_leftovers (context)) 1379c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen goto out; 1380c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1381c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen retval = TRUE; 1382c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 1383c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen out: 1384c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_error_free (&error); 1385b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1386c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (message) 1387c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen dbus_message_unref (message); 1388b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1389c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen return retval; 1390c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen} 1391c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 13922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu/* returns TRUE if the correct thing happens, 13932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu * but the correct thing may include OOM errors. 13942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu */ 13952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t 1396a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtoncheck_add_match_all (BusContext *context, 1397a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusConnection *connection) 1398a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{ 1399a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusMessage *message; 1400a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_bool_t retval; 1401a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_uint32_t serial; 1402a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBusError error; 14039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *empty = ""; 1404a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1405a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington retval = FALSE; 1406a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_error_init (&error); 1407a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message = NULL; 1408a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1409a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_verbose ("check_add_match_all for %p\n", connection); 1410b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1411248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 1412248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 1413248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 1414a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "AddMatch"); 1415a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1416a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (message == NULL) 1417a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1418a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 14196a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington /* empty string match rule matches everything */ 14209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &empty, 1421a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_TYPE_INVALID)) 1422a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1423a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (message); 1424a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1425a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1426b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1427a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!dbus_connection_send (connection, message, &serial)) 1428a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1429a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (message); 1430a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1431a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1432a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1433a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (message); 1434a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message = NULL; 1435a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1436dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_ref (connection); /* because we may get disconnected */ 1437b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1438a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington /* send our message */ 1439dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (SEND_PENDING (connection)); 1440a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1441dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 1442dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington { 1443d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 1444b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1445dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington dbus_connection_unref (connection); 1446b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1447dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington return TRUE; 1448dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington } 1449b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1450dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to AddMatch"); 1451a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1452a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 1453a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1454d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 1455b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1456a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_connection_unref (connection); 1457b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1458a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return TRUE; 1459a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1460a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1461a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_connection_unref (connection); 1462b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1463a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington message = pop_message_waiting_for_memory (connection); 1464a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (message == NULL) 1465a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1466a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_warn ("Did not receive a reply to %s %d on %p\n", 1467a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "AddMatch", serial, connection); 1468a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 1469a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1470a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1471a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington verbose_message_received (connection, message); 1472a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1473248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 1474a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1475a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_warn ("Message has wrong sender %s\n", 1476a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_get_sender (message) ? 1477a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_get_sender (message) : "(none)"); 1478a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 1479a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1480b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1481a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 1482a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1483a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (dbus_message_is_error (message, 1484a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington DBUS_ERROR_NO_MEMORY)) 1485a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1486a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington ; /* good, this is a valid response */ 1487a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1488a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else 1489a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1490a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington warn_unexpected (connection, message, "not this error"); 1491a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1492a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 1493a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1494a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1495a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else 1496a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1497a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) 1498a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1499a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington ; /* good, expected */ 1500a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert (dbus_message_get_reply_serial (message) == serial); 1501a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1502a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else 1503a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1504a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington warn_unexpected (connection, message, "method return for AddMatch"); 1505a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1506a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 1507a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1508a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 1509a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1510a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!check_no_leftovers (context)) 1511a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington goto out; 1512b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1513a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington retval = TRUE; 1514b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1515a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington out: 1516a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_error_free (&error); 1517b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1518a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (message) 1519a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_message_unref (message); 1520b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1521a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return retval; 1522a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington} 1523a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1524a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington/* returns TRUE if the correct thing happens, 1525a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * but the correct thing may include OOM errors. 1526a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */ 1527a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t 1528f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtoncheck_hello_connection (BusContext *context) 1529f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{ 1530f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington DBusConnection *connection; 1531ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington DBusError error; 1532f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 1533ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington dbus_error_init (&error); 1534ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 153573b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker connection = dbus_connection_open_private (TEST_CONNECTION, &error); 1536f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (connection == NULL) 1537f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 1538ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 1539ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington dbus_error_free (&error); 1540f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return TRUE; 1541f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 1542f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 1543f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!bus_setup_debug_client (connection)) 1544f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 154511fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J dbus_connection_close (connection); 1546f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington dbus_connection_unref (connection); 1547f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return TRUE; 1548f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington } 1549f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 1550dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington spin_connection_until_authenticated (context, connection); 1551b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1552f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington if (!check_hello_message (context, connection)) 1553f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington return FALSE; 1554b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 15558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (dbus_bus_get_unique_name (connection) == NULL) 1556ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 1557ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington /* We didn't successfully register, so we can't 1558ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington * do the usual kill_client_connection() checks 1559ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington */ 1560f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington kill_client_connection_unchecked (connection); 1561ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 1562ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington else 1563ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington { 1564a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!check_add_match_all (context, connection)) 1565a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 1566b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1567ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington kill_client_connection (context, connection); 1568ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington } 1569f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 15703bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington return TRUE; 15713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 15723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 1573e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington#define NONEXISTENT_SERVICE_NAME "test.this.service.does.not.exist.ewuoiurjdfxcvn" 1574e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1575e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington/* returns TRUE if the correct thing happens, 1576e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington * but the correct thing may include OOM errors. 1577e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington */ 1578e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtonstatic dbus_bool_t 1579f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_nonexistent_service_no_auto_start (BusContext *context, 1580f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBusConnection *connection) 1581e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{ 1582e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington DBusMessage *message; 1583a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_uint32_t serial; 1584e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_bool_t retval; 15859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *nonexistent = NONEXISTENT_SERVICE_NAME; 15869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t flags; 1587b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1588248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 1589248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 1590248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 15918873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName"); 1592b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1593e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (message == NULL) 1594e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return TRUE; 1595e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1596f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington dbus_message_set_auto_start (message, FALSE); 1597b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 15989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington flags = 0; 1599e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!dbus_message_append_args (message, 16009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &nonexistent, 16019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &flags, 1602e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington DBUS_TYPE_INVALID)) 1603e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1604e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (message); 1605e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return TRUE; 1606e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1607b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1608e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!dbus_connection_send (connection, message, &serial)) 1609e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1610e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (message); 1611e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return TRUE; 1612e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1613e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1614e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (message); 1615e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington message = NULL; 16161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 16171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_test_run_everything (context); 1618dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to ActivateService on nonexistent"); 161951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington bus_test_run_everything (context); 1620e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1621e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!dbus_connection_get_is_connected (connection)) 1622e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1623d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 1624e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return TRUE; 1625e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1626b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1627e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington retval = FALSE; 1628b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 162951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 1630e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (message == NULL) 1631e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1632e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington _dbus_warn ("Did not receive a reply to %s %d on %p\n", 16338873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName", serial, connection); 1634e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington goto out; 1635e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1636e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1637d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington verbose_message_received (connection, message); 1638e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1639b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 1640e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1641248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 1642e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1643e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington _dbus_warn ("Message has wrong sender %s\n", 1644e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_get_sender (message) ? 1645e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_get_sender (message) : "(none)"); 1646e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington goto out; 1647e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1648b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 164968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_error (message, 16501820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington DBUS_ERROR_NO_MEMORY)) 1651e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1652e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington ; /* good, this is a valid response */ 1653e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 165468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington else if (dbus_message_is_error (message, 16558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_SERVICE_UNKNOWN)) 1656e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1657e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington ; /* good, this is expected also */ 1658e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1659e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington else 1660e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 166168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, "not this error"); 1662e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington goto out; 1663e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1664e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1665e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington else 1666e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 1667e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington _dbus_warn ("Did not expect to successfully activate %s\n", 1668e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington NONEXISTENT_SERVICE_NAME); 1669e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington goto out; 1670e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 1671e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 1672e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington retval = TRUE; 1673b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1674e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington out: 1675e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (message) 1676e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington dbus_message_unref (message); 1677b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1678e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return retval; 1679e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington} 1680e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 168193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult/* returns TRUE if the correct thing happens, 168293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * but the correct thing may include OOM errors. 168393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 168493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t 1685f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_nonexistent_service_auto_start (BusContext *context, 1686f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBusConnection *connection) 168793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 168893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBusMessage *message; 168993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_uint32_t serial; 169093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_bool_t retval; 1691b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 169293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = dbus_message_new_method_call (NONEXISTENT_SERVICE_NAME, 169393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "/org/freedesktop/TestSuite", 169493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "org.freedesktop.TestSuite", 169593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "Echo"); 1696b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 169793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 169893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 1699b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 170093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_connection_send (connection, message, &serial)) 170193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 170293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 170393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 170493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 170593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 170693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 170793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = NULL; 170893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 170993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult bus_test_run_everything (context); 1710dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to Echo"); 171193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult bus_test_run_everything (context); 171293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 171393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_connection_get_is_connected (connection)) 171493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 1715d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 171693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 171793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 1718b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 171993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = FALSE; 1720b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 172193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = pop_message_waiting_for_memory (connection); 172293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 172393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 172493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 172593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Did not receive a reply to %s %d on %p\n", 172693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "Echo message (auto activation)", serial, connection); 172793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 172893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 172993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 173093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult verbose_message_received (connection, message); 173193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 173293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 173393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 1734248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 173593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 173693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Message has wrong sender %s\n", 173793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_get_sender (message) ? 173893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_get_sender (message) : "(none)"); 173993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 174093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 1741b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 174293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (dbus_message_is_error (message, 174393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBUS_ERROR_NO_MEMORY)) 174493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 174593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult ; /* good, this is a valid response */ 174693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 174793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else if (dbus_message_is_error (message, 17488873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington DBUS_ERROR_SERVICE_UNKNOWN)) 174993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 175093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult ; /* good, this is expected also */ 175193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 175293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else 175393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 175493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult warn_unexpected (connection, message, "not this error"); 175593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 175693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 175793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 175893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else 175993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 176093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Did not expect to successfully activate %s\n", 176193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult NONEXISTENT_SERVICE_NAME); 176293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 176393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 176493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 176593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = TRUE; 1766b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 176793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out: 176893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message) 176993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 1770b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 177193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return retval; 177293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 177393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 1774fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonstatic dbus_bool_t 1775231fc084cf418150a9e484429c4152d5a0b35051Havoc Penningtoncheck_base_service_activated (BusContext *context, 1776231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBusConnection *connection, 1777231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBusMessage *initial_message, 17789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char **base_service_p) 1779fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington{ 1780fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington DBusMessage *message; 1781fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_bool_t retval; 1782fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington DBusError error; 17839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *base_service, *base_service_from_bus, *old_owner; 1784b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1785fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington retval = FALSE; 1786b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1787fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_error_init (&error); 178885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service = NULL; 178985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner = NULL; 179085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service_from_bus = NULL; 1791fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 1792fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington message = initial_message; 1793b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering dbus_message_ref (message); 1794fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 179568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_signal (message, 1796248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 17978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged")) 1798fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 179985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData socd; 180051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 180151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington reget_service_name_arg: 180285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service = NULL; 180385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner = NULL; 180485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service_from_bus = NULL; 180585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 1806fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (!dbus_message_get_args (message, &error, 180785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &base_service, 1808075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &old_owner, 180985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &base_service_from_bus, 1810fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington DBUS_TYPE_INVALID)) 1811fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 181251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 181351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 181451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_error_free (&error); 181551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_wait_for_memory (); 181651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto reget_service_name_arg; 181751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 181851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington else 181951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 182051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_warn ("Message %s doesn't have a service name: %s\n", 18218873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged (creation)", 182251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington error.message); 182351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 182451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 1825fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 1826fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 182785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (*base_service != ':') 1828fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 1829231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington _dbus_warn ("Expected base service activation, got \"%s\" instead\n", 183085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service); 1831231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington goto out; 1832231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington } 1833b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 183485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (strcmp (base_service, base_service_from_bus) != 0) 1835075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 183685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Expected base service activation, got \"%s\" instead with owner \"%s\"\n", 183785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service, base_service_from_bus); 183885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 183985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 184085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 184185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (old_owner[0]) 184285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 184385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Received an old_owner argument during base service activation, \"%s\"\n", 184485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner); 184585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 184685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 1847b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 184885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_CREATED; 184985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = base_service; 185085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 185185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.skip_connection = connection; 185285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 185385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu &socd); 1854b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 185585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 1856231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington goto out; 1857231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington } 185851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington else 185951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 18608873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington warn_unexpected (connection, message, "NameOwnerChanged (creation) for base service"); 186168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 186251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 186351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 1864fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 1865231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (base_service_p) 18669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *base_service_p = base_service; 18679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington 18689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington retval = TRUE; 1869b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1870231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington out: 1871231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (message) 1872231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_message_unref (message); 187385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_error_free (&error); 1874231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 1875231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington return retval; 1876231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington} 1877231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 1878231fc084cf418150a9e484429c4152d5a0b35051Havoc Penningtonstatic dbus_bool_t 1879231fc084cf418150a9e484429c4152d5a0b35051Havoc Penningtoncheck_service_activated (BusContext *context, 1880231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBusConnection *connection, 1881231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington const char *activated_name, 1882231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington const char *base_service_name, 1883231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBusMessage *initial_message) 1884231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington{ 1885231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBusMessage *message; 1886231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_bool_t retval; 1887231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBusError error; 1888231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_uint32_t activation_result; 1889b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1890231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington retval = FALSE; 1891b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1892231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_error_init (&error); 1893231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 1894231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington message = initial_message; 1895231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_message_ref (message); 1896231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 189768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_signal (message, 1898248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 18998873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged")) 1900231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington { 190185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData socd; 19029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service_name, *base_service_from_bus, *old_owner; 190351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 190451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington reget_service_name_arg: 190585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu service_name = NULL; 190685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner = NULL; 190785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service_from_bus = NULL; 190885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 1909231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (!dbus_message_get_args (message, &error, 1910231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBUS_TYPE_STRING, &service_name, 1911075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &old_owner, 191285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &base_service_from_bus, 1913231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington DBUS_TYPE_INVALID)) 1914fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 191551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 191651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 191751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_error_free (&error); 191851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_wait_for_memory (); 191951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto reget_service_name_arg; 192051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 192151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington else 192251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 192351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_warn ("Message %s doesn't have a service name: %s\n", 19248873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged (creation)", 192551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington error.message); 192651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 192751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 1928fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 1929fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 1930fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (strcmp (service_name, activated_name) != 0) 1931fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 1932fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington _dbus_warn ("Expected to see service %s created, saw %s instead\n", 1933fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington activated_name, service_name); 1934fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 1935fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 1936fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 193785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (strcmp (base_service_name, base_service_from_bus) != 0) 193885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 19398873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_warn ("NameOwnerChanged reports wrong base service: %s owner, expected %s instead\n", 194085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu base_service_from_bus, base_service_name); 194185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 194285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 194385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 194485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (old_owner[0]) 194585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 194685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("expected a %s, got a %s\n", 19478873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged (creation)", 19488873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged (change)"); 194985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 195085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 195185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 195285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_CREATED; 195385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.skip_connection = connection; 195485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 195585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = service_name; 195685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 195785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu &socd); 1958b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 195985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 1960fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 1961b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 1962fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_message_unref (message); 19639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington service_name = NULL; 19649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington old_owner = NULL; 19659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington base_service_from_bus = NULL; 1966b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 196751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 1968fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (message == NULL) 1969fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 1970fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington _dbus_warn ("Expected a reply to %s, got nothing\n", 19718873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName"); 1972fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 1973fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 1974fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 197551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington else 197651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 19778873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington warn_unexpected (connection, message, "NameOwnerChanged for the activated name"); 1978b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 197951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 198051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 1981b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 198268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN) 1983fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 19848873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington warn_unexpected (connection, message, "reply to StartServiceByName"); 198568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 1986fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 1987fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 1988fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 1989fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington activation_result = 0; 1990fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (!dbus_message_get_args (message, &error, 1991fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington DBUS_TYPE_UINT32, &activation_result, 1992fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington DBUS_TYPE_INVALID)) 1993fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 1994fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 1995fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 1996fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington _dbus_warn ("Did not have activation result first argument to %s: %s\n", 19978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName", error.message); 1998fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 1999fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 2000fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2001fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_error_free (&error); 2002fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 2003fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington else 2004fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 20058873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington if (activation_result == DBUS_START_REPLY_SUCCESS) 2006fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington ; /* Good */ 20078873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington else if (activation_result == DBUS_START_REPLY_ALREADY_RUNNING) 2008fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington ; /* Good also */ 2009fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington else 2010fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 20118873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_warn ("Activation result was %u, no good.\n", 2012fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington activation_result); 2013fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 2014fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 2015fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 2016fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2017fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_message_unref (message); 2018fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington message = NULL; 2019b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2020fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (!check_no_leftovers (context)) 2021fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 2022fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington _dbus_warn ("Messages were left over after verifying existent activation results\n"); 2023fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 2024fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 2025fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2026fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington retval = TRUE; 2027b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2028fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington out: 2029fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (message) 2030fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_message_unref (message); 203185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_error_free (&error); 2032b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2033fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington return retval; 2034fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington} 2035fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2036fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonstatic dbus_bool_t 203793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultcheck_service_auto_activated (BusContext *context, 2038075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusConnection *connection, 2039075945f611290f2b9db9a4ed6cf5433f2fd85785John (J const char *activated_name, 2040075945f611290f2b9db9a4ed6cf5433f2fd85785John (J const char *base_service_name, 2041075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusMessage *initial_message) 204293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 204393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBusMessage *message; 204493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_bool_t retval; 204593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBusError error; 2046b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 204793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = FALSE; 2048b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 204993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_error_init (&error); 205093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 205193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = initial_message; 205293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_ref (message); 205393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 205493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (dbus_message_is_signal (message, 2055248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 20568873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged")) 205793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 20589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service_name; 205985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData socd; 2060b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 206193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult reget_service_name_arg: 206293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_message_get_args (message, &error, 206393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBUS_TYPE_STRING, &service_name, 206493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBUS_TYPE_INVALID)) 206593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 206693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 206793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 206893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_error_free (&error); 206993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_wait_for_memory (); 207093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto reget_service_name_arg; 207193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 207293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else 207393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 207493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Message %s doesn't have a service name: %s\n", 20758873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged", 207693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult error.message); 207793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_error_free (&error); 207893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 207993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 208093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 2081b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 208293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (strcmp (service_name, activated_name) != 0) 208393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 208493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Expected to see service %s created, saw %s instead\n", 208593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult activated_name, service_name); 208693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 208793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 2088b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 208985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_CREATED; 209085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = service_name; 209185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 2092b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering socd.skip_connection = connection; 209385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 2094075945f611290f2b9db9a4ed6cf5433f2fd85785John (J &socd); 2095b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 209685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 209793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 2098b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 209993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult /* Note that this differs from regular activation in that we don't get a 210093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * reply to ActivateService here. 210193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 2102b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 210393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 210493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = NULL; 21059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington service_name = NULL; 210693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 210793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else 210893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 21098873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington warn_unexpected (connection, message, "NameOwnerChanged for the activated name"); 2110b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 211193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 211293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 2113b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 211493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = TRUE; 2115b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 211693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out: 211793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message) 211893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 2119b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 212093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return retval; 212193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 212293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 212393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t 2124fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtoncheck_service_deactivated (BusContext *context, 2125fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington DBusConnection *connection, 2126fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington const char *activated_name, 2127fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington const char *base_service) 2128fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington{ 2129fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington dbus_bool_t retval; 213085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu CheckServiceOwnerChangedData socd; 2131fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2132fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington retval = FALSE; 2133b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 213485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu /* Now we are expecting ServiceOwnerChanged (deletion) messages for the base 2135fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington * service and the activated_name. The base service 21361708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington * notification is required to come last. 2137fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington */ 213885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_DELETED; 213985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = activated_name; 214085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 214185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.skip_connection = NULL; 214285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 2143b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering &socd); 214485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 214585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 2146fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 2147b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 214885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_kind = SERVICE_DELETED; 214985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.expected_service_name = base_service; 215085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.failed = FALSE; 215185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu socd.skip_connection = NULL; 215285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu bus_test_clients_foreach (check_service_owner_changed_foreach, 215385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu &socd); 215485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 215585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (socd.failed) 2156fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 21571708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington 21581708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington retval = TRUE; 2159b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2160fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington out: 2161fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington return retval; 2162fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington} 2163fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 216451781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic dbus_bool_t 216551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtoncheck_send_exit_to_service (BusContext *context, 216651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington DBusConnection *connection, 216751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington const char *service_name, 216851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington const char *base_service) 216951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington{ 217051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_bool_t got_error; 217151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington DBusMessage *message; 2172a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_uint32_t serial; 217351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_bool_t retval; 2174b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 217551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Sending exit message to the test service\n"); 217651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 217751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington retval = FALSE; 2178b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 217951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* Kill off the test service by sending it a quit message */ 21805fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington message = dbus_message_new_method_call (service_name, 21815fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington "/org/freedesktop/TestSuite", 21825fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington "org.freedesktop.TestSuite", 21835fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington "Exit"); 2184b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 218551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (message == NULL) 218651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 218751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* Do this again; we still need the service to exit... */ 218851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (!check_send_exit_to_service (context, connection, 218951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington service_name, base_service)) 219051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 2191b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 219251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington return TRUE; 219351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 2194b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 219551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (!dbus_connection_send (connection, message, &serial)) 219651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 219751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_unref (message); 219851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 219951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* Do this again; we still need the service to exit... */ 220051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (!check_send_exit_to_service (context, connection, 220151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington service_name, base_service)) 220251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 2203b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 220451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington return TRUE; 220551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 220651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 220751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_unref (message); 220851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = NULL; 220951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 221051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* send message */ 2211dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington bus_test_run_clients_loop (SEND_PENDING (connection)); 221251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 221351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* read it in and write it out to test service */ 221451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington bus_test_run_bus_loop (context, FALSE); 221551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 221651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* see if we got an error during message bus dispatching */ 221751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington bus_test_run_clients_loop (FALSE); 2218fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu message = borrow_message_waiting_for_memory (connection); 2219b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington got_error = message != NULL && dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR; 222051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (message) 2221777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington { 2222777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington dbus_connection_return_message (connection, message); 2223777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington message = NULL; 2224777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington } 2225b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 222651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (!got_error) 222751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 222851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* If no error, wait for the test service to exit */ 2229dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "test service to exit"); 2230b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 223151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington bus_test_run_everything (context); 223251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 223351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 223451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (got_error) 223551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 223651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 223751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_assert (message != NULL); 223851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 2239bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (dbus_message_get_reply_serial (message) != serial) 2240bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington { 2241bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington warn_unexpected (connection, message, 2242bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington "error with the correct reply serial"); 2243bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington goto out; 2244bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 2245b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 224668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (!dbus_message_is_error (message, 224768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_ERROR_NO_MEMORY)) 224851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 224968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, 225068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington "a no memory error from asking test service to exit"); 225151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 225251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 225351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 225451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington _dbus_verbose ("Got error %s when asking test service to exit\n", 225568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington dbus_message_get_error_name (message)); 225651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 225751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* Do this again; we still need the service to exit... */ 225851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (!check_send_exit_to_service (context, connection, 225951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington service_name, base_service)) 226051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 226151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington } 226251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington else 226351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington { 226451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (!check_service_deactivated (context, connection, 226551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington service_name, base_service)) 226651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington goto out; 226751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 2268bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington /* Should now have a NoReply error from the Exit() method 2269bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington * call; it should have come after all the deactivation 2270bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington * stuff. 2271bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington */ 2272bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington message = pop_message_waiting_for_memory (connection); 2273b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2274bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (message == NULL) 2275bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington { 2276bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington warn_unexpected (connection, NULL, 2277bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington "reply to Exit() method call"); 2278bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington goto out; 2279bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 2280bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (!dbus_message_is_error (message, 2281bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington DBUS_ERROR_NO_REPLY)) 2282bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington { 22839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington warn_unexpected (connection, message, 2284bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington "NoReply error from Exit() method call"); 2285bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington goto out; 2286bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 2287bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington 2288bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (dbus_message_get_reply_serial (message) != serial) 2289bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington { 2290bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington warn_unexpected (connection, message, 2291bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington "error with the correct reply serial"); 2292bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington goto out; 2293bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 2294b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2295bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington _dbus_verbose ("Got error %s after test service exited\n", 2296bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington dbus_message_get_error_name (message)); 2297b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2298bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (!check_no_leftovers (context)) 2299bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington { 2300bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington _dbus_warn ("Messages were left over after %s\n", 2301bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington _DBUS_FUNCTION_NAME); 2302bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington goto out; 2303bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 2304bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 2305b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 230651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington retval = TRUE; 2307b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 230851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington out: 230951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington if (message) 231051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington dbus_message_unref (message); 2311b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 231251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington return retval; 231351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington} 231451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 23156be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic dbus_bool_t 23166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncheck_got_error (BusContext *context, 23176be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusConnection *connection, 2318a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington const char *first_error_name, 2319a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington ...) 23206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{ 23216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington DBusMessage *message; 23226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_bool_t retval; 2323a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington va_list ap; 2324a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington dbus_bool_t error_found; 2325a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington const char *error_name; 2326b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 23276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington retval = FALSE; 2328b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 23296be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington message = pop_message_waiting_for_memory (connection); 23306be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (message == NULL) 23316be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 23326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington _dbus_warn ("Did not get an expected error\n"); 23336be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 23346be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 23356be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 2336b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) 23376be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 233868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, "an error"); 233968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 23406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 23416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 23426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 2343a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington error_found = FALSE; 2344a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington 2345a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington va_start (ap, first_error_name); 2346a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington error_name = first_error_name; 2347a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington while (error_name != NULL) 2348a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington { 234968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_error (message, error_name)) 2350a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington { 2351a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington error_found = TRUE; 2352a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington break; 2353a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington } 2354a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington error_name = va_arg (ap, char*); 2355a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington } 2356a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington va_end (ap); 2357a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington 2358a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington if (!error_found) 23596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington { 2360a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington _dbus_warn ("Expected error %s or other, got %s instead\n", 2361a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington first_error_name, 236268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington dbus_message_get_error_name (message)); 23636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 23646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington } 23656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 23666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington retval = TRUE; 2367b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 23686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington out: 23696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (message) 23706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington dbus_message_unref (message); 2371b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 23726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington return retval; 23736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington} 2374b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 237585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieutypedef enum 2376b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering{ 237785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu GOT_SERVICE_CREATED, 237885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu GOT_SERVICE_DELETED, 237985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu GOT_ERROR, 2380b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering GOT_SOMETHING_ELSE 238185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} GotServiceInfo; 238285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 238385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieustatic GotServiceInfo 238485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieucheck_got_service_info (DBusMessage *message) 238585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu{ 238685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu GotServiceInfo message_kind; 238785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 238885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (dbus_message_is_signal (message, 2389248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 23908873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "NameOwnerChanged")) 239185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 239285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBusError error; 23939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *service_name, *old_owner, *new_owner; 239485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_error_init (&error); 239585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 239685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu reget_service_info_data: 239785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu service_name = NULL; 239885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu old_owner = NULL; 239985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu new_owner = NULL; 240085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 240185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_message_get_args (message, &error, 240285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &service_name, 240385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &old_owner, 240485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_STRING, &new_owner, 240585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu DBUS_TYPE_INVALID); 240685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (dbus_error_is_set (&error)) 240785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 240885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 240985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 241085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_error_free (&error); 241185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto reget_service_info_data; 241285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 241385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu else 241485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 2415cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen _dbus_warn ("unexpected arguments for NameOwnerChanged message\n"); 241685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = GOT_SOMETHING_ELSE; 241785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 241885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 241985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu else if (!old_owner[0]) 242085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = GOT_SERVICE_CREATED; 242185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu else if (!new_owner[0]) 242285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = GOT_SERVICE_DELETED; 242385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu else 242485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = GOT_SOMETHING_ELSE; 242585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 242685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_error_free (&error); 242785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 242885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu else if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 242985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = GOT_ERROR; 243085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu else 243185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = GOT_SOMETHING_ELSE; 243285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 243385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu return message_kind; 243485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} 243585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 24361b08036103a70159e7a67b2349306710edcd6654Havoc Pennington#define EXISTENT_SERVICE_NAME "org.freedesktop.DBus.TestSuiteEchoService" 24371b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 24381b08036103a70159e7a67b2349306710edcd6654Havoc Pennington/* returns TRUE if the correct thing happens, 24391b08036103a70159e7a67b2349306710edcd6654Havoc Pennington * but the correct thing may include OOM errors. 24401b08036103a70159e7a67b2349306710edcd6654Havoc Pennington */ 24411b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonstatic dbus_bool_t 2442f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_existent_service_no_auto_start (BusContext *context, 2443f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBusConnection *connection) 24441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{ 24451b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBusMessage *message; 24469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *base_service_message; 24479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *base_service; 2448a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_uint32_t serial; 24491b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_bool_t retval; 24509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *existent = EXISTENT_SERVICE_NAME; 24519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t flags; 2452fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 24539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington base_service_message = NULL; 2454b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2455248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 2456248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 2457248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 24588873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName"); 24591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 24601b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (message == NULL) 24611b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return TRUE; 24621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2463f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington dbus_message_set_auto_start (message, FALSE); 2464b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 24659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington flags = 0; 24661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (!dbus_message_append_args (message, 24679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &existent, 24689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &flags, 24691b08036103a70159e7a67b2349306710edcd6654Havoc Pennington DBUS_TYPE_INVALID)) 24701b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 24711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_message_unref (message); 24721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return TRUE; 24731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 2474b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 24751b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (!dbus_connection_send (connection, message, &serial)) 24761b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 24771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_message_unref (message); 24781b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return TRUE; 24791b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 24801b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 24811b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_message_unref (message); 24821b08036103a70159e7a67b2349306710edcd6654Havoc Pennington message = NULL; 24831b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 24841b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_test_run_everything (context); 24851b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 248651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington /* now wait for the message bus to hear back from the activated 248751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington * service. 248851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington */ 2489dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "activated service to connect"); 249051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington 24911b08036103a70159e7a67b2349306710edcd6654Havoc Pennington bus_test_run_everything (context); 24921b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 24931b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 24941b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 2495d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 24961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return TRUE; 24971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 2498b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 24991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington retval = FALSE; 2500b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 250151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 25021b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (message == NULL) 25031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 2504231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington _dbus_warn ("Did not receive any messages after %s %d on %p\n", 25058873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName", serial, connection); 25061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington goto out; 25071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 25081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2509d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington verbose_message_received (connection, message); 25108873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_verbose (" (after sending %s)\n", "StartServiceByName"); 25111b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2512b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 25131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 2514248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 25151b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 25161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington _dbus_warn ("Message has wrong sender %s\n", 25171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_message_get_sender (message) ? 25181b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_message_get_sender (message) : "(none)"); 25191b08036103a70159e7a67b2349306710edcd6654Havoc Pennington goto out; 25201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 2521b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 252268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_error (message, 25231820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington DBUS_ERROR_NO_MEMORY)) 25241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 25251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington ; /* good, this is a valid response */ 25261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 252768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington else if (dbus_message_is_error (message, 25281658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu DBUS_ERROR_SPAWN_CHILD_EXITED) || 25291658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu dbus_message_is_error (message, 25305e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin DBUS_ERROR_SPAWN_CHILD_SIGNALED) || 25315e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin dbus_message_is_error (message, 25321658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu DBUS_ERROR_SPAWN_EXEC_FAILED)) 25331708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington { 253478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington ; /* good, this is expected also */ 25351708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington } 25361b08036103a70159e7a67b2349306710edcd6654Havoc Pennington else 25371b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 25381b08036103a70159e7a67b2349306710edcd6654Havoc Pennington _dbus_warn ("Did not expect error %s\n", 253968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington dbus_message_get_error_name (message)); 25401b08036103a70159e7a67b2349306710edcd6654Havoc Pennington goto out; 25411b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 25421b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 25431b08036103a70159e7a67b2349306710edcd6654Havoc Pennington else 25441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington { 254585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu GotServiceInfo message_kind; 2546b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2547231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (!check_base_service_activated (context, connection, 2548231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington message, &base_service)) 2549fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington goto out; 2550fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 25519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington base_service_message = message; 2552fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington message = NULL; 2553231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 2554231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington /* We may need to block here for the test service to exit or finish up */ 2555dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "test service to exit or finish up"); 2556b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2557231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington message = dbus_connection_borrow_message (connection); 2558fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington if (message == NULL) 2559fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington { 2560231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington _dbus_warn ("Did not receive any messages after base service creation notification\n"); 2561231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington goto out; 2562fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington } 2563231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 256485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = check_got_service_info (message); 256585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 2566231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_connection_return_message (connection, message); 2567231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington message = NULL; 25686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington 256985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu switch (message_kind) 2570075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 2571075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SOMETHING_ELSE: 257285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Unexpected message after ActivateService " 257385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu "(should be an error or a service announcement"); 2574075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 257585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 2576075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_ERROR: 25776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington if (!check_got_error (context, connection, 2578a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington DBUS_ERROR_SPAWN_CHILD_EXITED, 2579a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington DBUS_ERROR_NO_MEMORY, 2580a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington NULL)) 25816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington goto out; 25826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington /* A service deleted should be coming along now after this error. 25836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington * We can also get the error *after* the service deleted. 25846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington */ 2585fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 2586075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* fall through */ 2587075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 2588075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SERVICE_DELETED: 2589075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 2590075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* The service started up and got a base address, but then 2591075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * failed to register under EXISTENT_SERVICE_NAME 2592075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 2593075945f611290f2b9db9a4ed6cf5433f2fd85785John (J CheckServiceOwnerChangedData socd; 2594075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 2595075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.expected_kind = SERVICE_DELETED; 2596075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.expected_service_name = base_service; 2597075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.failed = FALSE; 2598075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.skip_connection = NULL; 2599b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2600075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_clients_foreach (check_service_owner_changed_foreach, 2601075945f611290f2b9db9a4ed6cf5433f2fd85785John (J &socd); 2602075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 2603075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (socd.failed) 2604075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 2605075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 2606075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* Now we should get an error about the service exiting 2607075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * if we didn't get it before. 2608075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 2609075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message_kind != GOT_ERROR) 2610075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 2611075945f611290f2b9db9a4ed6cf5433f2fd85785John (J block_connection_until_message_from_bus (context, connection, "error about service exiting"); 2612b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2613075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* and process everything again */ 2614075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_run_everything (context); 2615b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2616075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!check_got_error (context, connection, 2617075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_ERROR_SPAWN_CHILD_EXITED, 2618cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen DBUS_ERROR_NO_MEMORY, 2619075945f611290f2b9db9a4ed6cf5433f2fd85785John (J NULL)) 2620075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 2621075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 2622075945f611290f2b9db9a4ed6cf5433f2fd85785John (J break; 2623075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 2624075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 2625075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SERVICE_CREATED: 262651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington message = pop_message_waiting_for_memory (connection); 2627231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (message == NULL) 2628231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington { 262985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Failed to pop message we just put back! " 2630075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "should have been a NameOwnerChanged (creation)\n"); 2631231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington goto out; 2632231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington } 2633b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2634231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME, 2635231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington base_service, message)) 2636231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington goto out; 2637b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2638231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington dbus_message_unref (message); 2639231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington message = NULL; 2640231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 2641231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington if (!check_no_leftovers (context)) 2642231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington { 2643231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington _dbus_warn ("Messages were left over after successful activation\n"); 2644231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington goto out; 2645231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington } 2646231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington 26477628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_send_exit_to_service (context, connection, 264851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington EXISTENT_SERVICE_NAME, base_service)) 26497628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 265085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 2651075945f611290f2b9db9a4ed6cf5433f2fd85785John (J break; 2652075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 26531b08036103a70159e7a67b2349306710edcd6654Havoc Pennington } 265485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 26551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington retval = TRUE; 2656b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 26571b08036103a70159e7a67b2349306710edcd6654Havoc Pennington out: 26581b08036103a70159e7a67b2349306710edcd6654Havoc Pennington if (message) 26591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington dbus_message_unref (message); 2660fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington 26619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (base_service_message) 26629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (base_service_message); 2663b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 26641b08036103a70159e7a67b2349306710edcd6654Havoc Pennington return retval; 26651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} 26661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington 2667e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#ifndef DBUS_WIN_FIXME 266878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington/* returns TRUE if the correct thing happens, 266978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington * but the correct thing may include OOM errors. 267078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington */ 267178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Penningtonstatic dbus_bool_t 2672f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_segfault_service_no_auto_start (BusContext *context, 2673f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBusConnection *connection) 267478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington{ 267578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington DBusMessage *message; 2676a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_uint32_t serial; 267778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_bool_t retval; 26789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *segv_service; 26799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_uint32_t flags; 2680b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2681248895207dc15914ac7970a6d1431308075dca1dColin Walters message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 2682248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_PATH_DBUS, 2683248895207dc15914ac7970a6d1431308075dca1dColin Walters DBUS_INTERFACE_DBUS, 26848873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName"); 268578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 268678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington if (message == NULL) 268778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington return TRUE; 268878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 2689f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington dbus_message_set_auto_start (message, FALSE); 2690b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 26919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington segv_service = "org.freedesktop.DBus.TestSuiteSegfaultService"; 26929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington flags = 0; 269378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington if (!dbus_message_append_args (message, 26949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &segv_service, 26959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_UINT32, &flags, 269678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington DBUS_TYPE_INVALID)) 269778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 269878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_message_unref (message); 269978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington return TRUE; 270078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 2701b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 270278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington if (!dbus_connection_send (connection, message, &serial)) 270378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 270478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_message_unref (message); 270578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington return TRUE; 270678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 270778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 270878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_message_unref (message); 270978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington message = NULL; 271078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 271178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington bus_test_run_everything (context); 2712dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to activating segfault service"); 271378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington bus_test_run_everything (context); 271478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 271578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington if (!dbus_connection_get_is_connected (connection)) 271678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 2717d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 271878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington return TRUE; 271978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 2720b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 272178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington retval = FALSE; 2722b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 272378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington message = pop_message_waiting_for_memory (connection); 272478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington if (message == NULL) 272578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 272678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington _dbus_warn ("Did not receive a reply to %s %d on %p\n", 27278873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington "StartServiceByName", serial, connection); 272878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington goto out; 272978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 273078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 2731d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington verbose_message_received (connection, message); 273278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 2733b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 273478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 2735248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 273678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 273778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington _dbus_warn ("Message has wrong sender %s\n", 273878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_message_get_sender (message) ? 273978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_message_get_sender (message) : "(none)"); 274078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington goto out; 274178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 2742b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 274368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington if (dbus_message_is_error (message, 274468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_ERROR_NO_MEMORY)) 274578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 274678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington ; /* good, this is a valid response */ 274778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 274868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington else if (dbus_message_is_error (message, 2749c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_FAILED)) 2750c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 2751c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes const char *servicehelper; 2752c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes servicehelper = bus_context_get_servicehelper (context); 2753c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* make sure this only happens with the launch helper */ 2754c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert (servicehelper != NULL); 2755c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 2756c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 275768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington DBUS_ERROR_SPAWN_CHILD_SIGNALED)) 275878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 275978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington ; /* good, this is expected also */ 276078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 276178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington else 276278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 276368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington warn_unexpected (connection, message, "not this error"); 276468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington 276578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington goto out; 276678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 276778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 276878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington else 276978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington { 277078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington _dbus_warn ("Did not expect to successfully activate segfault service\n"); 277178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington goto out; 277278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington } 277378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 277478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington retval = TRUE; 2775b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 277678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington out: 277778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington if (message) 277878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington dbus_message_unref (message); 2779b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 278078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington return retval; 278178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington} 278278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington 278393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 278493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult/* returns TRUE if the correct thing happens, 278593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * but the correct thing may include OOM errors. 278693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 278793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t 2788f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_segfault_service_auto_start (BusContext *context, 2789f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBusConnection *connection) 279093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 279193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBusMessage *message; 279293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_uint32_t serial; 279393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_bool_t retval; 279493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 279593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteSegfaultService", 279693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "/org/freedesktop/TestSuite", 279793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "org.freedesktop.TestSuite", 279893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "Echo"); 2799b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 280093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 280193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 2802b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 280393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_connection_send (connection, message, &serial)) 280493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 280593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 280693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 280793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 280893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 280993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 281093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = NULL; 281193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 281293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult bus_test_run_everything (context); 2813dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to Echo on segfault service"); 281493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult bus_test_run_everything (context); 281593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 281693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_connection_get_is_connected (connection)) 281793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 2818d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 281993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 282093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 2821b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 282293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = FALSE; 2823b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 282493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = pop_message_waiting_for_memory (connection); 282593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 282693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 282793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Did not receive a reply to %s %d on %p\n", 282893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "Echo message (auto activation)", serial, connection); 282993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 283093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 283193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 283293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult verbose_message_received (connection, message); 283393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 283493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 283593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 2836248895207dc15914ac7970a6d1431308075dca1dColin Walters if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 283793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 283893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Message has wrong sender %s\n", 283993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_get_sender (message) ? 284093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_get_sender (message) : "(none)"); 284193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 284293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 2843b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 284493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (dbus_message_is_error (message, 284593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBUS_ERROR_NO_MEMORY)) 284693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 284793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult ; /* good, this is a valid response */ 284893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 284993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else if (dbus_message_is_error (message, 285093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBUS_ERROR_SPAWN_CHILD_SIGNALED)) 285193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 285293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult ; /* good, this is expected also */ 285393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 285493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else 285593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 285693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult warn_unexpected (connection, message, "not this error"); 285793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 285893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 285993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 286093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 286193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult else 286293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 286393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult _dbus_warn ("Did not expect to successfully activate segfault service\n"); 286493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 286593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 286693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 286793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = TRUE; 2868b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 286993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out: 287093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message) 287193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 2872b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 287393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return retval; 287493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 2875e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#endif 287693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 287793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#define TEST_ECHO_MESSAGE "Test echo message" 2878a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J#define TEST_RUN_HELLO_FROM_SELF_MESSAGE "Test sending message to self" 2879a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2880a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J/* returns TRUE if the correct thing happens, 2881a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J * but the correct thing may include OOM errors. 2882a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J */ 2883a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (Jstatic dbus_bool_t 2884a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (Jcheck_existent_hello_from_self (BusContext *context, 2885a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J DBusConnection *connection) 2886a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J{ 2887a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J DBusMessage *message; 2888a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J dbus_uint32_t serial; 2889a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J const char *text; 2890a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2891a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME, 2892a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J "/org/freedesktop/TestSuite", 2893a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J "org.freedesktop.TestSuite", 2894a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J "RunHelloFromSelf"); 2895b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2896a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J if (message == NULL) 2897a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J return TRUE; 2898a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2899a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J text = TEST_RUN_HELLO_FROM_SELF_MESSAGE; 2900a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J if (!dbus_message_append_args (message, 2901a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J DBUS_TYPE_STRING, &text, 2902a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J DBUS_TYPE_INVALID)) 2903a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J { 2904a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J dbus_message_unref (message); 2905a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J return TRUE; 2906a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J } 2907a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2908a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J if (!dbus_connection_send (connection, message, &serial)) 2909a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J { 2910a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J dbus_message_unref (message); 2911a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J return TRUE; 2912a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J } 2913a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2914a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J dbus_message_unref (message); 2915a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J message = NULL; 2916a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2917a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J bus_test_run_everything (context); 2918a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2919a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J /* Note: if this test is run in OOM mode, it will block when the bus 2920a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J * doesn't send a reply due to OOM. 2921a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J */ 2922a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J block_connection_until_message_from_bus (context, connection, "reply from running hello from self"); 2923b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 2924a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J message = pop_message_waiting_for_memory (connection); 2925a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J if (message == NULL) 2926a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J { 2927a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J _dbus_warn ("Failed to pop message! Should have been reply from RunHelloFromSelf message\n"); 29285e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin return FALSE; 2929a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J } 2930a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2931a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J if (dbus_message_get_reply_serial (message) != serial) 2932a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J { 2933a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J _dbus_warn ("Wrong reply serial\n"); 29345e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin dbus_message_unref (message); 29355e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin return FALSE; 2936a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J } 2937a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 2938a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J dbus_message_unref (message); 2939a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J message = NULL; 2940b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 29415e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin return TRUE; 2942a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J} 2943a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 294466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J/* returns TRUE if the correct thing happens, 294566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J * but the correct thing may include OOM errors. 294666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J */ 294766e1cb9e68ba37980f7a90c396950be1587cdcd7John (Jstatic dbus_bool_t 294866e1cb9e68ba37980f7a90c396950be1587cdcd7John (Jcheck_existent_ping (BusContext *context, 294966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J DBusConnection *connection) 295066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J{ 295166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J DBusMessage *message; 295266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J dbus_uint32_t serial; 295366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME, 295466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J "/org/freedesktop/TestSuite", 295566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J "org.freedesktop.DBus.Peer", 295666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J "Ping"); 2957b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 295866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (message == NULL) 295966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J return TRUE; 296066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 296166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!dbus_connection_send (connection, message, &serial)) 296266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J { 296366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J dbus_message_unref (message); 296466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J return TRUE; 296566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J } 296666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 296766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J dbus_message_unref (message); 296866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J message = NULL; 296966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 297066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J bus_test_run_everything (context); 297166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 297266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J /* Note: if this test is run in OOM mode, it will block when the bus 297366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J * doesn't send a reply due to OOM. 297466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J */ 297566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J block_connection_until_message_from_bus (context, connection, "reply from running Ping"); 2976b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 297766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J message = pop_message_waiting_for_memory (connection); 297866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (message == NULL) 297966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J { 298066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J _dbus_warn ("Failed to pop message! Should have been reply from Ping message\n"); 298166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J return FALSE; 298266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J } 298366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 298466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (dbus_message_get_reply_serial (message) != serial) 298566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J { 298666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J _dbus_warn ("Wrong reply serial\n"); 298766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J dbus_message_unref (message); 298866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J return FALSE; 298966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J } 299066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 299166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN) 299266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J { 299366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J _dbus_warn ("Unexpected message return during Ping\n"); 299466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J dbus_message_unref (message); 299566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J return FALSE; 299666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J } 299766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 299866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J dbus_message_unref (message); 299966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J message = NULL; 3000b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 300166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J return TRUE; 300266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J} 300393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 300493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult/* returns TRUE if the correct thing happens, 300593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * but the correct thing may include OOM errors. 300693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 300793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t 3008d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtoncheck_existent_get_machine_id (BusContext *context, 3009d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington DBusConnection *connection) 3010d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{ 3011d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington DBusMessage *message; 3012d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_uint32_t serial; 3013d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington const char *machine_id; 3014b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3015d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME, 3016d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington "/org/freedesktop/TestSuite", 3017d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington "org.freedesktop.DBus.Peer", 3018d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington "GetMachineId"); 3019b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3020d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (message == NULL) 3021d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return TRUE; 3022d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3023d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (!dbus_connection_send (connection, message, &serial)) 3024d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington { 3025d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3026d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return TRUE; 3027d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington } 3028d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3029d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3030d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington message = NULL; 3031d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3032d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington bus_test_run_everything (context); 3033d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3034d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington /* Note: if this test is run in OOM mode, it will block when the bus 3035d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * doesn't send a reply due to OOM. 3036d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */ 3037d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply from running GetMachineId"); 3038b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3039d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington message = pop_message_waiting_for_memory (connection); 3040d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (message == NULL) 3041d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington { 3042d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington _dbus_warn ("Failed to pop message! Should have been reply from GetMachineId message\n"); 3043d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return FALSE; 3044d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington } 3045d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3046d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (dbus_message_get_reply_serial (message) != serial) 3047d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington { 3048d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington _dbus_warn ("Wrong reply serial\n"); 3049d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3050d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return FALSE; 3051d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington } 3052d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3053d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN) 3054d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington { 3055d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington _dbus_warn ("Unexpected message return during GetMachineId\n"); 3056d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3057d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return FALSE; 3058d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington } 3059d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3060d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington machine_id = NULL; 3061d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &machine_id, DBUS_TYPE_INVALID)) 3062d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington { 3063d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington _dbus_warn ("Did not get a machine ID in reply to GetMachineId\n"); 3064d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3065d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return FALSE; 3066d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington } 3067d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3068d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (machine_id == NULL || strlen (machine_id) != 32) 3069d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington { 3070d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington _dbus_warn ("Machine id looks bogus: '%s'\n", machine_id ? machine_id : "null"); 3071d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3072d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return FALSE; 3073d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington } 3074b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3075d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington /* We can't check that the machine id is correct because during make check it is 3076d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * just made up for each process separately 3077d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */ 3078b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3079d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington dbus_message_unref (message); 3080d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington message = NULL; 3081b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3082d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington return TRUE; 3083d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington} 3084d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington 3085d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/* returns TRUE if the correct thing happens, 3086d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * but the correct thing may include OOM errors. 3087d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */ 3088d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic dbus_bool_t 3089f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_existent_service_auto_start (BusContext *context, 3090f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington DBusConnection *connection) 309193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{ 309293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBusMessage *message; 30939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBusMessage *base_service_message; 309493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_uint32_t serial; 309593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_bool_t retval; 30969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *base_service; 30979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington const char *text; 309893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 30999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington base_service_message = NULL; 310093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 310193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME, 310293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "/org/freedesktop/TestSuite", 310393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "org.freedesktop.TestSuite", 310493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult "Echo"); 3105b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 310693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 310793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 310893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 31099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington text = TEST_ECHO_MESSAGE; 311093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_message_append_args (message, 31119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington DBUS_TYPE_STRING, &text, 311293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult DBUS_TYPE_INVALID)) 311393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 311493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 311593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 311693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 311793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 311893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_connection_send (connection, message, &serial)) 311993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 312093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 312193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 312293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 312393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 312493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 312593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = NULL; 312693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 312793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult bus_test_run_everything (context); 312893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 312993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult /* now wait for the message bus to hear back from the activated 313093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * service. 313193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 3132dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply to Echo on existent service"); 313393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult bus_test_run_everything (context); 313493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 313593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!dbus_connection_get_is_connected (connection)) 313693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 3137d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 313893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return TRUE; 313993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 314093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 314193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = FALSE; 3142b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 314393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = pop_message_waiting_for_memory (connection); 314493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 314593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 31468873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_warn ("Did not receive any messages after auto start %d on %p\n", 314793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult serial, connection); 314893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 314993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 315093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 315193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult verbose_message_received (connection, message); 31528873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_verbose (" (after sending %s)\n", "auto start"); 315393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 315485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu /* we should get zero or two ServiceOwnerChanged signals */ 315585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL) 315693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 315785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu GotServiceInfo message_kind; 315893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 315993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (!check_base_service_activated (context, connection, 316093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message, &base_service)) 3161075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3162075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3163075945f611290f2b9db9a4ed6cf5433f2fd85785John (J base_service_message = message; 3164075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3165075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3166075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* We may need to block here for the test service to exit or finish up */ 3167075945f611290f2b9db9a4ed6cf5433f2fd85785John (J block_connection_until_message_from_bus (context, connection, "service to exit"); 3168075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3169075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* Should get a service creation notification for the activated 3170075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * service name, or a service deletion on the base service name 3171075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3172075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = dbus_connection_borrow_message (connection); 3173075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3174075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3175075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("No message after auto activation " 3176cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen "(should be a service announcement)\n"); 3177075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_connection_return_message (connection, message); 3178075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3179075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3180075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3181075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3182075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message_kind = check_got_service_info (message); 3183075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3184075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_connection_return_message (connection, message); 3185075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3186075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3187b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering switch (message_kind) 3188075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3189075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SERVICE_CREATED: 3190075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = pop_message_waiting_for_memory (connection); 3191075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3192075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3193075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Failed to pop message we just put back! " 3194075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "should have been a NameOwnerChanged (creation)\n"); 3195075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3196075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3197b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3198075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* Check that ServiceOwnerChanged (creation) was correctly received */ 3199075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!check_service_auto_activated (context, connection, EXISTENT_SERVICE_NAME, 3200075945f611290f2b9db9a4ed6cf5433f2fd85785John (J base_service, message)) 3201075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3202b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3203075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3204075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3205075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3206075945f611290f2b9db9a4ed6cf5433f2fd85785John (J break; 3207075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3208075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SERVICE_DELETED: 3209075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3210075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* The service started up and got a base address, but then 3211075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * failed to register under EXISTENT_SERVICE_NAME 3212075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3213075945f611290f2b9db9a4ed6cf5433f2fd85785John (J CheckServiceOwnerChangedData socd; 3214b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3215075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.expected_kind = SERVICE_DELETED; 3216075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.expected_service_name = base_service; 3217075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.failed = FALSE; 3218075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.skip_connection = NULL; 3219075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_clients_foreach (check_service_owner_changed_foreach, 3220075945f611290f2b9db9a4ed6cf5433f2fd85785John (J &socd); 3221075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3222075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (socd.failed) 3223075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3224075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3225075945f611290f2b9db9a4ed6cf5433f2fd85785John (J break; 3226075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3227075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3228075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_ERROR: 3229075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SOMETHING_ELSE: 3230075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Unexpected message after auto activation\n"); 3231075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3232075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3233075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3234075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3235075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* OK, now we've dealt with ServiceOwnerChanged signals, now should 3236075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * come the method reply (or error) from the initial method call 3237075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3238075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3239075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* Note: if this test is run in OOM mode, it will block when the bus 3240075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * doesn't send a reply due to OOM. 3241075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3242075945f611290f2b9db9a4ed6cf5433f2fd85785John (J block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation"); 3243b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3244075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = pop_message_waiting_for_memory (connection); 3245075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3246075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3247075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Failed to pop message! Should have been reply from echo message\n"); 3248075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3249075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3250075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3251075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (dbus_message_get_reply_serial (message) != serial) 3252075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3253075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Wrong reply serial\n"); 3254075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3255075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3256075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3257075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3258075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3259a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 326066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J if (!check_existent_ping (context, connection)) 326166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J goto out; 326266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J 3263d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington if (!check_existent_get_machine_id (context, connection)) 3264d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington goto out; 3265b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3266a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J if (!check_existent_hello_from_self (context, connection)) 3267a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J goto out; 3268a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J 3269075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!check_send_exit_to_service (context, connection, 3270075945f611290f2b9db9a4ed6cf5433f2fd85785John (J EXISTENT_SERVICE_NAME, 3271075945f611290f2b9db9a4ed6cf5433f2fd85785John (J base_service)) 3272075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3273b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3274075945f611290f2b9db9a4ed6cf5433f2fd85785John (J retval = TRUE; 3275075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3276075945f611290f2b9db9a4ed6cf5433f2fd85785John (J out: 3277075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message) 3278075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3279075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3280075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (base_service_message) 3281075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (base_service_message); 3282075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3283075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return retval; 3284075945f611290f2b9db9a4ed6cf5433f2fd85785John (J} 3285075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3286c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_FILE_MISSING_NAME "org.freedesktop.DBus.TestSuiteEchoServiceDotServiceFileDoesNotExist" 3287c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3288c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens, 3289c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors. 3290c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */ 3291c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t 3292c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_file_missing (BusContext *context, 3293c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusConnection *connection) 3294c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{ 3295c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusMessage *message; 3296c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_uint32_t serial; 3297c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_bool_t retval; 3298c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3299c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = dbus_message_new_method_call (SERVICE_FILE_MISSING_NAME, 3300c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "/org/freedesktop/TestSuite", 3301c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "org.freedesktop.TestSuite", 3302c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo"); 3303b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3304c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3305c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3306c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3307c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_send (connection, message, &serial)) 3308c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3309c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3310c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3311c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3312c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3313c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3314c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = NULL; 3315c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3316c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3317c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes block_connection_until_message_from_bus (context, connection, "reply to service file missing should fail to auto-start"); 3318c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3319c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3320c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_get_is_connected (connection)) 3321c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3322d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 3323c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3324c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3325b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3326c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = FALSE; 3327b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3328c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = pop_message_waiting_for_memory (connection); 3329c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3330c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3331c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not receive a reply to %s %d on %p\n", 3332c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo message (auto activation)", serial, connection); 3333c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3334c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3335c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3336c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes verbose_message_received (connection, message); 3337c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3338c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 3339c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3340c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 3341c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3342c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Message has wrong sender %s\n", 3343c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) ? 3344c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) : "(none)"); 3345c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3346c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3347b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3348c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_is_error (message, 3349c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_NO_MEMORY)) 3350c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3351c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is a valid response */ 3352c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3353c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 3354c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_SERVICE_UNKNOWN)) 3355c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3356c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose("got service unknown\n"); 3357c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is expected (only valid when using launch helper) */ 3358c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3359c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3360c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3361c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes warn_unexpected (connection, message, "not this error"); 3362c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3363c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3364c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3365c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3366c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3367c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3368c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not expect to successfully auto-start missing service\n"); 3369c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3370c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3371c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3372c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = TRUE; 3373b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3374c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out: 3375c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message) 3376c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3377b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3378c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return retval; 3379c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes} 3380c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3381c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_USER_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoUser" 3382c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3383c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens, 3384c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors. 3385c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */ 3386c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t 3387c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_user_missing (BusContext *context, 3388c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusConnection *connection) 3389c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{ 3390c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusMessage *message; 3391c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_uint32_t serial; 3392c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_bool_t retval; 3393c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3394c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = dbus_message_new_method_call (SERVICE_USER_MISSING_NAME, 3395c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "/org/freedesktop/TestSuite", 3396c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "org.freedesktop.TestSuite", 3397c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo"); 3398c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3399c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3400c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3401c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3402c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_send (connection, message, &serial)) 3403c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3404c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3405c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3406c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3407c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3408c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3409c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = NULL; 3410c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3411c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3412c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes block_connection_until_message_from_bus (context, connection, 3413c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "reply to service which should fail to auto-start (missing User)"); 3414c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3415c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3416c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_get_is_connected (connection)) 3417c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3418d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_warn ("connection was disconnected\n"); 3419c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3420c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3421b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3422c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = FALSE; 3423b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3424c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = pop_message_waiting_for_memory (connection); 3425c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3426c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3427c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not receive a reply to %s %d on %p\n", 3428c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo message (auto activation)", serial, connection); 3429c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3430c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3431c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3432c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes verbose_message_received (connection, message); 3433c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3434c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 3435c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3436c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 3437c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3438c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Message has wrong sender %s\n", 3439c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) ? 3440c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) : "(none)"); 3441c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3442c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3443b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3444c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_is_error (message, 3445c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_NO_MEMORY)) 3446c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3447c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is a valid response */ 3448c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3449c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 3450c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_SPAWN_FILE_INVALID)) 3451c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3452c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose("got service file invalid\n"); 3453c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is expected (only valid when using launch helper) */ 3454c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3455c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3456c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3457c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes warn_unexpected (connection, message, "not this error"); 3458c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3459c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3460c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3461c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3462c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3463c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3464c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not expect to successfully auto-start missing service\n"); 3465c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3466c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3467c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3468c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = TRUE; 3469b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3470c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out: 3471c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message) 3472c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3473b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3474c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return retval; 3475c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes} 3476c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3477c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_EXEC_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoExec" 3478c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3479c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens, 3480c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors. 3481c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */ 3482c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t 3483c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_exec_missing (BusContext *context, 3484c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusConnection *connection) 3485c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{ 3486c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusMessage *message; 3487c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_uint32_t serial; 3488c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_bool_t retval; 3489c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3490c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = dbus_message_new_method_call (SERVICE_EXEC_MISSING_NAME, 3491c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "/org/freedesktop/TestSuite", 3492c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "org.freedesktop.TestSuite", 3493c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo"); 3494c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3495c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3496c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3497c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3498c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_send (connection, message, &serial)) 3499c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3500c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3501c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3502c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3503c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3504c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3505c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = NULL; 3506c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3507c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3508c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes block_connection_until_message_from_bus (context, connection, 3509c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "reply to service which should fail to auto-start (missing Exec)"); 3510c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3511c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3512c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_get_is_connected (connection)) 3513c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3514d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_warn ("connection was disconnected\n"); 3515c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3516c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3517b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3518c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = FALSE; 3519b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3520c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = pop_message_waiting_for_memory (connection); 3521c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3522c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3523c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not receive a reply to %s %d on %p\n", 3524c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo message (auto activation)", serial, connection); 3525c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3526c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3527c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3528c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes verbose_message_received (connection, message); 3529c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3530c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 3531c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3532c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 3533c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3534c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Message has wrong sender %s\n", 3535c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) ? 3536c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) : "(none)"); 3537c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3538c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3539b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3540c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_is_error (message, 3541c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_NO_MEMORY)) 3542c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3543c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is a valid response */ 3544c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3545c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 3546c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_SERVICE_UNKNOWN)) 3547c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3548c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose("could not activate as invalid service file was not added\n"); 3549c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is expected as we shouldn't have been added to 3550c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * the activation list with a missing Exec key */ 3551c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3552c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 3553c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_SPAWN_FILE_INVALID)) 3554c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3555c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose("got service file invalid\n"); 3556c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is allowed, and is the message passed back from the 3557c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * launch helper */ 3558c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3559c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3560c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3561c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes warn_unexpected (connection, message, "not this error"); 3562c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3563c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3564c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3565c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3566c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3567c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3568c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not expect to successfully auto-start missing service\n"); 3569c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3570c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3571c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3572c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = TRUE; 3573b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3574c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out: 3575c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message) 3576c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3577b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3578c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return retval; 3579c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes} 3580c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3581c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_SERVICE_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoService" 3582c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3583c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens, 3584c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors. 3585c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */ 3586c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t 3587c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_service_missing (BusContext *context, 3588c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusConnection *connection) 3589c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{ 3590c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusMessage *message; 3591c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_uint32_t serial; 3592c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_bool_t retval; 3593c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3594c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = dbus_message_new_method_call (SERVICE_SERVICE_MISSING_NAME, 3595c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "/org/freedesktop/TestSuite", 3596c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "org.freedesktop.TestSuite", 3597c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo"); 3598c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3599c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3600c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3601c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3602c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_send (connection, message, &serial)) 3603c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3604c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3605c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3606c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3607c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3608c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3609c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = NULL; 3610c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3611c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3612c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes block_connection_until_message_from_bus (context, connection, 3613c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "reply to service which should fail to auto-start (missing Service)"); 3614c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_test_run_everything (context); 3615c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3616c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_connection_get_is_connected (connection)) 3617c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3618d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_warn ("connection was disconnected\n"); 3619c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 3620c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3621b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3622c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = FALSE; 3623b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3624c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes message = pop_message_waiting_for_memory (connection); 3625c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message == NULL) 3626c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3627c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not receive a reply to %s %d on %p\n", 3628c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "Echo message (auto activation)", serial, connection); 3629c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3630c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3631c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3632c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes verbose_message_received (connection, message); 3633c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3634c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 3635c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3636c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 3637c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3638c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Message has wrong sender %s\n", 3639c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) ? 3640c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_get_sender (message) : "(none)"); 3641c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3642c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3643b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3644c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (dbus_message_is_error (message, 3645c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_NO_MEMORY)) 3646c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3647c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is a valid response */ 3648c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3649c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 3650c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_SERVICE_UNKNOWN)) 3651c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3652c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose("could not activate as invalid service file was not added\n"); 3653c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is expected as we shouldn't have been added to 3654c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * the activation list with a missing Exec key */ 3655c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3656c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else if (dbus_message_is_error (message, 3657c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBUS_ERROR_SPAWN_FILE_INVALID)) 3658c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3659c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose("got service file invalid\n"); 3660c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes ; /* good, this is allowed, and is the message passed back from the 3661c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * launch helper */ 3662c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3663c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3664c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3665c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes warn_unexpected (connection, message, "not this error"); 3666c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3667c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3668c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3669c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3670c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes else 3671c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes { 3672c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_warn ("Did not expect to successfully auto-start missing service\n"); 3673c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes goto out; 3674c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes } 3675c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3676c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes retval = TRUE; 3677b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3678c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out: 3679c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (message) 3680c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_message_unref (message); 3681b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3682c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return retval; 3683c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes} 3684c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 3685075945f611290f2b9db9a4ed6cf5433f2fd85785John (J#define SHELL_FAIL_SERVICE_NAME "org.freedesktop.DBus.TestSuiteShellEchoServiceFail" 3686075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3687075945f611290f2b9db9a4ed6cf5433f2fd85785John (J/* returns TRUE if the correct thing happens, 3688075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * but the correct thing may include OOM errors. 3689075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3690075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jstatic dbus_bool_t 3691075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jcheck_shell_fail_service_auto_start (BusContext *context, 3692075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusConnection *connection) 3693075945f611290f2b9db9a4ed6cf5433f2fd85785John (J{ 3694075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusMessage *message; 3695075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_uint32_t serial; 3696075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_bool_t retval; 3697075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3698075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = dbus_message_new_method_call (SHELL_FAIL_SERVICE_NAME, 3699075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "/org/freedesktop/TestSuite", 3700075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "org.freedesktop.TestSuite", 3701075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "Echo"); 3702b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3703075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3704075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return TRUE; 3705b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3706075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!dbus_connection_send (connection, message, &serial)) 3707075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3708075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3709075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return TRUE; 3710075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3711075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3712075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3713075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3714075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3715075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_run_everything (context); 3716075945f611290f2b9db9a4ed6cf5433f2fd85785John (J block_connection_until_message_from_bus (context, connection, "reply to shell Echo on service which should fail to auto-start"); 3717075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_run_everything (context); 3718075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3719075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!dbus_connection_get_is_connected (connection)) 3720075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3721d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 3722075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return TRUE; 3723075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3724b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3725075945f611290f2b9db9a4ed6cf5433f2fd85785John (J retval = FALSE; 3726b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3727075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = pop_message_waiting_for_memory (connection); 3728075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3729075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3730075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Did not receive a reply to %s %d on %p\n", 3731075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "Echo message (auto activation)", serial, connection); 3732075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3733075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3734075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3735075945f611290f2b9db9a4ed6cf5433f2fd85785John (J verbose_message_received (connection, message); 3736075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3737075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 3738075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3739075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 3740075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3741075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Message has wrong sender %s\n", 3742075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_get_sender (message) ? 3743075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_get_sender (message) : "(none)"); 3744075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3745075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3746b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3747075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (dbus_message_is_error (message, 3748075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_ERROR_NO_MEMORY)) 3749075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3750075945f611290f2b9db9a4ed6cf5433f2fd85785John (J ; /* good, this is a valid response */ 3751075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3752075945f611290f2b9db9a4ed6cf5433f2fd85785John (J else if (dbus_message_is_error (message, 3753075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_ERROR_INVALID_ARGS)) 3754075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3755075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_verbose("got invalid args\n"); 3756075945f611290f2b9db9a4ed6cf5433f2fd85785John (J ; /* good, this is expected also */ 3757075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3758075945f611290f2b9db9a4ed6cf5433f2fd85785John (J else 3759075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3760075945f611290f2b9db9a4ed6cf5433f2fd85785John (J warn_unexpected (connection, message, "not this error"); 3761075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3762075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3763075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3764075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3765075945f611290f2b9db9a4ed6cf5433f2fd85785John (J else 3766075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3767075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Did not expect to successfully auto-start shell fail service\n"); 3768075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3769075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3770075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3771075945f611290f2b9db9a4ed6cf5433f2fd85785John (J retval = TRUE; 3772b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3773075945f611290f2b9db9a4ed6cf5433f2fd85785John (J out: 3774075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message) 3775075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3776b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3777075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return retval; 3778075945f611290f2b9db9a4ed6cf5433f2fd85785John (J} 3779075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3780075945f611290f2b9db9a4ed6cf5433f2fd85785John (J#define SHELL_SUCCESS_SERVICE_NAME "org.freedesktop.DBus.TestSuiteShellEchoServiceSuccess" 3781075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3782075945f611290f2b9db9a4ed6cf5433f2fd85785John (J/* returns TRUE if the correct thing happens, 3783075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * but the correct thing may include OOM errors. 3784075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3785075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jstatic dbus_bool_t 3786075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jcheck_shell_service_success_auto_start (BusContext *context, 3787075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusConnection *connection) 3788075945f611290f2b9db9a4ed6cf5433f2fd85785John (J{ 3789075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusMessage *message; 3790075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBusMessage *base_service_message; 3791075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_uint32_t serial; 3792075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_bool_t retval; 3793075945f611290f2b9db9a4ed6cf5433f2fd85785John (J const char *base_service; 3794075945f611290f2b9db9a4ed6cf5433f2fd85785John (J const char *argv[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; 3795075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3796075945f611290f2b9db9a4ed6cf5433f2fd85785John (J base_service_message = NULL; 3797075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3798075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = dbus_message_new_method_call (SHELL_SUCCESS_SERVICE_NAME, 3799075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "/org/freedesktop/TestSuite", 3800075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "org.freedesktop.TestSuite", 3801075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "Echo"); 3802b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3803075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3804075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return TRUE; 3805075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3806075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!dbus_connection_send (connection, message, &serial)) 3807075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3808075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3809075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return TRUE; 3810075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3811075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3812075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3813075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3814075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3815075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_run_everything (context); 3816075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3817075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* now wait for the message bus to hear back from the activated 3818075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * service. 3819075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3820075945f611290f2b9db9a4ed6cf5433f2fd85785John (J block_connection_until_message_from_bus (context, connection, "reply to Echo on shell success service"); 3821075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_run_everything (context); 3822075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3823075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!dbus_connection_get_is_connected (connection)) 3824075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3825d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 3826075945f611290f2b9db9a4ed6cf5433f2fd85785John (J return TRUE; 3827075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3828075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3829075945f611290f2b9db9a4ed6cf5433f2fd85785John (J retval = FALSE; 3830b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3831075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = pop_message_waiting_for_memory (connection); 3832075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3833075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3834075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Did not receive any messages after auto start %d on %p\n", 3835075945f611290f2b9db9a4ed6cf5433f2fd85785John (J serial, connection); 3836075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3837075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3838075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3839075945f611290f2b9db9a4ed6cf5433f2fd85785John (J verbose_message_received (connection, message); 3840075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_verbose (" (after sending %s)\n", "auto start"); 3841075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3842075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* we should get zero or two ServiceOwnerChanged signals */ 3843075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL) 3844075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3845075945f611290f2b9db9a4ed6cf5433f2fd85785John (J GotServiceInfo message_kind; 3846075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3847075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!check_base_service_activated (context, connection, 3848075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message, &base_service)) 3849075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 385093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 38519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington base_service_message = message; 385293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = NULL; 385393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 385493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult /* We may need to block here for the test service to exit or finish up */ 3855dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "service to exit"); 385693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 385785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu /* Should get a service creation notification for the activated 385885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu * service name, or a service deletion on the base service name 385993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 386093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = dbus_connection_borrow_message (connection); 386193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message == NULL) 386293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult { 3863075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("No message after auto activation " 3864cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen "(should be a service announcement)\n"); 3865075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_connection_return_message (connection, message); 3866075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 386793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult goto out; 386893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 386993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 387085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message_kind = check_got_service_info (message); 387193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 387293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_connection_return_message (connection, message); 387393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult message = NULL; 387493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 3875b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering switch (message_kind) 3876075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3877075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SERVICE_CREATED: 3878075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = pop_message_waiting_for_memory (connection); 3879075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (message == NULL) 3880075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3881075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Failed to pop message we just put back! " 3882075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "should have been a NameOwnerChanged (creation)\n"); 3883075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3884075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3885b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3886075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* Check that ServiceOwnerChanged (creation) was correctly received */ 3887075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!check_service_auto_activated (context, connection, SHELL_SUCCESS_SERVICE_NAME, 3888075945f611290f2b9db9a4ed6cf5433f2fd85785John (J base_service, message)) 3889075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3890b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3891075945f611290f2b9db9a4ed6cf5433f2fd85785John (J dbus_message_unref (message); 3892075945f611290f2b9db9a4ed6cf5433f2fd85785John (J message = NULL; 3893075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3894075945f611290f2b9db9a4ed6cf5433f2fd85785John (J break; 389585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 3896075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SERVICE_DELETED: 3897075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3898075945f611290f2b9db9a4ed6cf5433f2fd85785John (J /* The service started up and got a base address, but then 3899075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * failed to register under SHELL_SUCCESS_SERVICE_NAME 3900075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3901075945f611290f2b9db9a4ed6cf5433f2fd85785John (J CheckServiceOwnerChangedData socd; 3902b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3903075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.expected_kind = SERVICE_DELETED; 3904075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.expected_service_name = base_service; 3905075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.failed = FALSE; 3906075945f611290f2b9db9a4ed6cf5433f2fd85785John (J socd.skip_connection = NULL; 3907075945f611290f2b9db9a4ed6cf5433f2fd85785John (J bus_test_clients_foreach (check_service_owner_changed_foreach, 3908075945f611290f2b9db9a4ed6cf5433f2fd85785John (J &socd); 3909075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3910075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (socd.failed) 3911075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 391293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 3913075945f611290f2b9db9a4ed6cf5433f2fd85785John (J break; 3914075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 391585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 391685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu case GOT_ERROR: 3917075945f611290f2b9db9a4ed6cf5433f2fd85785John (J case GOT_SOMETHING_ELSE: 3918075945f611290f2b9db9a4ed6cf5433f2fd85785John (J _dbus_warn ("Unexpected message after auto activation\n"); 3919075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3920075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 392185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 392293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 392385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu /* OK, now we've dealt with ServiceOwnerChanged signals, now should 392485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu * come the method reply (or error) from the initial method call 392585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu */ 392685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 392785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu /* Note: if this test is run in OOM mode, it will block when the bus 392885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu * doesn't send a reply due to OOM. 392985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu */ 3930dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation"); 3931b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 393285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message = pop_message_waiting_for_memory (connection); 393385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (message == NULL) 393485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 393585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Failed to pop message! Should have been reply from echo message\n"); 393685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 393785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu } 393885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 393985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (dbus_message_get_reply_serial (message) != serial) 394085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu { 394185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu _dbus_warn ("Wrong reply serial\n"); 394285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 394393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult } 394485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu 3945075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (!dbus_message_get_args (message, NULL, 3946b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering DBUS_TYPE_STRING, &argv[0], 3947075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &argv[1], 3948075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &argv[2], 3949075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &argv[3], 3950075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &argv[4], 3951075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &argv[5], 3952075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_STRING, &argv[6], 3953075945f611290f2b9db9a4ed6cf5433f2fd85785John (J DBUS_TYPE_INVALID)) 3954075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3955cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen _dbus_warn ("Error getting arguments from return\n"); 3956075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3957075945f611290f2b9db9a4ed6cf5433f2fd85785John (J } 3958075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3959b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering /* don't worry about arg[0] as it may be different 3960075945f611290f2b9db9a4ed6cf5433f2fd85785John (J depending on the path to the tests 3961075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */ 3962075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (strcmp("-test", argv[1]) != 0) 3963075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3964b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)\n", 3965075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "-test", argv[1]); 3966075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3967b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 3968075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3969075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (strcmp("that", argv[2]) != 0) 3970075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3971b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)\n", 3972075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "that", argv[2]); 3973075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3974b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 3975075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3976075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (strcmp("we get", argv[3]) != 0) 3977075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3978b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)\n", 3979075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "we get", argv[3]); 3980075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3981b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 3982b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 3983075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (strcmp("back", argv[4]) != 0) 3984075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3985b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)\n", 3986075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "back", argv[4]); 3987075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3988b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 3989075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3990075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (strcmp("--what", argv[5]) != 0) 3991075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3992b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)\n", 3993075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "--what", argv[5]); 3994075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 3995b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 3996075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 3997075945f611290f2b9db9a4ed6cf5433f2fd85785John (J if (strcmp("we put in", argv[6]) != 0) 3998075945f611290f2b9db9a4ed6cf5433f2fd85785John (J { 3999b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)\n", 4000075945f611290f2b9db9a4ed6cf5433f2fd85785John (J "we put in", argv[6]); 4001075945f611290f2b9db9a4ed6cf5433f2fd85785John (J goto out; 4002b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 4003075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 400485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu dbus_message_unref (message); 400585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu message = NULL; 4006b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 400785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu if (!check_send_exit_to_service (context, connection, 4008075945f611290f2b9db9a4ed6cf5433f2fd85785John (J SHELL_SUCCESS_SERVICE_NAME, 4009075945f611290f2b9db9a4ed6cf5433f2fd85785John (J base_service)) 401085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu goto out; 4011b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 401293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult retval = TRUE; 401393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 401493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out: 401593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult if (message) 401693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult dbus_message_unref (message); 401793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 40189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington if (base_service_message) 40199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington dbus_message_unref (base_service_message); 402093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 402193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult return retval; 402293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult} 402393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 4024bf99381351b802fb3348a24037898222aae631e2Havoc Penningtontypedef struct 4025f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{ 4026bf99381351b802fb3348a24037898222aae631e2Havoc Pennington Check1Func func; 4027bf99381351b802fb3348a24037898222aae631e2Havoc Pennington BusContext *context; 4028bf99381351b802fb3348a24037898222aae631e2Havoc Pennington} Check1Data; 4029f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 4030bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic dbus_bool_t 4031bf99381351b802fb3348a24037898222aae631e2Havoc Penningtoncheck_oom_check1_func (void *data) 4032bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{ 4033bf99381351b802fb3348a24037898222aae631e2Havoc Pennington Check1Data *d = data; 4034f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 4035bf99381351b802fb3348a24037898222aae631e2Havoc Pennington if (! (* d->func) (d->context)) 4036bf99381351b802fb3348a24037898222aae631e2Havoc Pennington return FALSE; 4037b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4038bf99381351b802fb3348a24037898222aae631e2Havoc Pennington if (!check_no_leftovers (d->context)) 4039f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington { 4040fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington _dbus_warn ("Messages were left over, should be covered by test suite\n"); 4041bf99381351b802fb3348a24037898222aae631e2Havoc Pennington return FALSE; 4042bf99381351b802fb3348a24037898222aae631e2Havoc Pennington } 4043f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 4044bf99381351b802fb3348a24037898222aae631e2Havoc Pennington return TRUE; 4045bf99381351b802fb3348a24037898222aae631e2Havoc Pennington} 4046f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 4047bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic void 4048bf99381351b802fb3348a24037898222aae631e2Havoc Penningtoncheck1_try_iterations (BusContext *context, 4049bf99381351b802fb3348a24037898222aae631e2Havoc Pennington const char *description, 4050bf99381351b802fb3348a24037898222aae631e2Havoc Pennington Check1Func func) 4051bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{ 4052bf99381351b802fb3348a24037898222aae631e2Havoc Pennington Check1Data d; 4053f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 4054bf99381351b802fb3348a24037898222aae631e2Havoc Pennington d.func = func; 4055bf99381351b802fb3348a24037898222aae631e2Havoc Pennington d.context = context; 4056f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington 4057bf99381351b802fb3348a24037898222aae631e2Havoc Pennington if (!_dbus_test_oom_handling (description, check_oom_check1_func, 4058bf99381351b802fb3348a24037898222aae631e2Havoc Pennington &d)) 4059bf99381351b802fb3348a24037898222aae631e2Havoc Pennington _dbus_assert_not_reached ("test failed"); 4060f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington} 4061f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 40627628b541258d906e27e2000a402ed2d02383479cJohn (Jstatic dbus_bool_t 40637628b541258d906e27e2000a402ed2d02383479cJohn (Jcheck_get_services (BusContext *context, 40647628b541258d906e27e2000a402ed2d02383479cJohn (J DBusConnection *connection, 40657628b541258d906e27e2000a402ed2d02383479cJohn (J const char *method, 40667628b541258d906e27e2000a402ed2d02383479cJohn (J char ***services, 40677628b541258d906e27e2000a402ed2d02383479cJohn (J int *len) 40687628b541258d906e27e2000a402ed2d02383479cJohn (J{ 40697628b541258d906e27e2000a402ed2d02383479cJohn (J DBusMessage *message; 40707628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_uint32_t serial; 40717628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_bool_t retval; 40727628b541258d906e27e2000a402ed2d02383479cJohn (J DBusError error; 40737628b541258d906e27e2000a402ed2d02383479cJohn (J char **srvs; 40747628b541258d906e27e2000a402ed2d02383479cJohn (J int l; 40757628b541258d906e27e2000a402ed2d02383479cJohn (J 40767628b541258d906e27e2000a402ed2d02383479cJohn (J retval = FALSE; 40777628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_error_init (&error); 40787628b541258d906e27e2000a402ed2d02383479cJohn (J message = NULL; 40797628b541258d906e27e2000a402ed2d02383479cJohn (J 40807628b541258d906e27e2000a402ed2d02383479cJohn (J message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 40817628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_PATH_DBUS, 40827628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_INTERFACE_DBUS, 40837628b541258d906e27e2000a402ed2d02383479cJohn (J method); 40847628b541258d906e27e2000a402ed2d02383479cJohn (J 40857628b541258d906e27e2000a402ed2d02383479cJohn (J if (message == NULL) 40867628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 40877628b541258d906e27e2000a402ed2d02383479cJohn (J 40887628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_connection_send (connection, message, &serial)) 40897628b541258d906e27e2000a402ed2d02383479cJohn (J { 40907628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 40917628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 40927628b541258d906e27e2000a402ed2d02383479cJohn (J } 40937628b541258d906e27e2000a402ed2d02383479cJohn (J 40947628b541258d906e27e2000a402ed2d02383479cJohn (J /* send our message */ 40957628b541258d906e27e2000a402ed2d02383479cJohn (J bus_test_run_clients_loop (SEND_PENDING (connection)); 40967628b541258d906e27e2000a402ed2d02383479cJohn (J 40977628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 40987628b541258d906e27e2000a402ed2d02383479cJohn (J message = NULL; 40997628b541258d906e27e2000a402ed2d02383479cJohn (J 41007628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_connection_ref (connection); /* because we may get disconnected */ 41017628b541258d906e27e2000a402ed2d02383479cJohn (J block_connection_until_message_from_bus (context, connection, "reply to ListActivatableNames/ListNames"); 41027628b541258d906e27e2000a402ed2d02383479cJohn (J 41037628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_connection_get_is_connected (connection)) 41047628b541258d906e27e2000a402ed2d02383479cJohn (J { 4105d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 41067628b541258d906e27e2000a402ed2d02383479cJohn (J 41077628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_connection_unref (connection); 41087628b541258d906e27e2000a402ed2d02383479cJohn (J 41097628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 41107628b541258d906e27e2000a402ed2d02383479cJohn (J } 41117628b541258d906e27e2000a402ed2d02383479cJohn (J 41127628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_connection_unref (connection); 41137628b541258d906e27e2000a402ed2d02383479cJohn (J 41147628b541258d906e27e2000a402ed2d02383479cJohn (J message = pop_message_waiting_for_memory (connection); 41157628b541258d906e27e2000a402ed2d02383479cJohn (J if (message == NULL) 41167628b541258d906e27e2000a402ed2d02383479cJohn (J { 41177628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not receive a reply to %s %d on %p\n", 41187628b541258d906e27e2000a402ed2d02383479cJohn (J method, serial, connection); 41197628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 41207628b541258d906e27e2000a402ed2d02383479cJohn (J } 41217628b541258d906e27e2000a402ed2d02383479cJohn (J 41227628b541258d906e27e2000a402ed2d02383479cJohn (J verbose_message_received (connection, message); 41237628b541258d906e27e2000a402ed2d02383479cJohn (J 41247628b541258d906e27e2000a402ed2d02383479cJohn (J if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 41257628b541258d906e27e2000a402ed2d02383479cJohn (J { 41267628b541258d906e27e2000a402ed2d02383479cJohn (J if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) 41277628b541258d906e27e2000a402ed2d02383479cJohn (J { 41287628b541258d906e27e2000a402ed2d02383479cJohn (J ; /* good, this is a valid response */ 41297628b541258d906e27e2000a402ed2d02383479cJohn (J } 41307628b541258d906e27e2000a402ed2d02383479cJohn (J else 41317628b541258d906e27e2000a402ed2d02383479cJohn (J { 41327628b541258d906e27e2000a402ed2d02383479cJohn (J warn_unexpected (connection, message, "not this error"); 41337628b541258d906e27e2000a402ed2d02383479cJohn (J 41347628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 41357628b541258d906e27e2000a402ed2d02383479cJohn (J } 41367628b541258d906e27e2000a402ed2d02383479cJohn (J } 41377628b541258d906e27e2000a402ed2d02383479cJohn (J else 41387628b541258d906e27e2000a402ed2d02383479cJohn (J { 41397628b541258d906e27e2000a402ed2d02383479cJohn (J if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) 41407628b541258d906e27e2000a402ed2d02383479cJohn (J { 41417628b541258d906e27e2000a402ed2d02383479cJohn (J ; /* good, expected */ 41427628b541258d906e27e2000a402ed2d02383479cJohn (J } 41437628b541258d906e27e2000a402ed2d02383479cJohn (J else 41447628b541258d906e27e2000a402ed2d02383479cJohn (J { 41457628b541258d906e27e2000a402ed2d02383479cJohn (J warn_unexpected (connection, message, 41467628b541258d906e27e2000a402ed2d02383479cJohn (J "method_return for ListActivatableNames/ListNames"); 41477628b541258d906e27e2000a402ed2d02383479cJohn (J 41487628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 41497628b541258d906e27e2000a402ed2d02383479cJohn (J } 41507628b541258d906e27e2000a402ed2d02383479cJohn (J 41517628b541258d906e27e2000a402ed2d02383479cJohn (J retry_get_property: 41527628b541258d906e27e2000a402ed2d02383479cJohn (J 41537628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_message_get_args (message, &error, 41547628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_TYPE_ARRAY, 41557628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_TYPE_STRING, 41567628b541258d906e27e2000a402ed2d02383479cJohn (J &srvs, &l, 41577628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_TYPE_INVALID)) 41587628b541258d906e27e2000a402ed2d02383479cJohn (J { 41597628b541258d906e27e2000a402ed2d02383479cJohn (J if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 41607628b541258d906e27e2000a402ed2d02383479cJohn (J { 41617628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_verbose ("no memory to list services by %s\n", method); 41627628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_error_free (&error); 41637628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_wait_for_memory (); 41647628b541258d906e27e2000a402ed2d02383479cJohn (J goto retry_get_property; 41657628b541258d906e27e2000a402ed2d02383479cJohn (J } 41667628b541258d906e27e2000a402ed2d02383479cJohn (J else 41677628b541258d906e27e2000a402ed2d02383479cJohn (J { 41687628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_assert (dbus_error_is_set (&error)); 41697628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not get the expected DBUS_TYPE_ARRAY from %s\n", method); 41707628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 41717628b541258d906e27e2000a402ed2d02383479cJohn (J } 41727628b541258d906e27e2000a402ed2d02383479cJohn (J } else { 41737628b541258d906e27e2000a402ed2d02383479cJohn (J *services = srvs; 41747628b541258d906e27e2000a402ed2d02383479cJohn (J *len = l; 41757628b541258d906e27e2000a402ed2d02383479cJohn (J } 41767628b541258d906e27e2000a402ed2d02383479cJohn (J } 4177b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 41787628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_no_leftovers (context)) 41797628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 4180b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 41817628b541258d906e27e2000a402ed2d02383479cJohn (J retval = TRUE; 4182b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 41837628b541258d906e27e2000a402ed2d02383479cJohn (J out: 41847628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_error_free (&error); 4185b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 41867628b541258d906e27e2000a402ed2d02383479cJohn (J if (message) 41877628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 41887628b541258d906e27e2000a402ed2d02383479cJohn (J 41897628b541258d906e27e2000a402ed2d02383479cJohn (J return retval; 41907628b541258d906e27e2000a402ed2d02383479cJohn (J} 41917628b541258d906e27e2000a402ed2d02383479cJohn (J 41927628b541258d906e27e2000a402ed2d02383479cJohn (J/* returns TRUE if the correct thing happens, 41937628b541258d906e27e2000a402ed2d02383479cJohn (J * but the correct thing may include OOM errors. 41947628b541258d906e27e2000a402ed2d02383479cJohn (J */ 41957628b541258d906e27e2000a402ed2d02383479cJohn (Jstatic dbus_bool_t 41967628b541258d906e27e2000a402ed2d02383479cJohn (Jcheck_list_services (BusContext *context, 41977628b541258d906e27e2000a402ed2d02383479cJohn (J DBusConnection *connection) 41987628b541258d906e27e2000a402ed2d02383479cJohn (J{ 41997628b541258d906e27e2000a402ed2d02383479cJohn (J DBusMessage *message; 42007628b541258d906e27e2000a402ed2d02383479cJohn (J DBusMessage *base_service_message; 42017628b541258d906e27e2000a402ed2d02383479cJohn (J const char *base_service; 42027628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_uint32_t serial; 42037628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_bool_t retval; 42047628b541258d906e27e2000a402ed2d02383479cJohn (J const char *existent = EXISTENT_SERVICE_NAME; 42057628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_uint32_t flags; 42067628b541258d906e27e2000a402ed2d02383479cJohn (J char **services; 42077628b541258d906e27e2000a402ed2d02383479cJohn (J int len; 42087628b541258d906e27e2000a402ed2d02383479cJohn (J 42097628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_verbose ("check_list_services for %p\n", connection); 42107628b541258d906e27e2000a402ed2d02383479cJohn (J 42117628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_get_services (context, connection, "ListActivatableNames", &services, &len)) 42127628b541258d906e27e2000a402ed2d02383479cJohn (J { 42137628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 42147628b541258d906e27e2000a402ed2d02383479cJohn (J } 42157628b541258d906e27e2000a402ed2d02383479cJohn (J 42167628b541258d906e27e2000a402ed2d02383479cJohn (J if (!_dbus_string_array_contains ((const char **)services, existent)) 42177628b541258d906e27e2000a402ed2d02383479cJohn (J { 42187628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not get the expected %s from ListActivatableNames\n", existent); 42197a4b9293f3cd9bbf7d648f2a6cc0d61b4278bac0Frank Osterfeld dbus_free_string_array (services); 42207628b541258d906e27e2000a402ed2d02383479cJohn (J return FALSE; 42217628b541258d906e27e2000a402ed2d02383479cJohn (J } 42227628b541258d906e27e2000a402ed2d02383479cJohn (J 42237628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_free_string_array (services); 42247628b541258d906e27e2000a402ed2d02383479cJohn (J 42257628b541258d906e27e2000a402ed2d02383479cJohn (J base_service_message = NULL; 42267628b541258d906e27e2000a402ed2d02383479cJohn (J 42277628b541258d906e27e2000a402ed2d02383479cJohn (J message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, 42287628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_PATH_DBUS, 42297628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_INTERFACE_DBUS, 42307628b541258d906e27e2000a402ed2d02383479cJohn (J "StartServiceByName"); 42317628b541258d906e27e2000a402ed2d02383479cJohn (J 42327628b541258d906e27e2000a402ed2d02383479cJohn (J if (message == NULL) 42337628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 42347628b541258d906e27e2000a402ed2d02383479cJohn (J 42357628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_set_auto_start (message, FALSE); 42367628b541258d906e27e2000a402ed2d02383479cJohn (J 42377628b541258d906e27e2000a402ed2d02383479cJohn (J flags = 0; 42387628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_message_append_args (message, 42397628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_TYPE_STRING, &existent, 42407628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_TYPE_UINT32, &flags, 42417628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_TYPE_INVALID)) 42427628b541258d906e27e2000a402ed2d02383479cJohn (J { 42437628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 42447628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 42457628b541258d906e27e2000a402ed2d02383479cJohn (J } 42467628b541258d906e27e2000a402ed2d02383479cJohn (J 42477628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_connection_send (connection, message, &serial)) 42487628b541258d906e27e2000a402ed2d02383479cJohn (J { 42497628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 42507628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 42517628b541258d906e27e2000a402ed2d02383479cJohn (J } 42527628b541258d906e27e2000a402ed2d02383479cJohn (J 42537628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 42547628b541258d906e27e2000a402ed2d02383479cJohn (J message = NULL; 42557628b541258d906e27e2000a402ed2d02383479cJohn (J 42567628b541258d906e27e2000a402ed2d02383479cJohn (J bus_test_run_everything (context); 42577628b541258d906e27e2000a402ed2d02383479cJohn (J 42587628b541258d906e27e2000a402ed2d02383479cJohn (J /* now wait for the message bus to hear back from the activated 42597628b541258d906e27e2000a402ed2d02383479cJohn (J * service. 42607628b541258d906e27e2000a402ed2d02383479cJohn (J */ 42617628b541258d906e27e2000a402ed2d02383479cJohn (J block_connection_until_message_from_bus (context, connection, "activated service to connect"); 42627628b541258d906e27e2000a402ed2d02383479cJohn (J 42637628b541258d906e27e2000a402ed2d02383479cJohn (J bus_test_run_everything (context); 42647628b541258d906e27e2000a402ed2d02383479cJohn (J 42657628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_connection_get_is_connected (connection)) 42667628b541258d906e27e2000a402ed2d02383479cJohn (J { 4267d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("connection was disconnected\n"); 42687628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 42697628b541258d906e27e2000a402ed2d02383479cJohn (J } 42707628b541258d906e27e2000a402ed2d02383479cJohn (J 42717628b541258d906e27e2000a402ed2d02383479cJohn (J retval = FALSE; 42727628b541258d906e27e2000a402ed2d02383479cJohn (J 42737628b541258d906e27e2000a402ed2d02383479cJohn (J message = pop_message_waiting_for_memory (connection); 42747628b541258d906e27e2000a402ed2d02383479cJohn (J if (message == NULL) 42757628b541258d906e27e2000a402ed2d02383479cJohn (J { 42767628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not receive any messages after %s %d on %p\n", 42777628b541258d906e27e2000a402ed2d02383479cJohn (J "StartServiceByName", serial, connection); 42787628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 42797628b541258d906e27e2000a402ed2d02383479cJohn (J } 42807628b541258d906e27e2000a402ed2d02383479cJohn (J 42817628b541258d906e27e2000a402ed2d02383479cJohn (J verbose_message_received (connection, message); 42827628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_verbose (" (after sending %s)\n", "StartServiceByName"); 42837628b541258d906e27e2000a402ed2d02383479cJohn (J 42847628b541258d906e27e2000a402ed2d02383479cJohn (J if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) 42857628b541258d906e27e2000a402ed2d02383479cJohn (J { 42867628b541258d906e27e2000a402ed2d02383479cJohn (J if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) 42877628b541258d906e27e2000a402ed2d02383479cJohn (J { 42887628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Message has wrong sender %s\n", 42897628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_get_sender (message) ? 42907628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_get_sender (message) : "(none)"); 42917628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 42927628b541258d906e27e2000a402ed2d02383479cJohn (J } 42937628b541258d906e27e2000a402ed2d02383479cJohn (J 42947628b541258d906e27e2000a402ed2d02383479cJohn (J if (dbus_message_is_error (message, 42957628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_ERROR_NO_MEMORY)) 42967628b541258d906e27e2000a402ed2d02383479cJohn (J { 42977628b541258d906e27e2000a402ed2d02383479cJohn (J ; /* good, this is a valid response */ 42987628b541258d906e27e2000a402ed2d02383479cJohn (J } 42997628b541258d906e27e2000a402ed2d02383479cJohn (J else if (dbus_message_is_error (message, 43007628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_ERROR_SPAWN_CHILD_EXITED) || 43017628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_is_error (message, 43027628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_ERROR_SPAWN_CHILD_SIGNALED) || 43037628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_is_error (message, 43047628b541258d906e27e2000a402ed2d02383479cJohn (J DBUS_ERROR_SPAWN_EXEC_FAILED)) 43057628b541258d906e27e2000a402ed2d02383479cJohn (J { 43067628b541258d906e27e2000a402ed2d02383479cJohn (J ; /* good, this is expected also */ 43077628b541258d906e27e2000a402ed2d02383479cJohn (J } 43087628b541258d906e27e2000a402ed2d02383479cJohn (J else 43097628b541258d906e27e2000a402ed2d02383479cJohn (J { 43107628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not expect error %s\n", 43117628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_get_error_name (message)); 43127628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43137628b541258d906e27e2000a402ed2d02383479cJohn (J } 43147628b541258d906e27e2000a402ed2d02383479cJohn (J } 43157628b541258d906e27e2000a402ed2d02383479cJohn (J else 43167628b541258d906e27e2000a402ed2d02383479cJohn (J { 43177628b541258d906e27e2000a402ed2d02383479cJohn (J GotServiceInfo message_kind; 43187628b541258d906e27e2000a402ed2d02383479cJohn (J 43197628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_base_service_activated (context, connection, 43207628b541258d906e27e2000a402ed2d02383479cJohn (J message, &base_service)) 43217628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43227628b541258d906e27e2000a402ed2d02383479cJohn (J 43237628b541258d906e27e2000a402ed2d02383479cJohn (J base_service_message = message; 43247628b541258d906e27e2000a402ed2d02383479cJohn (J message = NULL; 43257628b541258d906e27e2000a402ed2d02383479cJohn (J 43267628b541258d906e27e2000a402ed2d02383479cJohn (J /* We may need to block here for the test service to exit or finish up */ 43277628b541258d906e27e2000a402ed2d02383479cJohn (J block_connection_until_message_from_bus (context, connection, "test service to exit or finish up"); 43287628b541258d906e27e2000a402ed2d02383479cJohn (J 43297628b541258d906e27e2000a402ed2d02383479cJohn (J message = dbus_connection_borrow_message (connection); 43307628b541258d906e27e2000a402ed2d02383479cJohn (J if (message == NULL) 43317628b541258d906e27e2000a402ed2d02383479cJohn (J { 43327628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not receive any messages after base service creation notification\n"); 43337628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43347628b541258d906e27e2000a402ed2d02383479cJohn (J } 43357628b541258d906e27e2000a402ed2d02383479cJohn (J 43367628b541258d906e27e2000a402ed2d02383479cJohn (J message_kind = check_got_service_info (message); 43377628b541258d906e27e2000a402ed2d02383479cJohn (J 43387628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_connection_return_message (connection, message); 43397628b541258d906e27e2000a402ed2d02383479cJohn (J message = NULL; 43407628b541258d906e27e2000a402ed2d02383479cJohn (J 43417628b541258d906e27e2000a402ed2d02383479cJohn (J switch (message_kind) 43427628b541258d906e27e2000a402ed2d02383479cJohn (J { 43437628b541258d906e27e2000a402ed2d02383479cJohn (J case GOT_SOMETHING_ELSE: 43447628b541258d906e27e2000a402ed2d02383479cJohn (J case GOT_ERROR: 43457628b541258d906e27e2000a402ed2d02383479cJohn (J case GOT_SERVICE_DELETED: 43467628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Unexpected message after ActivateService " 4347cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen "(should be an error or a service announcement)\n"); 43487628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43497628b541258d906e27e2000a402ed2d02383479cJohn (J 43507628b541258d906e27e2000a402ed2d02383479cJohn (J case GOT_SERVICE_CREATED: 43517628b541258d906e27e2000a402ed2d02383479cJohn (J message = pop_message_waiting_for_memory (connection); 43527628b541258d906e27e2000a402ed2d02383479cJohn (J if (message == NULL) 43537628b541258d906e27e2000a402ed2d02383479cJohn (J { 43547628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Failed to pop message we just put back! " 43557628b541258d906e27e2000a402ed2d02383479cJohn (J "should have been a NameOwnerChanged (creation)\n"); 43567628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43577628b541258d906e27e2000a402ed2d02383479cJohn (J } 4358b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 43597628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME, 43607628b541258d906e27e2000a402ed2d02383479cJohn (J base_service, message)) 43617628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43627628b541258d906e27e2000a402ed2d02383479cJohn (J 43637628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 43647628b541258d906e27e2000a402ed2d02383479cJohn (J message = NULL; 43657628b541258d906e27e2000a402ed2d02383479cJohn (J 43667628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_no_leftovers (context)) 43677628b541258d906e27e2000a402ed2d02383479cJohn (J { 43687628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Messages were left over after successful activation\n"); 43697628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43707628b541258d906e27e2000a402ed2d02383479cJohn (J } 43717628b541258d906e27e2000a402ed2d02383479cJohn (J 43727628b541258d906e27e2000a402ed2d02383479cJohn (J break; 43737628b541258d906e27e2000a402ed2d02383479cJohn (J } 43747628b541258d906e27e2000a402ed2d02383479cJohn (J } 4375b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 43767628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_get_services (context, connection, "ListNames", &services, &len)) 43777628b541258d906e27e2000a402ed2d02383479cJohn (J { 43787628b541258d906e27e2000a402ed2d02383479cJohn (J return TRUE; 43797628b541258d906e27e2000a402ed2d02383479cJohn (J } 43807628b541258d906e27e2000a402ed2d02383479cJohn (J 43817628b541258d906e27e2000a402ed2d02383479cJohn (J if (!_dbus_string_array_contains ((const char **)services, existent)) 43827628b541258d906e27e2000a402ed2d02383479cJohn (J { 43837628b541258d906e27e2000a402ed2d02383479cJohn (J _dbus_warn ("Did not get the expected %s from ListNames\n", existent); 43847628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43857628b541258d906e27e2000a402ed2d02383479cJohn (J } 43867628b541258d906e27e2000a402ed2d02383479cJohn (J 43877628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_free_string_array (services); 43887628b541258d906e27e2000a402ed2d02383479cJohn (J 43897628b541258d906e27e2000a402ed2d02383479cJohn (J if (!check_send_exit_to_service (context, connection, 43907628b541258d906e27e2000a402ed2d02383479cJohn (J EXISTENT_SERVICE_NAME, base_service)) 43917628b541258d906e27e2000a402ed2d02383479cJohn (J goto out; 43927628b541258d906e27e2000a402ed2d02383479cJohn (J 43937628b541258d906e27e2000a402ed2d02383479cJohn (J retval = TRUE; 43947628b541258d906e27e2000a402ed2d02383479cJohn (J 43957628b541258d906e27e2000a402ed2d02383479cJohn (J out: 43967628b541258d906e27e2000a402ed2d02383479cJohn (J if (message) 43977628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (message); 43987628b541258d906e27e2000a402ed2d02383479cJohn (J 43997628b541258d906e27e2000a402ed2d02383479cJohn (J if (base_service_message) 44007628b541258d906e27e2000a402ed2d02383479cJohn (J dbus_message_unref (base_service_message); 44017628b541258d906e27e2000a402ed2d02383479cJohn (J 44027628b541258d906e27e2000a402ed2d02383479cJohn (J return retval; 44037628b541258d906e27e2000a402ed2d02383479cJohn (J} 44047628b541258d906e27e2000a402ed2d02383479cJohn (J 4405e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtontypedef struct 4406e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{ 4407e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington Check2Func func; 4408e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington BusContext *context; 4409e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington DBusConnection *connection; 4410e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington} Check2Data; 4411e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4412e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtonstatic dbus_bool_t 4413e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtoncheck_oom_check2_func (void *data) 4414e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{ 4415e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington Check2Data *d = data; 4416e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4417e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (! (* d->func) (d->context, d->connection)) 4418e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return FALSE; 4419b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4420e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!check_no_leftovers (d->context)) 4421e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington { 4422cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen _dbus_warn ("Messages were left over, should be covered by test suite\n"); 4423e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return FALSE; 4424e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington } 4425e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4426e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington return TRUE; 4427e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington} 4428e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4429e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtonstatic void 4430e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtoncheck2_try_iterations (BusContext *context, 4431e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington DBusConnection *connection, 4432e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington const char *description, 4433e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington Check2Func func) 4434e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{ 4435e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington Check2Data d; 4436e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4437e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington d.func = func; 4438e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington d.context = context; 4439e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington d.connection = connection; 4440b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4441e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington if (!_dbus_test_oom_handling (description, check_oom_check2_func, 4442e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington &d)) 4443fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu { 4444fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu _dbus_warn ("%s failed during oom\n", description); 4445fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu _dbus_assert_not_reached ("test failed"); 4446fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu } 4447e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington} 4448e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4449c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t 445079d3004e26f490ef37ae0298495ea66f322ce374Havoc Penningtonsetenv_TEST_LAUNCH_HELPER_CONFIG(const DBusString *test_data_dir, 445179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington const char *filename) 445279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington{ 445379d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington DBusString full; 445479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington DBusString file; 445579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 445679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington if (!_dbus_string_init (&full)) 445779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington return FALSE; 445879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 445979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington if (!_dbus_string_copy (test_data_dir, 0, &full, 0)) 446079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington { 446179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_string_free (&full); 446279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington return FALSE; 4463b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering } 446479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 446579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_string_init_const (&file, filename); 4466b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 446779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington if (!_dbus_concat_dir_and_file (&full, &file)) 446879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington { 446979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_string_free (&full); 447079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington return FALSE; 447179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington } 447279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 4473b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering _dbus_verbose ("Setting TEST_LAUNCH_HELPER_CONFIG to '%s'\n", 447479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_string_get_const_data (&full)); 4475b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 447679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_setenv ("TEST_LAUNCH_HELPER_CONFIG", _dbus_string_get_const_data (&full)); 447779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 447879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_string_free (&full); 447979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 448079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington return TRUE; 448179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington} 448279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 448379d3004e26f490ef37ae0298495ea66f322ce374Havoc Penningtonstatic dbus_bool_t 4484c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesbus_dispatch_test_conf (const DBusString *test_data_dir, 4485c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes const char *filename, 4486c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_bool_t use_launcher) 44873bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{ 44883bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington BusContext *context; 44893bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusConnection *foo; 44903bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusConnection *bar; 44913bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington DBusConnection *baz; 449229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington DBusError error; 4493fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4494c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* save the config name for the activation helper */ 449579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename)) 449679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG"); 4497c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4498fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington dbus_error_init (&error); 4499b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4500c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes context = bus_context_new_test (test_data_dir, filename); 450129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington if (context == NULL) 450229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return FALSE; 4503b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 450473b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker foo = dbus_connection_open_private (TEST_CONNECTION, &error); 45053bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (foo == NULL) 45063bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("could not alloc connection"); 45073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 4508ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_setup_debug_client (foo)) 4509ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("could not set up connection"); 4510ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4511dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington spin_connection_until_authenticated (context, foo); 4512b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4513ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!check_hello_message (context, foo)) 4514ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("hello message failed"); 4515a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 45161658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu if (!check_double_hello_message (context, foo)) 45171658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu _dbus_assert_not_reached ("double hello message failed"); 45181658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu 4519a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!check_add_match_all (context, foo)) 4520a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert_not_reached ("AddMatch message failed"); 4521b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 452273b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker bar = dbus_connection_open_private (TEST_CONNECTION, &error); 45233bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (bar == NULL) 45243bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("could not alloc connection"); 45253bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington 4526ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_setup_debug_client (bar)) 4527ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("could not set up connection"); 4528ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4529dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington spin_connection_until_authenticated (context, bar); 4530b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4531ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!check_hello_message (context, bar)) 4532ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington _dbus_assert_not_reached ("hello message failed"); 4533a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 4534a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!check_add_match_all (context, bar)) 4535a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert_not_reached ("AddMatch message failed"); 4536b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 453773b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker baz = dbus_connection_open_private (TEST_CONNECTION, &error); 45383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington if (baz == NULL) 45393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington _dbus_assert_not_reached ("could not alloc connection"); 4540169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington 4541ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington if (!bus_setup_debug_client (baz)) 4542169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington _dbus_assert_not_reached ("could not set up connection"); 4543ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4544dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington spin_connection_until_authenticated (context, baz); 4545b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 45464c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington if (!check_hello_message (context, baz)) 45474c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington _dbus_assert_not_reached ("hello message failed"); 4548f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington 4549a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!check_add_match_all (context, baz)) 4550a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert_not_reached ("AddMatch message failed"); 4551c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 45523da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker#ifdef DBUS_WIN_FIXME 45533da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker _dbus_warn("TODO: testing of GetConnectionUnixUser message skipped for now\n"); 45543da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker _dbus_warn("TODO: testing of GetConnectionUnixProcessID message skipped for now\n"); 45553da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker#else 4556c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!check_get_connection_unix_user (context, baz)) 4557c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_assert_not_reached ("GetConnectionUnixUser message failed"); 4558c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen 4559c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen if (!check_get_connection_unix_process_id (context, baz)) 4560c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen _dbus_assert_not_reached ("GetConnectionUnixProcessID message failed"); 45613da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker#endif 45627628b541258d906e27e2000a402ed2d02383479cJohn (J 4563bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington if (!check_list_services (context, baz)) 4564bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington _dbus_assert_not_reached ("ListActivatableNames message failed"); 4565b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4566777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington if (!check_no_leftovers (context)) 4567777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington { 4568cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen _dbus_warn ("Messages were left over after setting up initial connections\n"); 4569777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington _dbus_assert_not_reached ("initial connection setup failed"); 4570777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington } 4571b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 45724219b08bfa318443419c7a3acde28f0b237b05feHavoc Pennington check1_try_iterations (context, "create_and_hello", 457378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington check_hello_connection); 4574b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4575f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington check2_try_iterations (context, foo, "nonexistent_service_no_auto_start", 4576f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington check_nonexistent_service_no_auto_start); 4577e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington 4578e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#ifdef DBUS_WIN_FIXME 4579e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker _dbus_warn("TODO: dispatch.c segfault_service_no_auto_start test\n"); 4580e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#else 4581bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington check2_try_iterations (context, foo, "segfault_service_no_auto_start", 4582bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington check_segfault_service_no_auto_start); 4583e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#endif 4584b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4585f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington check2_try_iterations (context, foo, "existent_service_no_auto_start", 4586f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington check_existent_service_no_auto_start); 4587b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4588f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington check2_try_iterations (context, foo, "nonexistent_service_auto_start", 4589075945f611290f2b9db9a4ed6cf5433f2fd85785John (J check_nonexistent_service_auto_start); 4590e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker 4591b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4592b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering#ifdef DBUS_WIN_FIXME 4593e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker _dbus_warn("TODO: dispatch.c segfault_service_auto_start test\n"); 4594e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#else 4595c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* only do the segfault test if we are not using the launcher */ 4596bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington check2_try_iterations (context, foo, "segfault_service_auto_start", 4597bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington check_segfault_service_auto_start); 4598e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#endif 4599075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 4600c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* only do the shell fail test if we are not using the launcher */ 460179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington check2_try_iterations (context, foo, "shell_fail_service_auto_start", 460279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington check_shell_fail_service_auto_start); 4603c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4604c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* specific to launcher */ 4605c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (use_launcher) 4606c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_launch_service_file_missing (context, foo)) 4607c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("did not get service file not found error"); 460893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 460993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#if 0 461093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult /* Note: need to resolve some issues with the testing code in order to run 461193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * this in oom (handle that we sometimes don't get replies back from the bus 461293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * when oom happens, without blocking the test). 461393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */ 4614f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington check2_try_iterations (context, foo, "existent_service_auto_auto_start", 4615075945f611290f2b9db9a4ed6cf5433f2fd85785John (J check_existent_service_auto_start); 461693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#endif 4617b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4618bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington if (!check_existent_service_auto_start (context, foo)) 4619bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington _dbus_assert_not_reached ("existent service auto start failed"); 462093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult 4621bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington if (!check_shell_service_success_auto_start (context, foo)) 4622bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington _dbus_assert_not_reached ("shell success service auto start failed"); 4623075945f611290f2b9db9a4ed6cf5433f2fd85785John (J 4624f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington _dbus_verbose ("Disconnecting foo, bar, and baz\n"); 4625ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4626f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington kill_client_connection_unchecked (foo); 4627f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington kill_client_connection_unchecked (bar); 4628f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington kill_client_connection_unchecked (baz); 4629ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington 4630ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington bus_context_unref (context); 4631b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 46323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington return TRUE; 46333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington} 4634fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4635c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t 4636c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesbus_dispatch_test_conf_fail (const DBusString *test_data_dir, 4637c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes const char *filename) 4638c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{ 4639c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes BusContext *context; 4640c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusConnection *foo; 4641c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes DBusError error; 4642c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4643c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* save the config name for the activation helper */ 464479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename)) 464579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG"); 4646b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4647c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes dbus_error_init (&error); 4648b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4649c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes context = bus_context_new_test (test_data_dir, filename); 4650c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (context == NULL) 4651c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return FALSE; 4652b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 465373b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker foo = dbus_connection_open_private (TEST_CONNECTION, &error); 4654c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (foo == NULL) 4655c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("could not alloc connection"); 4656c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4657c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!bus_setup_debug_client (foo)) 4658c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("could not set up connection"); 4659c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4660c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes spin_connection_until_authenticated (context, foo); 4661c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4662c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_hello_message (context, foo)) 4663c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("hello message failed"); 4664c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4665c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_double_hello_message (context, foo)) 4666c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("double hello message failed"); 4667c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4668c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_add_match_all (context, foo)) 4669c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("AddMatch message failed"); 4670c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4671c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* this only tests the activation.c user check */ 4672c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_launch_service_user_missing (context, foo)) 4673c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("user missing did not trigger error"); 4674c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4675c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* this only tests the desktop.c exec check */ 4676c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_launch_service_exec_missing (context, foo)) 4677c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("exec missing did not trigger error"); 4678c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4679c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* this only tests the desktop.c service check */ 4680c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!check_launch_service_service_missing (context, foo)) 4681c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_assert_not_reached ("service missing did not trigger error"); 4682c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4683c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose ("Disconnecting foo\n"); 4684c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4685c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes kill_client_connection_unchecked (foo); 4686c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4687c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes bus_context_unref (context); 4688b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4689c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 4690c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes} 4691c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4692c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesdbus_bool_t 4693c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesbus_dispatch_test (const DBusString *test_data_dir) 4694c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{ 4695c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* run normal activation tests */ 4696c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose ("Normal activation tests\n"); 4697c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!bus_dispatch_test_conf (test_data_dir, 4698c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "valid-config-files/debug-allow-all.conf", FALSE)) 4699c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return FALSE; 4700c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4701755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker#ifdef DBUS_WIN 4702755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker _dbus_warn("Info: Launch helper activation tests skipped because launch-helper is not supported yet\n"); 4703755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker#else 4704c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* run launch-helper activation tests */ 4705c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes _dbus_verbose ("Launch helper activation tests\n"); 4706c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!bus_dispatch_test_conf (test_data_dir, 4707c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "valid-config-files-system/debug-allow-all-pass.conf", TRUE)) 4708c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return FALSE; 4709c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4710c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes /* run select launch-helper activation tests on broken service files */ 4711c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes if (!bus_dispatch_test_conf_fail (test_data_dir, 4712c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes "valid-config-files-system/debug-allow-all-fail.conf")) 4713c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return FALSE; 4714755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker#endif 4715c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4716c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes return TRUE; 4717c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes} 4718c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes 4719fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Penningtondbus_bool_t 4720fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Penningtonbus_dispatch_sha1_test (const DBusString *test_data_dir) 4721fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington{ 4722fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington BusContext *context; 4723fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington DBusConnection *foo; 4724fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington DBusError error; 4725fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4726fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington dbus_error_init (&error); 4727b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4728fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington /* Test SHA1 authentication */ 4729fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington _dbus_verbose ("Testing SHA1 context\n"); 4730b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4731fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington context = bus_context_new_test (test_data_dir, 4732e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington "valid-config-files/debug-allow-all-sha1.conf"); 4733fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington if (context == NULL) 4734fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington return FALSE; 4735fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 473673b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker foo = dbus_connection_open_private (TEST_CONNECTION, &error); 4737fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington if (foo == NULL) 4738fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington _dbus_assert_not_reached ("could not alloc connection"); 4739fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4740fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington if (!bus_setup_debug_client (foo)) 4741fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington _dbus_assert_not_reached ("could not set up connection"); 4742fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4743dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington spin_connection_until_authenticated (context, foo); 4744b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4745fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington if (!check_hello_message (context, foo)) 4746fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington _dbus_assert_not_reached ("hello message failed"); 4747fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!check_add_match_all (context, foo)) 4749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington _dbus_assert_not_reached ("addmatch message failed"); 4750b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 4751fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington if (!check_no_leftovers (context)) 4752fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington { 4753d3fb6f35716ff1d6f6644dea2043d539007811deHavoc Pennington _dbus_warn ("Messages were left over after setting up initial SHA-1 connection\n"); 4754fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington _dbus_assert_not_reached ("initial connection setup failed"); 4755fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington } 4756b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering 47574219b08bfa318443419c7a3acde28f0b237b05feHavoc Pennington check1_try_iterations (context, "create_and_hello_sha1", 4758fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington check_hello_connection); 4759fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4760fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington kill_client_connection_unchecked (foo); 4761fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4762fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington bus_context_unref (context); 4763fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4764fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington return TRUE; 4765fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington} 4766fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington 4767004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#ifdef HAVE_UNIX_FD_PASSING 4768004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4769004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poetteringdbus_bool_t 4770004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poetteringbus_unix_fds_passing_test(const DBusString *test_data_dir) 4771004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering{ 4772004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering BusContext *context; 4773004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBusConnection *foo, *bar; 4774004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBusError error; 4775004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBusMessage *m; 4776004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering dbus_bool_t b; 4777004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering int one[2], two[2], x, y, z; 4778004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering char r; 4779004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4780004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering dbus_error_init (&error); 4781004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4782004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering context = bus_context_new_test (test_data_dir, "valid-config-files/debug-allow-all.conf"); 4783004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (context == NULL) 4784004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("could not alloc context"); 4785004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 478673b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker foo = dbus_connection_open_private (TEST_CONNECTION, &error); 4787004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (foo == NULL) 4788004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("could not alloc connection"); 4789004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4790004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!bus_setup_debug_client (foo)) 4791004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("could not set up connection"); 4792004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4793004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering spin_connection_until_authenticated (context, foo); 4794004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4795004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!check_hello_message (context, foo)) 4796004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("hello message failed"); 4797004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4798004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!check_add_match_all (context, foo)) 4799004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("AddMatch message failed"); 4800004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 480173b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker bar = dbus_connection_open_private (TEST_CONNECTION, &error); 4802004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (bar == NULL) 4803004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("could not alloc connection"); 4804004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4805004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!bus_setup_debug_client (bar)) 4806004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("could not set up connection"); 4807004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4808004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering spin_connection_until_authenticated (context, bar); 4809004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4810004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!check_hello_message (context, bar)) 4811004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("hello message failed"); 4812004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4813004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!check_add_match_all (context, bar)) 4814004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("AddMatch message failed"); 4815004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4816004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!(m = dbus_message_new_signal("/", "a.b.c", "d"))) 4817004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached ("could not alloc message"); 4818004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4819004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!(_dbus_full_duplex_pipe(one, one+1, TRUE, &error))) 4820004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to allocate pipe #1"); 4821004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4822004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!(_dbus_full_duplex_pipe(two, two+1, TRUE, &error))) 4823004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to allocate pipe #2"); 4824004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4825004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!dbus_message_append_args(m, 4826004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_UNIX_FD, one, 4827004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_UNIX_FD, two, 4828004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_UNIX_FD, two, 4829004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_INVALID)) 4830004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to attach fds."); 4831004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4832004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(one[0], &error)) 4833004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #1 "); 4834004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(two[0], &error)) 4835004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #2 "); 4836004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4837c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering if (!(dbus_connection_can_send_type(foo, DBUS_TYPE_UNIX_FD))) 4838c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering _dbus_assert_not_reached("Connection cannot do fd passing"); 4839c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering 4840c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering if (!(dbus_connection_can_send_type(bar, DBUS_TYPE_UNIX_FD))) 4841c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering _dbus_assert_not_reached("Connection cannot do fd passing"); 4842004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4843004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!dbus_connection_send (foo, m, NULL)) 4844004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to send fds"); 4845004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4846004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering dbus_message_unref(m); 4847004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4848004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering bus_test_run_clients_loop (SEND_PENDING (foo)); 4849004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4850004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering bus_test_run_everything (context); 4851004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4852004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering block_connection_until_message_from_bus (context, foo, "unix fd reception on foo"); 4853004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4854004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!(m = pop_message_waiting_for_memory (foo))) 4855004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to receive msg"); 4856004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4857004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!dbus_message_is_signal(m, "a.b.c", "d")) 4858004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("bogus message received"); 4859004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4860004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering dbus_message_unref(m); 4861004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4862004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering block_connection_until_message_from_bus (context, bar, "unix fd reception on bar"); 4863004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4864004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!(m = pop_message_waiting_for_memory (bar))) 4865004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to receive msg"); 4866004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4867004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!dbus_message_is_signal(m, "a.b.c", "d")) 4868004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("bogus message received"); 4869004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4870004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!dbus_message_get_args(m, 4871004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering &error, 4872004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_UNIX_FD, &x, 4873004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_UNIX_FD, &y, 4874004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_UNIX_FD, &z, 4875004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering DBUS_TYPE_INVALID)) 4876004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to parse fds."); 4877004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4878004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering dbus_message_unref(m); 4879004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4880004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (write(x, "X", 1) != 1) 4881004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to write to pipe #1"); 4882004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (write(y, "Y", 1) != 1) 4883004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to write to pipe #2"); 4884004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (write(z, "Z", 1) != 1) 4885004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to write to pipe #2/2nd fd"); 4886004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4887004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(x, &error)) 4888004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #1/other side "); 4889004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(y, &error)) 4890004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #2/other side "); 4891004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(z, &error)) 4892004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #2/other size 2nd fd "); 4893004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4894004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (read(one[1], &r, 1) != 1 || r != 'X') 4895004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to read value from pipe."); 4896004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (read(two[1], &r, 1) != 1 || r != 'Y') 4897004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to read value from pipe."); 4898004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (read(two[1], &r, 1) != 1 || r != 'Z') 4899004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to read value from pipe."); 4900004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4901004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(one[1], &error)) 4902004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #1 "); 4903004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering if (!_dbus_close(two[1], &error)) 4904004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_assert_not_reached("Failed to close pipe #2 "); 4905004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4906004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_verbose ("Disconnecting foo\n"); 4907004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering kill_client_connection_unchecked (foo); 4908004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4909004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering _dbus_verbose ("Disconnecting bar\n"); 4910004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering kill_client_connection_unchecked (bar); 4911004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4912004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering bus_context_unref (context); 4913004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 4914004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering return TRUE; 4915004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering} 4916004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#endif 4917004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering 49183bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 4919