_DBUS_ASSERT_ERROR_IS_SET (error);
goto failed;
}
+
+ if(context->myKdbusConnection)
+ {
+ if(!update_kdbus_starters(context->myKdbusConnection))
+ {
+ _dbus_verbose ("Update kdbus starters for dbus activatable names failed.\n");
+ _DBUS_ASSERT_ERROR_IS_SET (error);
+ goto failed;
+ }
+ }
ret = TRUE;
bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Reloaded configuration");
return d->n_services_owned;
}
+DBusList**
+bus_connection_get_services_owned (DBusConnection *connection)
+{
+ BusConnectionData *d;
+ d = BUS_CONNECTION_DATA (connection);
+ _dbus_assert (d != NULL);
+
+ return &d->services_owned;
+}
+
dbus_bool_t
bus_connection_complete (DBusConnection *connection,
const DBusString *name,
void bus_connection_send_oom_error (DBusConnection *connection,
DBusMessage *in_reply_to);
+DBusList** bus_connection_get_services_owned (DBusConnection *connection);
+
/* called by signals.c */
dbus_bool_t bus_connection_add_match_rule (DBusConnection *connection,
BusMatchRule *rule);
return retval;
}
+dbus_bool_t update_kdbus_starters(DBusConnection* connection)
+{
+ dbus_bool_t retval = FALSE;
+ DBusList **services_old;
+ DBusList *link;
+ BusService *service = NULL;
+ BusTransaction *transaction;
+ int fd;
+
+ transaction = bus_transaction_new (bus_connection_get_context(connection));
+ if (transaction == NULL)
+ return FALSE;
+
+ if(!_dbus_transport_get_socket_fd(dbus_connection_get_transport(connection), &fd))
+ goto out;
+
+ services_old = bus_connection_get_services_owned(connection);
+ link = _dbus_list_get_first_link(services_old);
+
+ while (link != NULL)
+ {
+ int ret;
+
+ service = (BusService*) link->data;
+ if(service == NULL)
+ goto out;
+
+ ret = release_kdbus_name(fd, bus_service_get_name(service), 0);
+
+ if (ret == DBUS_RELEASE_NAME_REPLY_RELEASED)
+ {
+ if(!bus_service_remove_owner(service, connection, transaction, NULL))
+ _dbus_verbose ("Unable to remove\n");
+ }
+ else if(ret < 0)
+ goto out;
+
+ link = _dbus_list_get_next_link (services_old, link);
+ }
+
+ if(!register_kdbus_starters(connection))
+ {
+ _dbus_verbose ("Registering kdbus starters for dbus activatable names failed!\n");
+ goto out;
+ }
+ retval = TRUE;
+
+out:
+ bus_transaction_free(transaction);
+ return retval;
+}
+
/*
static dbus_bool_t remove_conn_if_name_match (DBusConnection *connection, void *data)
{
DBusConnection* create_phantom_connection(DBusConnection* connection, const char* unique_name, DBusError* error);
dbus_bool_t register_kdbus_starters(DBusConnection* connection);
+dbus_bool_t update_kdbus_starters(DBusConnection* connection);
void handleNameOwnerChanged(DBusMessage *msg, BusTransaction *transaction, DBusConnection *connection);
#endif /* KDBUS_H_ */