X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bus%2Factivation.c;h=cd77faa83112a8a4090f7fffef771470003215b2;hb=bd6d8d261df61ed8b396434e5a80285d43184d6c;hp=d5424a7ceeb60abceb3f6db9fb9acce615f9e790;hpb=feb31a33219bc0640c00138c14774995ab1a65a8;p=platform%2Fupstream%2Fdbus.git diff --git a/bus/activation.c b/bus/activation.c index d5424a7..cd77faa 100644 --- a/bus/activation.c +++ b/bus/activation.c @@ -80,7 +80,14 @@ typedef struct BusPendingActivationEntry BusPendingActivationEntry; struct BusPendingActivationEntry { + /* Normally a method call, but if connection is NULL, this is a signal + * instead. + */ DBusMessage *activation_message; + /* NULL if this activation entry is for the dbus-daemon itself, + * waiting for systemd to start. In this case, auto_activation is always + * TRUE. + */ DBusConnection *connection; dbus_bool_t auto_activation; @@ -257,6 +264,7 @@ update_desktop_file_entry (BusActivation *activation, _DBUS_ASSERT_ERROR_IS_CLEAR (error); + retval = FALSE; name = NULL; exec = NULL; user = NULL; @@ -416,8 +424,11 @@ update_desktop_file_entry (BusActivation *activation, if (_dbus_hash_table_lookup_string (activation->entries, name)) { - _dbus_verbose ("The new service name \"%s\" of service file \"%s\" already in cache, ignoring\n", + _dbus_verbose ("The new service name \"%s\" of service file \"%s\" is already in cache, ignoring\n", name, _dbus_string_get_const_data (&file_path)); + dbus_set_error (error, DBUS_ERROR_FAILED, + "The new service name \"%s\" of service file \"%s\" is already in cache, ignoring\n", + name, _dbus_string_get_const_data (&file_path)); goto out; } @@ -446,8 +457,7 @@ update_desktop_file_entry (BusActivation *activation, * the entries hash table */ _dbus_hash_table_remove_string (entry->s_dir->entries, entry->filename); - bus_activation_entry_unref (entry); - return FALSE; + goto out; } } @@ -465,7 +475,7 @@ out: if (entry) bus_activation_entry_unref (entry); - return FALSE; + return retval; } static dbus_bool_t @@ -881,8 +891,6 @@ bus_activation_new (BusContext *context, DBusError *error) { BusActivation *activation; - DBusList *link; - char *dir; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -1105,7 +1113,8 @@ bus_activation_service_created (BusActivation *activation, BusPendingActivationEntry *entry = link->data; DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link); - if (dbus_connection_get_is_connected (entry->connection)) + /* entry->connection is NULL for activating systemd */ + if (entry->connection && dbus_connection_get_is_connected (entry->connection)) { /* Only send activation replies to regular activation requests. */ if (!entry->auto_activation) @@ -1174,11 +1183,18 @@ bus_activation_send_pending_auto_activation_messages (BusActivation *activation BusPendingActivationEntry *entry = link->data; DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link); - if (entry->auto_activation && dbus_connection_get_is_connected (entry->connection)) + if (entry->auto_activation && (entry->connection == NULL || dbus_connection_get_is_connected (entry->connection))) { DBusConnection *addressed_recipient; - addressed_recipient = bus_service_get_primary_owners_connection (service); + /* kdbus change - we can not send anything using phantom connections + * (DBusConnection structures for services other than daemon) + * so we have to use daemon connection + */ + if(bus_context_is_kdbus(bus_transaction_get_context (transaction))) + addressed_recipient = entry->connection; + else + addressed_recipient = bus_service_get_primary_owners_connection (service); /* Resume dispatching where we left off in bus_dispatch() */ if (!bus_dispatch_matches (transaction, @@ -1232,7 +1248,7 @@ try_send_activation_failure (BusPendingActivation *pending_activation, BusPendingActivationEntry *entry = link->data; DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link); - if (dbus_connection_get_is_connected (entry->connection)) + if (entry->connection && dbus_connection_get_is_connected (entry->connection)) { if (!bus_transaction_send_error_reply (transaction, entry->connection, @@ -1426,6 +1442,16 @@ remove_babysitter_watch (DBusWatch *watch, watch); } +static void +toggle_babysitter_watch (DBusWatch *watch, + void *data) +{ + BusPendingActivation *pending_activation = data; + + _dbus_loop_toggle_watch (bus_context_get_loop (pending_activation->activation->context), + watch); +} + static dbus_bool_t pending_activation_timed_out (void *data) { @@ -1671,7 +1697,6 @@ bus_activation_activate_service (BusActivation *activation, char **envp = NULL; int argc; dbus_bool_t retval; - DBusHashIter iter; dbus_bool_t was_pending_activation; DBusString command; @@ -1749,7 +1774,8 @@ bus_activation_activate_service (BusActivation *activation, pending_activation_entry->activation_message = activation_message; dbus_message_ref (activation_message); pending_activation_entry->connection = connection; - dbus_connection_ref (connection); + if (connection) + dbus_connection_ref (connection); /* Check if the service is being activated */ pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, service_name); @@ -1962,7 +1988,7 @@ bus_activation_activate_service (BusActivation *activation, service_name, entry->systemd_service); /* systemd is not around, let's "activate" it. */ - retval = bus_activation_activate_service (activation, connection, activation_transaction, TRUE, + retval = bus_activation_activate_service (activation, NULL, activation_transaction, TRUE, message, "org.freedesktop.systemd1", error); } @@ -2110,7 +2136,7 @@ bus_activation_activate_service (BusActivation *activation, if (!_dbus_babysitter_set_watch_functions (pending_activation->babysitter, add_babysitter_watch, remove_babysitter_watch, - NULL, + toggle_babysitter_watch, pending_activation, NULL)) { @@ -2160,7 +2186,7 @@ bus_activation_list_services (BusActivation *activation, error: for (j = 0; j < i; j++) - dbus_free (retval[i]); + dbus_free (retval[j]); dbus_free (retval); return FALSE; @@ -2213,7 +2239,7 @@ dbus_activation_systemd_failure (BusActivation *activation, return TRUE; } -#ifdef DBUS_BUILD_TESTS +#ifdef DBUS_ENABLE_EMBEDDED_TESTS #include @@ -2520,11 +2546,17 @@ dbus_bool_t bus_activation_service_reload_test (const DBusString *test_data_dir) { DBusString directory; + const char *tmp; if (!_dbus_string_init (&directory)) return FALSE; - if (!_dbus_string_append (&directory, _dbus_get_tmpdir())) + tmp = _dbus_get_tmpdir (); + + if (tmp == NULL) + return FALSE; + + if (!_dbus_string_append (&directory, tmp)) return FALSE; if (!_dbus_string_append (&directory, "/dbus-reload-test-") || @@ -2538,14 +2570,18 @@ bus_activation_service_reload_test (const DBusString *test_data_dir) _dbus_assert_not_reached ("could not initiate service reload test"); if (!do_service_reload_test (&directory, FALSE)) - ; /* Do nothing? */ + { + /* Do nothing? */ + } /* Do OOM tests */ if (!init_service_reload_test (&directory)) _dbus_assert_not_reached ("could not initiate service reload test"); if (!do_service_reload_test (&directory, TRUE)) - ; /* Do nothing? */ + { + /* Do nothing? */ + } /* Cleanup test directory */ if (!cleanup_service_reload_test (&directory)) @@ -2556,4 +2592,4 @@ bus_activation_service_reload_test (const DBusString *test_data_dir) return TRUE; } -#endif /* DBUS_BUILD_TESTS */ +#endif /* DBUS_ENABLE_EMBEDDED_TESTS */