X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bus%2Fbus.c;h=ee2ff9cc4f55f91e51f81ab90fc3c8bb8438fcf0;hb=3428a70ec49b9657651ad74f372912f7aa4d6b09;hp=307c158612b92526eef25edc864f4f419b95ba4e;hpb=51fe1c05aceaf058907007a25a2d46f30a9c83a6;p=platform%2Fupstream%2Fdbus.git diff --git a/bus/bus.c b/bus/bus.c index 307c158..ee2ff9c 100644 --- a/bus/bus.c +++ b/bus/bus.c @@ -2,6 +2,7 @@ /* bus.c message bus context object * * Copyright (C) 2003, 2004 Red Hat, Inc. + * Copyright (C) 2013 Samsung Electronics * * Licensed under the Academic Free License version 2.1 * @@ -40,6 +41,11 @@ #include #include +#ifdef ENABLE_KDBUS_TRANSPORT +#include "kdbus-d.h" +#include +#endif + #ifdef DBUS_CYGWIN #include #endif @@ -68,6 +74,9 @@ struct BusContext unsigned int keep_umask : 1; unsigned int allow_anonymous : 1; unsigned int systemd_activation : 1; +#ifdef ENABLE_KDBUS_TRANSPORT + DBusConnection *myKdbusConnection; //todo maybe can be rafctored and removed +#endif }; static dbus_int32_t server_data_slot = -1; @@ -261,6 +270,47 @@ setup_server (BusContext *context, return TRUE; } +#ifdef ENABLE_KDBUS_TRANSPORT +static int +init_server_for_kdbus (BusContext *context, + const char *address, + DBusError *error) +{ + DBusBusType type; + DBusServer* server; + char* bus_address; + + if (!strcmp (context->type, "system")) + type = DBUS_BUS_SYSTEM; + else if (!strcmp (context->type, "session")) + type = DBUS_BUS_SESSION; + else + type = DBUS_BUS_STARTER; + + bus_address = make_kdbus_bus (type, address, error); + if (bus_address == NULL) + return -1; + + server = empty_server_init (bus_address); + if (server == NULL) + { + free (bus_address); + return -1; + } + if (!_dbus_list_append (&context->servers, server)) + { + free (bus_address); + return -2; + } + + context->myKdbusConnection = daemon_as_client (type, bus_address, error); + if (context->myKdbusConnection == NULL) + return -1; + + return 0; +} +#endif + /* This code only gets executed the first time the * config files are parsed. It is not executed * when config files are reloaded. @@ -423,49 +473,81 @@ process_config_first_time_only (BusContext *context, if (address) { - DBusServer *server; - - server = dbus_server_listen (_dbus_string_get_const_data(address), error); - if (server == NULL) +#ifdef ENABLE_KDBUS_TRANSPORT + if(!strncmp(_dbus_string_get_const_data(address), "kdbus:", strlen("kdbus:"))) { - _DBUS_ASSERT_ERROR_IS_SET (error); - goto failed; + int ret; + + ret = init_server_for_kdbus (context, _dbus_string_get_const_data (address), error); + + if (ret == -1) + goto failed; + else if (ret == -2) + goto oom; } - else if (!setup_server (context, server, auth_mechanisms, error)) + else +#endif { - _DBUS_ASSERT_ERROR_IS_SET (error); - goto failed; - } - - if (!_dbus_list_append (&context->servers, server)) - goto oom; + DBusServer *server; + + server = dbus_server_listen (_dbus_string_get_const_data(address), error); + if (server == NULL) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + goto failed; + } + else if (!setup_server (context, server, auth_mechanisms, error)) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + goto failed; + } + + if (!_dbus_list_append (&context->servers, server)) + goto oom; + } } else { addresses = bus_config_parser_get_addresses (parser); link = _dbus_list_get_first_link (addresses); - while (link != NULL) +#ifdef ENABLE_KDBUS_TRANSPORT + if (!strcmp (link->data, "kdbus:")) { - DBusServer *server; + int ret; - server = dbus_server_listen (link->data, error); - if (server == NULL) - { - _DBUS_ASSERT_ERROR_IS_SET (error); - goto failed; - } - else if (!setup_server (context, server, auth_mechanisms, error)) - { - _DBUS_ASSERT_ERROR_IS_SET (error); - goto failed; - } + ret = init_server_for_kdbus (context, link->data, error); - if (!_dbus_list_append (&context->servers, server)) + if (ret == -1) + goto failed; + else if (ret == -2) goto oom; - - link = _dbus_list_get_next_link (addresses, link); } + else +#endif + { + while (link != NULL) + { + DBusServer *server; + + server = dbus_server_listen (link->data, error); + if (server == NULL) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + goto failed; + } + else if (!setup_server (context, server, auth_mechanisms, error)) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + goto failed; + } + + if (!_dbus_list_append (&context->servers, server)) + goto oom; + + link = _dbus_list_get_next_link (addresses, link); + } + } } context->fork = bus_config_parser_get_fork (parser); @@ -731,6 +813,10 @@ bus_context_new (const DBusString *config_file, } context->refcount = 1; +#ifdef ENABLE_KDBUS_TRANSPORT + context->myKdbusConnection = NULL; +#endif + _dbus_generate_uuid (&context->uuid); if (!_dbus_string_copy_data (config_file, &context->config_file)) @@ -928,6 +1014,39 @@ bus_context_new (const DBusString *config_file, dbus_server_free_data_slot (&server_data_slot); +#ifdef ENABLE_KDBUS_TRANSPORT + if(context->myKdbusConnection) + { + DBusString unique_name; + + if(!bus_connections_setup_connection(context->connections, context->myKdbusConnection)) + { + _dbus_verbose ("Bus connections setup connection failed for myKdbusConnection!\n"); + dbus_connection_close (context->myKdbusConnection); + dbus_connection_unref (context->myKdbusConnection); + goto failed; + } + dbus_connection_set_route_peer_messages (context->myKdbusConnection, FALSE); + _dbus_string_init_const (&unique_name, dbus_bus_get_unique_name(context->myKdbusConnection)); + if(!bus_connection_complete (context->myKdbusConnection, &unique_name, error)) + { + _dbus_verbose ("Bus connection complete failed for myKdbusConnection!\n"); + goto failed; + } + + if(!register_daemon_name(context->myKdbusConnection)) + { + _dbus_verbose ("Registering org.freedesktop.DBus name for daemon failed!\n"); + goto failed; + } + if(!register_kdbus_starters(context->myKdbusConnection)) + { + _dbus_verbose ("Registering kdbus starters for dbus activatable names failed!\n"); + goto failed; + } + } +#endif + return context; failed: @@ -979,6 +1098,19 @@ bus_context_reload_config (BusContext *context, _DBUS_ASSERT_ERROR_IS_SET (error); goto failed; } + +#ifdef ENABLE_KDBUS_TRANSPORT + 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; + } + } +#endif + ret = TRUE; bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Reloaded configuration"); @@ -1272,6 +1404,13 @@ bus_context_get_reply_timeout (BusContext *context) return context->limits.reply_timeout; } +#ifdef ENABLE_KDBUS_TRANSPORT +dbus_bool_t bus_context_is_kdbus(BusContext* context) +{ + return context->myKdbusConnection != NULL; +} +#endif + void bus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...) _DBUS_GNUC_PRINTF (3, 4);