X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bus%2Fdispatch.c;h=c540e6ce5f9050daf7afc574507d82ed99dbc1d5;hb=1200c464b6c9051340960e07f0d61a51dad71286;hp=ae6971de299ed848021e5200cb5a439929e812f1;hpb=dc33f4f7749ed303374ebdf00e48ea8a471afd25;p=platform%2Fupstream%2Fdbus.git diff --git a/bus/dispatch.c b/bus/dispatch.c index ae6971d..c540e6c 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -6,7 +6,7 @@ * Copyright (C) 2004 Imendio HB * * Licensed under the Academic Free License version 2.1 - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -16,13 +16,14 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ +#include #include "dispatch.h" #include "connection.h" #include "driver.h" @@ -33,7 +34,19 @@ #include "signals.h" #include "test.h" #include +#include #include +#include "kdbus-d.h" + +#ifdef HAVE_UNIX_FD_PASSING +#include +#include +#endif + +/* This is hard-coded in the files in valid-config-files-*. We have to use + * the debug-pipe transport because the tests in this file require that + * dbus_connection_open_private() does not block. */ +#define TEST_DEBUG_PIPE "debug-pipe:name=test-server" static dbus_bool_t send_one_message (DBusConnection *connection, @@ -51,7 +64,11 @@ send_one_message (DBusConnection *connection, message, NULL)) return TRUE; /* silently don't send it */ - + + if (dbus_message_contains_unix_fds(message) && + !dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD)) + return TRUE; /* silently don't send it */ + if (!bus_transaction_send (transaction, connection, message)) @@ -86,10 +103,39 @@ bus_dispatch_matches (BusTransaction *transaction, _dbus_assert (sender == NULL || bus_connection_is_active (sender)); _dbus_assert (dbus_message_get_sender (message) != NULL); + context = bus_transaction_get_context (transaction); + + /* First, send the message to the addressed_recipient, if there is one. */ + if (addressed_recipient != NULL) + { + if (!bus_context_check_security_policy (context, transaction, + sender, addressed_recipient, + addressed_recipient, + message, error)) + return FALSE; + + if (dbus_message_contains_unix_fds (message) && + !dbus_connection_can_send_type (addressed_recipient, + DBUS_TYPE_UNIX_FD)) + { + dbus_set_error (error, + DBUS_ERROR_NOT_SUPPORTED, + "Tried to send message with Unix file descriptors" + "to a client that doesn't support that."); + return FALSE; + } + + /* Dispatch the message */ + if (!bus_transaction_send (transaction, addressed_recipient, message)) + { + BUS_SET_OOM (error); + return FALSE; + } + } + + /* Now dispatch to others who look interested in this message */ connections = bus_transaction_get_connections (transaction); - dbus_error_init (&tmp_error); - context = bus_transaction_get_context (transaction); matchmaker = bus_context_get_matchmaker (context); recipients = NULL; @@ -116,7 +162,7 @@ bus_dispatch_matches (BusTransaction *transaction, } _dbus_list_clear (&recipients); - + if (dbus_error_is_set (&tmp_error)) { dbus_move_error (&tmp_error, error); @@ -136,25 +182,25 @@ bus_dispatch (DBusConnection *connection, BusContext *context; DBusHandlerResult result; DBusConnection *addressed_recipient; - + result = DBUS_HANDLER_RESULT_HANDLED; - + transaction = NULL; addressed_recipient = NULL; dbus_error_init (&error); - + context = bus_connection_get_context (connection); _dbus_assert (context != NULL); - + /* If we can't even allocate an OOM error, we just go to sleep * until we can. */ while (!bus_connection_preallocate_oom_error (connection)) _dbus_wait_for_memory (); - + /* Ref connection in case we disconnect it at some point in here */ dbus_connection_ref (connection); - + service_name = dbus_message_get_destination (message); #ifdef DBUS_ENABLE_VERBOSE_MODE @@ -164,7 +210,7 @@ bus_dispatch (DBusConnection *connection, interface_name = dbus_message_get_interface (message); member_name = dbus_message_get_member (message); error_name = dbus_message_get_error_name (message); - + _dbus_verbose ("DISPATCH: %s %s %s to %s\n", interface_name ? interface_name : "(no interface)", member_name ? member_name : "(no member)", @@ -172,7 +218,15 @@ bus_dispatch (DBusConnection *connection, service_name ? service_name : "peer"); } #endif /* DBUS_ENABLE_VERBOSE_MODE */ - + + /* Create our transaction */ + transaction = bus_transaction_new (context); + if (transaction == NULL) + { + BUS_SET_OOM (&error); + goto out; + } + /* If service_name is NULL, if it's a signal we send it to all * connections with a match rule. If it's not a signal, there * are some special cases here but mostly we just bail out. @@ -195,18 +249,20 @@ bus_dispatch (DBusConnection *connection, result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; goto out; } + + if(bus_context_is_kdbus(context)) + { + if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) + { + handleNameOwnerChanged(message, transaction, connection); + goto out; + } + } } - - /* Create our transaction */ - transaction = bus_transaction_new (context); - if (transaction == NULL) - { - BUS_SET_OOM (&error); - goto out; - } - + /* Assign a sender to the message */ - if (bus_connection_is_active (connection)) + if(bus_context_is_kdbus(context) == FALSE) //if using kdbus, sender must be set on library side + if (bus_connection_is_active (connection)) { sender = bus_connection_get_name (connection); _dbus_assert (sender != NULL); @@ -224,7 +280,7 @@ bus_dispatch (DBusConnection *connection, */ service_name = dbus_message_get_destination (message); } - + if (service_name && strcmp (service_name, DBUS_SERVICE_DBUS) == 0) /* to bus driver */ { @@ -252,9 +308,9 @@ bus_dispatch (DBusConnection *connection, BusRegistry *registry; _dbus_assert (service_name != NULL); - + registry = bus_connection_get_registry (connection); - + _dbus_string_init_const (&service_string, service_name); service = bus_registry_lookup (registry, &service_string); @@ -274,7 +330,7 @@ bus_dispatch (DBusConnection *connection, _dbus_verbose ("bus_activation_activate_service() failed: %s\n", error.name); goto out; } - + goto out; } else if (service == NULL) @@ -289,28 +345,16 @@ bus_dispatch (DBusConnection *connection, { addressed_recipient = bus_service_get_primary_owners_connection (service); _dbus_assert (addressed_recipient != NULL); - - if (!bus_context_check_security_policy (context, transaction, - connection, addressed_recipient, - addressed_recipient, - message, &error)) - goto out; - - /* Dispatch the message */ - if (!bus_transaction_send (transaction, addressed_recipient, message)) - { - BUS_SET_OOM (&error); - goto out; - } } } - /* Now match the messages against any match rules, which will send - * out signals and such. addressed_recipient may == NULL. + /* Now send the message to its destination (or not, if + * addressed_recipient == NULL), and match it against other connections' + * match rules. */ if (!bus_dispatch_matches (transaction, connection, addressed_recipient, message, &error)) goto out; - + out: if (dbus_error_is_set (&error)) { @@ -342,7 +386,7 @@ bus_dispatch (DBusConnection *connection, &error, message)) { bus_connection_send_oom_error (connection, message); - + /* cancel transaction due to OOM */ if (transaction != NULL) { @@ -351,8 +395,8 @@ bus_dispatch (DBusConnection *connection, } } } - - + + dbus_error_free (&error); } @@ -376,12 +420,12 @@ bus_dispatch_message_filter (DBusConnection *connection, dbus_bool_t bus_dispatch_add_connection (DBusConnection *connection) -{ +{ if (!dbus_connection_add_filter (connection, bus_dispatch_message_filter, NULL, NULL)) return FALSE; - + return TRUE; } @@ -396,7 +440,7 @@ bus_dispatch_remove_connection (DBusConnection *connection) NULL); } -#ifdef DBUS_BUILD_TESTS +#ifdef DBUS_ENABLE_EMBEDDED_TESTS #include @@ -418,7 +462,7 @@ block_connection_until_message_from_bus (BusContext *context, const char *what_is_expected) { _dbus_verbose ("expecting: %s\n", what_is_expected); - + while (dbus_connection_get_dispatch_status (connection) == DBUS_DISPATCH_COMPLETE && dbus_connection_get_is_connected (connection)) @@ -527,13 +571,13 @@ check_service_owner_changed_foreach (DBusConnection *connection, DBusError error; const char *service_name, *old_owner, *new_owner; - if (d->expected_kind == SERVICE_CREATED + if (d->expected_kind == SERVICE_CREATED && connection == d->skip_connection) return TRUE; dbus_error_init (&error); d->failed = TRUE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -567,7 +611,7 @@ check_service_owner_changed_foreach (DBusConnection *connection, if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) { dbus_error_free (&error); - _dbus_wait_for_memory (); + _dbus_wait_for_memory (); goto reget_service_info_data; } else @@ -593,7 +637,7 @@ check_service_owner_changed_foreach (DBusConnection *connection, goto out; } - if (*service_name == ':' && new_owner[0] + if (*service_name == ':' && new_owner[0] && strcmp (service_name, new_owner) != 0) { _dbus_warn ("inconsistent ServiceOwnedChanged message (\"%s\" [ %s -> %s ])\n", @@ -603,10 +647,10 @@ check_service_owner_changed_foreach (DBusConnection *connection, } d->failed = FALSE; - + out: dbus_error_free (&error); - + if (message) dbus_message_unref (message); @@ -623,7 +667,7 @@ kill_client_connection (BusContext *context, CheckServiceOwnerChangedData socd; _dbus_verbose ("killing connection %p\n", connection); - + s = dbus_bus_get_unique_name (connection); _dbus_assert (s != NULL); @@ -631,36 +675,36 @@ kill_client_connection (BusContext *context, _dbus_wait_for_memory (); dbus_connection_ref (connection); - + /* kick in the disconnect handler that unrefs the connection */ dbus_connection_close (connection); bus_test_run_everything (context); - + _dbus_assert (bus_test_client_listed (connection)); - + /* Run disconnect handler in test.c */ if (bus_connection_dispatch_one_message (connection)) _dbus_assert_not_reached ("something received on connection being killed other than the disconnect"); - + _dbus_assert (!dbus_connection_get_is_connected (connection)); dbus_connection_unref (connection); connection = NULL; _dbus_assert (!bus_test_client_listed (connection)); - + socd.expected_kind = SERVICE_DELETED; socd.expected_service_name = base_service; socd.failed = FALSE; socd.skip_connection = NULL; - + bus_test_clients_foreach (check_service_owner_changed_foreach, &socd); dbus_free (base_service); - + if (socd.failed) _dbus_assert_not_reached ("didn't get the expected NameOwnerChanged (deletion) messages"); - + if (!check_no_leftovers (context)) _dbus_assert_not_reached ("stuff left in message queues after disconnecting a client"); } @@ -670,7 +714,7 @@ kill_client_connection_unchecked (DBusConnection *connection) { /* This kills the connection without expecting it to affect * the rest of the bus. - */ + */ _dbus_verbose ("Unchecked kill of connection %p\n", connection); dbus_connection_ref (connection); @@ -716,11 +760,10 @@ check_no_leftovers (BusContext *context) nmd.failed = FALSE; bus_test_clients_foreach (check_no_messages_foreach, &nmd); - + if (nmd.failed) { - _dbus_verbose ("%s: leftover message found\n", - _DBUS_FUNCTION_NAME); + _dbus_verbose ("leftover message found\n"); return FALSE; } else @@ -750,7 +793,7 @@ check_hello_message (BusContext *context, name_message = NULL; _dbus_verbose ("check_hello_message for %p\n", connection); - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -760,7 +803,7 @@ check_hello_message (BusContext *context, return TRUE; dbus_connection_ref (connection); /* because we may get disconnected */ - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -769,44 +812,44 @@ check_hello_message (BusContext *context, } _dbus_assert (dbus_message_has_signature (message, "")); - + dbus_message_unref (message); message = NULL; if (!dbus_connection_get_is_connected (connection)) { _dbus_verbose ("connection was disconnected (presumably auth failed)\n"); - + dbus_connection_unref (connection); - + return TRUE; } - + /* send our message */ bus_test_run_clients_loop (SEND_PENDING (connection)); if (!dbus_connection_get_is_connected (connection)) { _dbus_verbose ("connection was disconnected (presumably auth failed)\n"); - + dbus_connection_unref (connection); - + return TRUE; } - + block_connection_until_message_from_bus (context, connection, "reply to Hello"); if (!dbus_connection_get_is_connected (connection)) { _dbus_verbose ("connection was disconnected (presumably auth failed)\n"); - + dbus_connection_unref (connection); - + return TRUE; } dbus_connection_unref (connection); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -824,7 +867,7 @@ check_hello_message (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) { if (dbus_message_is_error (message, @@ -842,7 +885,7 @@ check_hello_message (BusContext *context, else { CheckServiceOwnerChangedData socd; - + if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) { ; /* good, expected */ @@ -878,14 +921,14 @@ check_hello_message (BusContext *context, while (!dbus_bus_set_unique_name (connection, name)) _dbus_wait_for_memory (); - + socd.expected_kind = SERVICE_CREATED; socd.expected_service_name = name; socd.failed = FALSE; socd.skip_connection = connection; /* we haven't done AddMatch so won't get it ourselves */ bus_test_clients_foreach (check_service_owner_changed_foreach, &socd); - + if (socd.failed) goto out; @@ -906,7 +949,7 @@ check_hello_message (BusContext *context, "NameAcquired"); goto out; } - + retry_get_acquired_name: if (!dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &acquired, @@ -940,20 +983,20 @@ check_hello_message (BusContext *context, if (!check_no_leftovers (context)) goto out; - + retval = TRUE; - + out: - _dbus_verbose ("ending %s retval = %d\n", _DBUS_FUNCTION_NAME, retval); - + _dbus_verbose ("ending - retval = %d\n", retval); + dbus_error_free (&error); - + if (message) dbus_message_unref (message); if (name_message) dbus_message_unref (name_message); - + return retval; } @@ -974,7 +1017,7 @@ check_double_hello_message (BusContext *context, message = NULL; _dbus_verbose ("check_double_hello_message for %p\n", connection); - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -982,7 +1025,7 @@ check_double_hello_message (BusContext *context, if (message == NULL) return TRUE; - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -1000,15 +1043,15 @@ check_double_hello_message (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); - + _dbus_verbose ("connection was disconnected\n"); + dbus_connection_unref (connection); - + return TRUE; } dbus_connection_unref (connection); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -1026,7 +1069,7 @@ check_double_hello_message (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) { warn_unexpected (connection, message, "method return for Hello"); @@ -1035,15 +1078,15 @@ check_double_hello_message (BusContext *context, if (!check_no_leftovers (context)) goto out; - + retval = TRUE; - + out: dbus_error_free (&error); - + if (message) dbus_message_unref (message); - + return retval; } @@ -1066,7 +1109,7 @@ check_get_connection_unix_user (BusContext *context, message = NULL; _dbus_verbose ("check_get_connection_unix_user for %p\n", connection); - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -1077,7 +1120,7 @@ check_get_connection_unix_user (BusContext *context, base_service_name = dbus_bus_get_unique_name (connection); - if (!dbus_message_append_args (message, + if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &base_service_name, DBUS_TYPE_INVALID)) { @@ -1102,10 +1145,10 @@ check_get_connection_unix_user (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); - + _dbus_verbose ("connection was disconnected\n"); + dbus_connection_unref (connection); - + return TRUE; } @@ -1177,10 +1220,10 @@ check_get_connection_unix_user (BusContext *context, out: dbus_error_free (&error); - + if (message) dbus_message_unref (message); - + return retval; } @@ -1203,7 +1246,7 @@ check_get_connection_unix_process_id (BusContext *context, message = NULL; _dbus_verbose ("check_get_connection_unix_process_id for %p\n", connection); - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -1214,7 +1257,7 @@ check_get_connection_unix_process_id (BusContext *context, base_service_name = dbus_bus_get_unique_name (connection); - if (!dbus_message_append_args (message, + if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &base_service_name, DBUS_TYPE_INVALID)) { @@ -1239,10 +1282,10 @@ check_get_connection_unix_process_id (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); - + _dbus_verbose ("connection was disconnected\n"); + dbus_connection_unref (connection); - + return TRUE; } @@ -1272,11 +1315,11 @@ check_get_connection_unix_process_id (BusContext *context, */ _dbus_verbose ("Windows correctly does not support GetConnectionUnixProcessID\n"); } -#endif +#endif else { warn_unexpected (connection, message, "not this error"); - + goto out; } } @@ -1285,7 +1328,7 @@ check_get_connection_unix_process_id (BusContext *context, #ifdef DBUS_WIN warn_unexpected (connection, message, "GetConnectionUnixProcessID to fail on Windows"); goto out; -#else +#else if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) { ; /* good, expected */ @@ -1344,10 +1387,10 @@ check_get_connection_unix_process_id (BusContext *context, out: dbus_error_free (&error); - + if (message) dbus_message_unref (message); - + return retval; } @@ -1369,7 +1412,7 @@ check_add_match_all (BusContext *context, message = NULL; _dbus_verbose ("check_add_match_all for %p\n", connection); - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -1385,7 +1428,7 @@ check_add_match_all (BusContext *context, dbus_message_unref (message); return TRUE; } - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -1396,32 +1439,32 @@ check_add_match_all (BusContext *context, message = NULL; dbus_connection_ref (connection); /* because we may get disconnected */ - + /* send our message */ bus_test_run_clients_loop (SEND_PENDING (connection)); if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); - + _dbus_verbose ("connection was disconnected\n"); + dbus_connection_unref (connection); - + return TRUE; } - + block_connection_until_message_from_bus (context, connection, "reply to AddMatch"); if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); - + _dbus_verbose ("connection was disconnected\n"); + dbus_connection_unref (connection); - + return TRUE; } dbus_connection_unref (connection); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -1439,7 +1482,7 @@ check_add_match_all (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) { if (dbus_message_is_error (message, @@ -1471,15 +1514,15 @@ check_add_match_all (BusContext *context, if (!check_no_leftovers (context)) goto out; - + retval = TRUE; - + out: dbus_error_free (&error); - + if (message) dbus_message_unref (message); - + return retval; } @@ -1494,7 +1537,7 @@ check_hello_connection (BusContext *context) dbus_error_init (&error); - connection = dbus_connection_open_private ("debug-pipe:name=test-server", &error); + connection = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); if (connection == NULL) { _DBUS_ASSERT_ERROR_IS_SET (&error); @@ -1510,10 +1553,10 @@ check_hello_connection (BusContext *context) } spin_connection_until_authenticated (context, connection); - + if (!check_hello_message (context, connection)) return FALSE; - + if (dbus_bus_get_unique_name (connection) == NULL) { /* We didn't successfully register, so we can't @@ -1525,7 +1568,7 @@ check_hello_connection (BusContext *context) { if (!check_add_match_all (context, connection)) return FALSE; - + kill_client_connection (context, connection); } @@ -1546,17 +1589,17 @@ check_nonexistent_service_no_auto_start (BusContext *context, dbus_bool_t retval; const char *nonexistent = NONEXISTENT_SERVICE_NAME; dbus_uint32_t flags; - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "StartServiceByName"); - + if (message == NULL) return TRUE; dbus_message_set_auto_start (message, FALSE); - + flags = 0; if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &nonexistent, @@ -1566,7 +1609,7 @@ check_nonexistent_service_no_auto_start (BusContext *context, dbus_message_unref (message); return TRUE; } - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -1582,12 +1625,12 @@ check_nonexistent_service_no_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -1607,7 +1650,7 @@ check_nonexistent_service_no_auto_start (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -1632,11 +1675,11 @@ check_nonexistent_service_no_auto_start (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -1650,15 +1693,15 @@ check_nonexistent_service_auto_start (BusContext *context, DBusMessage *message; dbus_uint32_t serial; dbus_bool_t retval; - + message = dbus_message_new_method_call (NONEXISTENT_SERVICE_NAME, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Echo"); - + if (message == NULL) return TRUE; - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -1674,12 +1717,12 @@ check_nonexistent_service_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) @@ -1700,7 +1743,7 @@ check_nonexistent_service_auto_start (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -1725,11 +1768,11 @@ check_nonexistent_service_auto_start (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -1743,16 +1786,16 @@ check_base_service_activated (BusContext *context, dbus_bool_t retval; DBusError error; const char *base_service, *base_service_from_bus, *old_owner; - + retval = FALSE; - + dbus_error_init (&error); base_service = NULL; old_owner = NULL; base_service_from_bus = NULL; message = initial_message; - dbus_message_ref (message); + dbus_message_ref (message); if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, @@ -1792,7 +1835,7 @@ check_base_service_activated (BusContext *context, base_service); goto out; } - + if (strcmp (base_service, base_service_from_bus) != 0) { _dbus_warn ("Expected base service activation, got \"%s\" instead with owner \"%s\"\n", @@ -1806,14 +1849,14 @@ check_base_service_activated (BusContext *context, old_owner); goto out; } - + socd.expected_kind = SERVICE_CREATED; socd.expected_service_name = base_service; socd.failed = FALSE; socd.skip_connection = connection; bus_test_clients_foreach (check_service_owner_changed_foreach, &socd); - + if (socd.failed) goto out; } @@ -1828,7 +1871,7 @@ check_base_service_activated (BusContext *context, *base_service_p = base_service; retval = TRUE; - + out: if (message) dbus_message_unref (message); @@ -1848,9 +1891,9 @@ check_service_activated (BusContext *context, dbus_bool_t retval; DBusError error; dbus_uint32_t activation_result; - + retval = FALSE; - + dbus_error_init (&error); message = initial_message; @@ -1917,15 +1960,15 @@ check_service_activated (BusContext *context, socd.expected_service_name = service_name; bus_test_clients_foreach (check_service_owner_changed_foreach, &socd); - + if (socd.failed) goto out; - + dbus_message_unref (message); service_name = NULL; old_owner = NULL; base_service_from_bus = NULL; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -1937,10 +1980,10 @@ check_service_activated (BusContext *context, else { warn_unexpected (connection, message, "NameOwnerChanged for the activated name"); - + goto out; } - + if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN) { warn_unexpected (connection, message, "reply to StartServiceByName"); @@ -1978,7 +2021,7 @@ check_service_activated (BusContext *context, dbus_message_unref (message); message = NULL; - + if (!check_no_leftovers (context)) { _dbus_warn ("Messages were left over after verifying existent activation results\n"); @@ -1986,12 +2029,12 @@ check_service_activated (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); dbus_error_free (&error); - + return retval; } @@ -2005,9 +2048,9 @@ check_service_auto_activated (BusContext *context, DBusMessage *message; dbus_bool_t retval; DBusError error; - + retval = FALSE; - + dbus_error_init (&error); message = initial_message; @@ -2019,7 +2062,7 @@ check_service_auto_activated (BusContext *context, { const char *service_name; CheckServiceOwnerChangedData socd; - + reget_service_name_arg: if (!dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service_name, @@ -2040,28 +2083,28 @@ check_service_auto_activated (BusContext *context, goto out; } } - + if (strcmp (service_name, activated_name) != 0) { _dbus_warn ("Expected to see service %s created, saw %s instead\n", activated_name, service_name); goto out; } - + socd.expected_kind = SERVICE_CREATED; socd.expected_service_name = service_name; socd.failed = FALSE; - socd.skip_connection = connection; + socd.skip_connection = connection; bus_test_clients_foreach (check_service_owner_changed_foreach, &socd); - + if (socd.failed) goto out; - + /* Note that this differs from regular activation in that we don't get a * reply to ActivateService here. */ - + dbus_message_unref (message); message = NULL; service_name = NULL; @@ -2069,16 +2112,16 @@ check_service_auto_activated (BusContext *context, else { warn_unexpected (connection, message, "NameOwnerChanged for the activated name"); - + goto out; } - + retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -2092,7 +2135,7 @@ check_service_deactivated (BusContext *context, CheckServiceOwnerChangedData socd; retval = FALSE; - + /* Now we are expecting ServiceOwnerChanged (deletion) messages for the base * service and the activated_name. The base service * notification is required to come last. @@ -2102,11 +2145,11 @@ check_service_deactivated (BusContext *context, socd.failed = FALSE; socd.skip_connection = NULL; bus_test_clients_foreach (check_service_owner_changed_foreach, - &socd); + &socd); if (socd.failed) goto out; - + socd.expected_kind = SERVICE_DELETED; socd.expected_service_name = base_service; socd.failed = FALSE; @@ -2118,7 +2161,7 @@ check_service_deactivated (BusContext *context, goto out; retval = TRUE; - + out: return retval; } @@ -2133,27 +2176,27 @@ check_send_exit_to_service (BusContext *context, DBusMessage *message; dbus_uint32_t serial; dbus_bool_t retval; - + _dbus_verbose ("Sending exit message to the test service\n"); retval = FALSE; - + /* Kill off the test service by sending it a quit message */ message = dbus_message_new_method_call (service_name, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Exit"); - + if (message == NULL) { /* Do this again; we still need the service to exit... */ if (!check_send_exit_to_service (context, connection, service_name, base_service)) goto out; - + return TRUE; } - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -2162,7 +2205,7 @@ check_send_exit_to_service (BusContext *context, if (!check_send_exit_to_service (context, connection, service_name, base_service)) goto out; - + return TRUE; } @@ -2184,12 +2227,12 @@ check_send_exit_to_service (BusContext *context, dbus_connection_return_message (connection, message); message = NULL; } - + if (!got_error) { /* If no error, wait for the test service to exit */ block_connection_until_message_from_bus (context, connection, "test service to exit"); - + bus_test_run_everything (context); } @@ -2204,7 +2247,7 @@ check_send_exit_to_service (BusContext *context, "error with the correct reply serial"); goto out; } - + if (!dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -2232,7 +2275,7 @@ check_send_exit_to_service (BusContext *context, * stuff. */ message = pop_message_waiting_for_memory (connection); - + if (message == NULL) { warn_unexpected (connection, NULL, @@ -2253,10 +2296,10 @@ check_send_exit_to_service (BusContext *context, "error with the correct reply serial"); goto out; } - + _dbus_verbose ("Got error %s after test service exited\n", dbus_message_get_error_name (message)); - + if (!check_no_leftovers (context)) { _dbus_warn ("Messages were left over after %s\n", @@ -2264,13 +2307,13 @@ check_send_exit_to_service (BusContext *context, goto out; } } - + retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -2285,9 +2328,9 @@ check_got_error (BusContext *context, va_list ap; dbus_bool_t error_found; const char *error_name; - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -2326,20 +2369,20 @@ check_got_error (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } - + typedef enum -{ +{ GOT_SERVICE_CREATED, GOT_SERVICE_DELETED, GOT_ERROR, - GOT_SOMETHING_ELSE + GOT_SOMETHING_ELSE } GotServiceInfo; static GotServiceInfo @@ -2413,7 +2456,7 @@ check_existent_service_no_auto_start (BusContext *context, dbus_uint32_t flags; base_service_message = NULL; - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -2423,7 +2466,7 @@ check_existent_service_no_auto_start (BusContext *context, return TRUE; dbus_message_set_auto_start (message, FALSE); - + flags = 0; if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &existent, @@ -2433,7 +2476,7 @@ check_existent_service_no_auto_start (BusContext *context, dbus_message_unref (message); return TRUE; } - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -2454,12 +2497,12 @@ check_existent_service_no_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -2480,7 +2523,7 @@ check_existent_service_no_auto_start (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -2505,7 +2548,7 @@ check_existent_service_no_auto_start (BusContext *context, else { GotServiceInfo message_kind; - + if (!check_base_service_activated (context, connection, message, &base_service)) goto out; @@ -2515,7 +2558,7 @@ check_existent_service_no_auto_start (BusContext *context, /* We may need to block here for the test service to exit or finish up */ block_connection_until_message_from_bus (context, connection, "test service to exit or finish up"); - + message = dbus_connection_borrow_message (connection); if (message == NULL) { @@ -2558,7 +2601,7 @@ check_existent_service_no_auto_start (BusContext *context, socd.expected_service_name = base_service; socd.failed = FALSE; socd.skip_connection = NULL; - + bus_test_clients_foreach (check_service_owner_changed_foreach, &socd); @@ -2571,10 +2614,10 @@ check_existent_service_no_auto_start (BusContext *context, if (message_kind != GOT_ERROR) { block_connection_until_message_from_bus (context, connection, "error about service exiting"); - + /* and process everything again */ bus_test_run_everything (context); - + if (!check_got_error (context, connection, DBUS_ERROR_SPAWN_CHILD_EXITED, DBUS_ERROR_NO_MEMORY, @@ -2592,11 +2635,11 @@ check_existent_service_no_auto_start (BusContext *context, "should have been a NameOwnerChanged (creation)\n"); goto out; } - + if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME, base_service, message)) goto out; - + dbus_message_unref (message); message = NULL; @@ -2615,14 +2658,14 @@ check_existent_service_no_auto_start (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); if (base_service_message) dbus_message_unref (base_service_message); - + return retval; } @@ -2639,7 +2682,7 @@ check_segfault_service_no_auto_start (BusContext *context, dbus_bool_t retval; const char *segv_service; dbus_uint32_t flags; - + message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -2649,7 +2692,7 @@ check_segfault_service_no_auto_start (BusContext *context, return TRUE; dbus_message_set_auto_start (message, FALSE); - + segv_service = "org.freedesktop.DBus.TestSuiteSegfaultService"; flags = 0; if (!dbus_message_append_args (message, @@ -2660,7 +2703,7 @@ check_segfault_service_no_auto_start (BusContext *context, dbus_message_unref (message); return TRUE; } - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -2676,12 +2719,12 @@ check_segfault_service_no_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -2701,7 +2744,7 @@ check_segfault_service_no_auto_start (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -2734,11 +2777,11 @@ check_segfault_service_no_auto_start (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -2758,10 +2801,10 @@ check_segfault_service_auto_start (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Echo"); - + if (message == NULL) return TRUE; - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -2777,12 +2820,12 @@ check_segfault_service_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -2802,7 +2845,7 @@ check_segfault_service_auto_start (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -2827,11 +2870,11 @@ check_segfault_service_auto_start (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } #endif @@ -2854,7 +2897,7 @@ check_existent_hello_from_self (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "RunHelloFromSelf"); - + if (message == NULL) return TRUE; @@ -2882,7 +2925,7 @@ check_existent_hello_from_self (BusContext *context, * doesn't send a reply due to OOM. */ block_connection_until_message_from_bus (context, connection, "reply from running hello from self"); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -2899,7 +2942,7 @@ check_existent_hello_from_self (BusContext *context, dbus_message_unref (message); message = NULL; - + return TRUE; } @@ -2916,7 +2959,7 @@ check_existent_ping (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.DBus.Peer", "Ping"); - + if (message == NULL) return TRUE; @@ -2935,7 +2978,7 @@ check_existent_ping (BusContext *context, * doesn't send a reply due to OOM. */ block_connection_until_message_from_bus (context, connection, "reply from running Ping"); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -2959,7 +3002,7 @@ check_existent_ping (BusContext *context, dbus_message_unref (message); message = NULL; - + return TRUE; } @@ -2973,12 +3016,12 @@ check_existent_get_machine_id (BusContext *context, DBusMessage *message; dbus_uint32_t serial; const char *machine_id; - + message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME, "/org/freedesktop/TestSuite", "org.freedesktop.DBus.Peer", "GetMachineId"); - + if (message == NULL) return TRUE; @@ -2997,7 +3040,7 @@ check_existent_get_machine_id (BusContext *context, * doesn't send a reply due to OOM. */ block_connection_until_message_from_bus (context, connection, "reply from running GetMachineId"); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3033,14 +3076,14 @@ check_existent_get_machine_id (BusContext *context, dbus_message_unref (message); return FALSE; } - + /* We can't check that the machine id is correct because during make check it is * just made up for each process separately */ - + dbus_message_unref (message); message = NULL; - + return TRUE; } @@ -3064,7 +3107,7 @@ check_existent_service_auto_start (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Echo"); - + if (message == NULL) return TRUE; @@ -3096,12 +3139,12 @@ check_existent_service_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3146,7 +3189,7 @@ check_existent_service_auto_start (BusContext *context, dbus_connection_return_message (connection, message); message = NULL; - switch (message_kind) + switch (message_kind) { case GOT_SERVICE_CREATED: message = pop_message_waiting_for_memory (connection); @@ -3156,12 +3199,12 @@ check_existent_service_auto_start (BusContext *context, "should have been a NameOwnerChanged (creation)\n"); goto out; } - + /* Check that ServiceOwnerChanged (creation) was correctly received */ if (!check_service_auto_activated (context, connection, EXISTENT_SERVICE_NAME, base_service, message)) goto out; - + dbus_message_unref (message); message = NULL; @@ -3173,7 +3216,7 @@ check_existent_service_auto_start (BusContext *context, * failed to register under EXISTENT_SERVICE_NAME */ CheckServiceOwnerChangedData socd; - + socd.expected_kind = SERVICE_DELETED; socd.expected_service_name = base_service; socd.failed = FALSE; @@ -3202,7 +3245,7 @@ check_existent_service_auto_start (BusContext *context, * doesn't send a reply due to OOM. */ block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation"); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3224,7 +3267,7 @@ check_existent_service_auto_start (BusContext *context, if (!check_existent_get_machine_id (context, connection)) goto out; - + if (!check_existent_hello_from_self (context, connection)) goto out; @@ -3232,7 +3275,7 @@ check_existent_service_auto_start (BusContext *context, EXISTENT_SERVICE_NAME, base_service)) goto out; - + retval = TRUE; out: @@ -3262,7 +3305,7 @@ check_launch_service_file_missing (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Echo"); - + if (message == NULL) return TRUE; @@ -3281,12 +3324,12 @@ check_launch_service_file_missing (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3306,7 +3349,7 @@ check_launch_service_file_missing (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -3332,11 +3375,11 @@ check_launch_service_file_missing (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -3377,12 +3420,12 @@ check_launch_service_user_missing (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_warn ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_warn ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3402,7 +3445,7 @@ check_launch_service_user_missing (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -3428,11 +3471,11 @@ check_launch_service_user_missing (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -3473,12 +3516,12 @@ check_launch_service_exec_missing (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_warn ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_warn ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3498,7 +3541,7 @@ check_launch_service_exec_missing (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -3532,11 +3575,11 @@ check_launch_service_exec_missing (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -3577,12 +3620,12 @@ check_launch_service_service_missing (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_warn ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_warn ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3602,7 +3645,7 @@ check_launch_service_service_missing (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -3636,11 +3679,11 @@ check_launch_service_service_missing (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -3661,10 +3704,10 @@ check_shell_fail_service_auto_start (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Echo"); - + if (message == NULL) return TRUE; - + if (!dbus_connection_send (connection, message, &serial)) { dbus_message_unref (message); @@ -3680,12 +3723,12 @@ check_shell_fail_service_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } - + retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3705,7 +3748,7 @@ check_shell_fail_service_auto_start (BusContext *context, dbus_message_get_sender (message) : "(none)"); goto out; } - + if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -3731,11 +3774,11 @@ check_shell_fail_service_auto_start (BusContext *context, } retval = TRUE; - + out: if (message) dbus_message_unref (message); - + return retval; } @@ -3761,7 +3804,7 @@ check_shell_service_success_auto_start (BusContext *context, "/org/freedesktop/TestSuite", "org.freedesktop.TestSuite", "Echo"); - + if (message == NULL) return TRUE; @@ -3784,12 +3827,12 @@ check_shell_service_success_auto_start (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } retval = FALSE; - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3834,7 +3877,7 @@ check_shell_service_success_auto_start (BusContext *context, dbus_connection_return_message (connection, message); message = NULL; - switch (message_kind) + switch (message_kind) { case GOT_SERVICE_CREATED: message = pop_message_waiting_for_memory (connection); @@ -3844,12 +3887,12 @@ check_shell_service_success_auto_start (BusContext *context, "should have been a NameOwnerChanged (creation)\n"); goto out; } - + /* Check that ServiceOwnerChanged (creation) was correctly received */ if (!check_service_auto_activated (context, connection, SHELL_SUCCESS_SERVICE_NAME, base_service, message)) goto out; - + dbus_message_unref (message); message = NULL; @@ -3861,7 +3904,7 @@ check_shell_service_success_auto_start (BusContext *context, * failed to register under SHELL_SUCCESS_SERVICE_NAME */ CheckServiceOwnerChangedData socd; - + socd.expected_kind = SERVICE_DELETED; socd.expected_service_name = base_service; socd.failed = FALSE; @@ -3890,7 +3933,7 @@ check_shell_service_success_auto_start (BusContext *context, * doesn't send a reply due to OOM. */ block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation"); - + message = pop_message_waiting_for_memory (connection); if (message == NULL) { @@ -3905,7 +3948,7 @@ check_shell_service_success_auto_start (BusContext *context, } if (!dbus_message_get_args (message, NULL, - DBUS_TYPE_STRING, &argv[0], + DBUS_TYPE_STRING, &argv[0], DBUS_TYPE_STRING, &argv[1], DBUS_TYPE_STRING, &argv[2], DBUS_TYPE_STRING, &argv[3], @@ -3918,59 +3961,59 @@ check_shell_service_success_auto_start (BusContext *context, goto out; } - /* don't worry about arg[0] as it may be different + /* don't worry about arg[0] as it may be different depending on the path to the tests */ if (strcmp("-test", argv[1]) != 0) { - _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)\n", + _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)\n", "-test", argv[1]); goto out; - } + } if (strcmp("that", argv[2]) != 0) { - _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)\n", + _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)\n", "that", argv[2]); goto out; - } + } if (strcmp("we get", argv[3]) != 0) { - _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)\n", + _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)\n", "we get", argv[3]); goto out; - } - + } + if (strcmp("back", argv[4]) != 0) { - _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)\n", + _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)\n", "back", argv[4]); goto out; - } + } if (strcmp("--what", argv[5]) != 0) { - _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)\n", + _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)\n", "--what", argv[5]); goto out; - } + } if (strcmp("we put in", argv[6]) != 0) { - _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)\n", + _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)\n", "we put in", argv[6]); goto out; - } + } dbus_message_unref (message); message = NULL; - + if (!check_send_exit_to_service (context, connection, SHELL_SUCCESS_SERVICE_NAME, base_service)) goto out; - + retval = TRUE; out: @@ -3996,7 +4039,7 @@ check_oom_check1_func (void *data) if (! (* d->func) (d->context)) return FALSE; - + if (!check_no_leftovers (d->context)) { _dbus_warn ("Messages were left over, should be covered by test suite\n"); @@ -4064,7 +4107,7 @@ check_get_services (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); dbus_connection_unref (connection); @@ -4136,15 +4179,15 @@ check_get_services (BusContext *context, *len = l; } } - + if (!check_no_leftovers (context)) goto out; - + retval = TRUE; - + out: dbus_error_free (&error); - + if (message) dbus_message_unref (message); @@ -4178,6 +4221,7 @@ check_list_services (BusContext *context, if (!_dbus_string_array_contains ((const char **)services, existent)) { _dbus_warn ("Did not get the expected %s from ListActivatableNames\n", existent); + dbus_free_string_array (services); return FALSE; } @@ -4225,7 +4269,7 @@ check_list_services (BusContext *context, if (!dbus_connection_get_is_connected (connection)) { - _dbus_verbose ("connection was disconnected: %s %d\n", _DBUS_FUNCTION_NAME, __LINE__); + _dbus_verbose ("connection was disconnected\n"); return TRUE; } @@ -4316,7 +4360,7 @@ check_list_services (BusContext *context, "should have been a NameOwnerChanged (creation)\n"); goto out; } - + if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME, base_service, message)) goto out; @@ -4333,7 +4377,7 @@ check_list_services (BusContext *context, break; } } - + if (!check_get_services (context, connection, "ListNames", &services, &len)) { return TRUE; @@ -4377,7 +4421,7 @@ check_oom_check2_func (void *data) if (! (* d->func) (d->context, d->connection)) return FALSE; - + if (!check_no_leftovers (d->context)) { _dbus_warn ("Messages were left over, should be covered by test suite\n"); @@ -4398,7 +4442,7 @@ check2_try_iterations (BusContext *context, d.func = func; d.context = context; d.connection = connection; - + if (!_dbus_test_oom_handling (description, check_oom_check2_func, &d)) { @@ -4421,20 +4465,20 @@ setenv_TEST_LAUNCH_HELPER_CONFIG(const DBusString *test_data_dir, { _dbus_string_free (&full); return FALSE; - } + } _dbus_string_init_const (&file, filename); - + if (!_dbus_concat_dir_and_file (&full, &file)) { _dbus_string_free (&full); return FALSE; } - _dbus_verbose ("Setting TEST_LAUNCH_HELPER_CONFIG to '%s'\n", + _dbus_verbose ("Setting TEST_LAUNCH_HELPER_CONFIG to '%s'\n", _dbus_string_get_const_data (&full)); - - _dbus_setenv ("TEST_LAUNCH_HELPER_CONFIG", _dbus_string_get_const_data (&full)); + + dbus_setenv ("TEST_LAUNCH_HELPER_CONFIG", _dbus_string_get_const_data (&full)); _dbus_string_free (&full); @@ -4457,12 +4501,12 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG"); dbus_error_init (&error); - + context = bus_context_new_test (test_data_dir, filename); if (context == NULL) return FALSE; - - foo = dbus_connection_open_private ("debug-pipe:name=test-server", &error); + + foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); if (foo == NULL) _dbus_assert_not_reached ("could not alloc connection"); @@ -4470,7 +4514,7 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, _dbus_assert_not_reached ("could not set up connection"); spin_connection_until_authenticated (context, foo); - + if (!check_hello_message (context, foo)) _dbus_assert_not_reached ("hello message failed"); @@ -4479,8 +4523,8 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, if (!check_add_match_all (context, foo)) _dbus_assert_not_reached ("AddMatch message failed"); - - bar = dbus_connection_open_private ("debug-pipe:name=test-server", &error); + + bar = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); if (bar == NULL) _dbus_assert_not_reached ("could not alloc connection"); @@ -4488,14 +4532,14 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, _dbus_assert_not_reached ("could not set up connection"); spin_connection_until_authenticated (context, bar); - + if (!check_hello_message (context, bar)) _dbus_assert_not_reached ("hello message failed"); if (!check_add_match_all (context, bar)) _dbus_assert_not_reached ("AddMatch message failed"); - - baz = dbus_connection_open_private ("debug-pipe:name=test-server", &error); + + baz = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); if (baz == NULL) _dbus_assert_not_reached ("could not alloc connection"); @@ -4503,31 +4547,36 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, _dbus_assert_not_reached ("could not set up connection"); spin_connection_until_authenticated (context, baz); - + if (!check_hello_message (context, baz)) _dbus_assert_not_reached ("hello message failed"); if (!check_add_match_all (context, baz)) _dbus_assert_not_reached ("AddMatch message failed"); +#ifdef DBUS_WIN_FIXME + _dbus_warn("TODO: testing of GetConnectionUnixUser message skipped for now\n"); + _dbus_warn("TODO: testing of GetConnectionUnixProcessID message skipped for now\n"); +#else if (!check_get_connection_unix_user (context, baz)) _dbus_assert_not_reached ("GetConnectionUnixUser message failed"); if (!check_get_connection_unix_process_id (context, baz)) _dbus_assert_not_reached ("GetConnectionUnixProcessID message failed"); +#endif if (!check_list_services (context, baz)) _dbus_assert_not_reached ("ListActivatableNames message failed"); - + if (!check_no_leftovers (context)) { _dbus_warn ("Messages were left over after setting up initial connections\n"); _dbus_assert_not_reached ("initial connection setup failed"); } - + check1_try_iterations (context, "create_and_hello", check_hello_connection); - + check2_try_iterations (context, foo, "nonexistent_service_no_auto_start", check_nonexistent_service_no_auto_start); @@ -4537,15 +4586,15 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, check2_try_iterations (context, foo, "segfault_service_no_auto_start", check_segfault_service_no_auto_start); #endif - + check2_try_iterations (context, foo, "existent_service_no_auto_start", check_existent_service_no_auto_start); - + check2_try_iterations (context, foo, "nonexistent_service_auto_start", check_nonexistent_service_auto_start); - -#ifdef DBUS_WIN_FIXME + +#ifdef DBUS_WIN_FIXME _dbus_warn("TODO: dispatch.c segfault_service_auto_start test\n"); #else /* only do the segfault test if we are not using the launcher */ @@ -4570,7 +4619,7 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, check2_try_iterations (context, foo, "existent_service_auto_auto_start", check_existent_service_auto_start); #endif - + if (!check_existent_service_auto_start (context, foo)) _dbus_assert_not_reached ("existent service auto start failed"); @@ -4584,7 +4633,7 @@ bus_dispatch_test_conf (const DBusString *test_data_dir, kill_client_connection_unchecked (baz); bus_context_unref (context); - + return TRUE; } @@ -4599,14 +4648,14 @@ bus_dispatch_test_conf_fail (const DBusString *test_data_dir, /* save the config name for the activation helper */ if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename)) _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG"); - + dbus_error_init (&error); - + context = bus_context_new_test (test_data_dir, filename); if (context == NULL) return FALSE; - - foo = dbus_connection_open_private ("debug-pipe:name=test-server", &error); + + foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); if (foo == NULL) _dbus_assert_not_reached ("could not alloc connection"); @@ -4641,7 +4690,7 @@ bus_dispatch_test_conf_fail (const DBusString *test_data_dir, kill_client_connection_unchecked (foo); bus_context_unref (context); - + return TRUE; } @@ -4654,6 +4703,9 @@ bus_dispatch_test (const DBusString *test_data_dir) "valid-config-files/debug-allow-all.conf", FALSE)) return FALSE; +#ifdef DBUS_WIN + _dbus_warn("Info: Launch helper activation tests skipped because launch-helper is not supported yet\n"); +#else /* run launch-helper activation tests */ _dbus_verbose ("Launch helper activation tests\n"); if (!bus_dispatch_test_conf (test_data_dir, @@ -4664,6 +4716,7 @@ bus_dispatch_test (const DBusString *test_data_dir) if (!bus_dispatch_test_conf_fail (test_data_dir, "valid-config-files-system/debug-allow-all-fail.conf")) return FALSE; +#endif return TRUE; } @@ -4676,16 +4729,16 @@ bus_dispatch_sha1_test (const DBusString *test_data_dir) DBusError error; dbus_error_init (&error); - + /* Test SHA1 authentication */ _dbus_verbose ("Testing SHA1 context\n"); - + context = bus_context_new_test (test_data_dir, "valid-config-files/debug-allow-all-sha1.conf"); if (context == NULL) return FALSE; - foo = dbus_connection_open_private ("debug-pipe:name=test-server", &error); + foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); if (foo == NULL) _dbus_assert_not_reached ("could not alloc connection"); @@ -4693,19 +4746,19 @@ bus_dispatch_sha1_test (const DBusString *test_data_dir) _dbus_assert_not_reached ("could not set up connection"); spin_connection_until_authenticated (context, foo); - + if (!check_hello_message (context, foo)) _dbus_assert_not_reached ("hello message failed"); if (!check_add_match_all (context, foo)) _dbus_assert_not_reached ("addmatch message failed"); - + if (!check_no_leftovers (context)) { _dbus_warn ("Messages were left over after setting up initial SHA-1 connection\n"); _dbus_assert_not_reached ("initial connection setup failed"); } - + check1_try_iterations (context, "create_and_hello_sha1", check_hello_connection); @@ -4716,4 +4769,154 @@ bus_dispatch_sha1_test (const DBusString *test_data_dir) return TRUE; } -#endif /* DBUS_BUILD_TESTS */ +#ifdef HAVE_UNIX_FD_PASSING + +dbus_bool_t +bus_unix_fds_passing_test(const DBusString *test_data_dir) +{ + BusContext *context; + DBusConnection *foo, *bar; + DBusError error; + DBusMessage *m; + int one[2], two[2], x, y, z; + char r; + + dbus_error_init (&error); + + context = bus_context_new_test (test_data_dir, "valid-config-files/debug-allow-all.conf"); + if (context == NULL) + _dbus_assert_not_reached ("could not alloc context"); + + foo = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); + if (foo == NULL) + _dbus_assert_not_reached ("could not alloc connection"); + + if (!bus_setup_debug_client (foo)) + _dbus_assert_not_reached ("could not set up connection"); + + spin_connection_until_authenticated (context, foo); + + if (!check_hello_message (context, foo)) + _dbus_assert_not_reached ("hello message failed"); + + if (!check_add_match_all (context, foo)) + _dbus_assert_not_reached ("AddMatch message failed"); + + bar = dbus_connection_open_private (TEST_DEBUG_PIPE, &error); + if (bar == NULL) + _dbus_assert_not_reached ("could not alloc connection"); + + if (!bus_setup_debug_client (bar)) + _dbus_assert_not_reached ("could not set up connection"); + + spin_connection_until_authenticated (context, bar); + + if (!check_hello_message (context, bar)) + _dbus_assert_not_reached ("hello message failed"); + + if (!check_add_match_all (context, bar)) + _dbus_assert_not_reached ("AddMatch message failed"); + + if (!(m = dbus_message_new_signal("/", "a.b.c", "d"))) + _dbus_assert_not_reached ("could not alloc message"); + + if (!(_dbus_full_duplex_pipe(one, one+1, TRUE, &error))) + _dbus_assert_not_reached("Failed to allocate pipe #1"); + + if (!(_dbus_full_duplex_pipe(two, two+1, TRUE, &error))) + _dbus_assert_not_reached("Failed to allocate pipe #2"); + + if (!dbus_message_append_args(m, + DBUS_TYPE_UNIX_FD, one, + DBUS_TYPE_UNIX_FD, two, + DBUS_TYPE_UNIX_FD, two, + DBUS_TYPE_INVALID)) + _dbus_assert_not_reached("Failed to attach fds."); + + if (!_dbus_close(one[0], &error)) + _dbus_assert_not_reached("Failed to close pipe #1 "); + if (!_dbus_close(two[0], &error)) + _dbus_assert_not_reached("Failed to close pipe #2 "); + + if (!(dbus_connection_can_send_type(foo, DBUS_TYPE_UNIX_FD))) + _dbus_assert_not_reached("Connection cannot do fd passing"); + + if (!(dbus_connection_can_send_type(bar, DBUS_TYPE_UNIX_FD))) + _dbus_assert_not_reached("Connection cannot do fd passing"); + + if (!dbus_connection_send (foo, m, NULL)) + _dbus_assert_not_reached("Failed to send fds"); + + dbus_message_unref(m); + + bus_test_run_clients_loop (SEND_PENDING (foo)); + + bus_test_run_everything (context); + + block_connection_until_message_from_bus (context, foo, "unix fd reception on foo"); + + if (!(m = pop_message_waiting_for_memory (foo))) + _dbus_assert_not_reached("Failed to receive msg"); + + if (!dbus_message_is_signal(m, "a.b.c", "d")) + _dbus_assert_not_reached("bogus message received"); + + dbus_message_unref(m); + + block_connection_until_message_from_bus (context, bar, "unix fd reception on bar"); + + if (!(m = pop_message_waiting_for_memory (bar))) + _dbus_assert_not_reached("Failed to receive msg"); + + if (!dbus_message_is_signal(m, "a.b.c", "d")) + _dbus_assert_not_reached("bogus message received"); + + if (!dbus_message_get_args(m, + &error, + DBUS_TYPE_UNIX_FD, &x, + DBUS_TYPE_UNIX_FD, &y, + DBUS_TYPE_UNIX_FD, &z, + DBUS_TYPE_INVALID)) + _dbus_assert_not_reached("Failed to parse fds."); + + dbus_message_unref(m); + + if (write(x, "X", 1) != 1) + _dbus_assert_not_reached("Failed to write to pipe #1"); + if (write(y, "Y", 1) != 1) + _dbus_assert_not_reached("Failed to write to pipe #2"); + if (write(z, "Z", 1) != 1) + _dbus_assert_not_reached("Failed to write to pipe #2/2nd fd"); + + if (!_dbus_close(x, &error)) + _dbus_assert_not_reached("Failed to close pipe #1/other side "); + if (!_dbus_close(y, &error)) + _dbus_assert_not_reached("Failed to close pipe #2/other side "); + if (!_dbus_close(z, &error)) + _dbus_assert_not_reached("Failed to close pipe #2/other size 2nd fd "); + + if (read(one[1], &r, 1) != 1 || r != 'X') + _dbus_assert_not_reached("Failed to read value from pipe."); + if (read(two[1], &r, 1) != 1 || r != 'Y') + _dbus_assert_not_reached("Failed to read value from pipe."); + if (read(two[1], &r, 1) != 1 || r != 'Z') + _dbus_assert_not_reached("Failed to read value from pipe."); + + if (!_dbus_close(one[1], &error)) + _dbus_assert_not_reached("Failed to close pipe #1 "); + if (!_dbus_close(two[1], &error)) + _dbus_assert_not_reached("Failed to close pipe #2 "); + + _dbus_verbose ("Disconnecting foo\n"); + kill_client_connection_unchecked (foo); + + _dbus_verbose ("Disconnecting bar\n"); + kill_client_connection_unchecked (bar); + + bus_context_unref (context); + + return TRUE; +} +#endif + +#endif /* DBUS_ENABLE_EMBEDDED_TESTS */