X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bus%2Fbus.c;h=4d9fe1899e78b36b6bdc9e92a26efc4484cde839;hb=05902801b49789f37426754fc6b77f3665afe3b0;hp=ae2a61a62241bb19612365b9dabe65ffcc131727;hpb=349260f245d95a6c8bcc0f000be1f3232c616052;p=platform%2Fupstream%2Fdbus.git diff --git a/bus/bus.c b/bus/bus.c index ae2a61a..4d9fe18 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; @@ -269,8 +278,7 @@ static dbus_bool_t process_config_first_time_only (BusContext *context, BusConfigParser *parser, const DBusString *address, - dbus_bool_t systemd_activation, - dbus_bool_t write_pidfile, + BusContextFlags flags, DBusError *error) { DBusString log_prefix; @@ -288,9 +296,12 @@ process_config_first_time_only (BusContext *context, auth_mechanisms = NULL; pidfile = NULL; - _dbus_init_system_log (); + _dbus_init_system_log (TRUE); - context->systemd_activation = systemd_activation; + if (flags & BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION) + context->systemd_activation = TRUE; + else + context->systemd_activation = FALSE; /* Check for an existing pid file. Of course this is a race; * we'd have to use fcntl() locks on the pid file to @@ -298,7 +309,7 @@ process_config_first_time_only (BusContext *context, * before overwriting any existing sockets, etc. */ - if (write_pidfile) + if (flags & BUS_CONTEXT_FLAG_WRITE_PID_FILE) pidfile = bus_config_parser_get_pidfile (parser); if (pidfile != NULL) @@ -421,22 +432,61 @@ 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) - { - _DBUS_ASSERT_ERROR_IS_SET (error); - goto failed; - } - else if (!setup_server (context, server, auth_mechanisms, error)) +#ifdef ENABLE_KDBUS_TRANSPORT + if(!strcmp(_dbus_string_get_const_data(address), "kdbus")) + { + 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, error); + if(bus_address == NULL) + goto failed; + + server = empty_server_init(bus_address); + if(server == NULL) + { + free(bus_address); + goto failed; + } + + if (!_dbus_list_append (&context->servers, server)) + { + free(bus_address); + goto oom; + } + + context->myKdbusConnection = daemon_as_client(type, bus_address, error); + if(context->myKdbusConnection == NULL) + goto failed; + } + 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 { @@ -698,17 +748,18 @@ process_config_postinit (BusContext *context, BusContext* bus_context_new (const DBusString *config_file, - ForceForkSetting force_fork, + BusContextFlags flags, DBusPipe *print_addr_pipe, DBusPipe *print_pid_pipe, const DBusString *address, - dbus_bool_t systemd_activation, - dbus_bool_t write_pidfile, DBusError *error) { BusContext *context; BusConfigParser *parser; + _dbus_assert ((flags & BUS_CONTEXT_FLAG_FORK_NEVER) == 0 || + (flags & BUS_CONTEXT_FLAG_FORK_ALWAYS) == 0); + _DBUS_ASSERT_ERROR_IS_CLEAR (error); context = NULL; @@ -728,6 +779,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)) @@ -757,7 +812,7 @@ bus_context_new (const DBusString *config_file, goto failed; } - if (!process_config_first_time_only (context, parser, address, systemd_activation, write_pidfile, error)) + if (!process_config_first_time_only (context, parser, address, flags, error)) { _DBUS_ASSERT_ERROR_IS_SET (error); goto failed; @@ -852,7 +907,8 @@ bus_context_new (const DBusString *config_file, if (context->pidfile) _dbus_string_init_const (&u, context->pidfile); - if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS) + if (((flags & BUS_CONTEXT_FLAG_FORK_NEVER) == 0 && context->fork) || + (flags & BUS_CONTEXT_FLAG_FORK_ALWAYS)) { _dbus_verbose ("Forking and becoming daemon\n"); @@ -924,6 +980,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, ":1.1"); //dbus_bus_get_unique_name(context->myConnection)); this is without :1. + 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: @@ -975,6 +1064,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"); @@ -1268,6 +1370,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);