diff options
Diffstat (limited to 'bus/bus.c')
-rw-r--r-- | bus/bus.c | 158 |
1 files changed, 133 insertions, 25 deletions
@@ -52,11 +52,20 @@ struct BusContext char *type; char *servicehelper; char *address; + + /* if we are in AF_BUS compat mode, contains the AF_BUS address */ + char *main_address; + char *pidfile; char *user; char *log_prefix; DBusLoop *loop; DBusList *servers; + + /* One of the servers may be a AF_BUS server. We can have at most only one + * AF_BUS server. */ + DBusServer *main_afbus_server; + BusConnections *connections; BusActivation *activation; BusRegistry *registry; @@ -207,6 +216,29 @@ free_server_data (void *data) dbus_free (bd); } +static void +shutdown_server (BusContext *context, + DBusServer *server) +{ + if (server == NULL || + !dbus_server_get_is_connected (server)) + return; + + if (!dbus_server_set_watch_functions (server, + NULL, NULL, NULL, + context, + NULL)) + _dbus_assert_not_reached ("setting watch functions to NULL failed"); + + if (!dbus_server_set_timeout_functions (server, + NULL, NULL, NULL, + context, + NULL)) + _dbus_assert_not_reached ("setting timeout functions to NULL failed"); + + dbus_server_disconnect (server); +} + static dbus_bool_t setup_server (BusContext *context, DBusServer *server, @@ -275,6 +307,7 @@ process_config_first_time_only (BusContext *context, DBusString log_prefix; DBusList *link; DBusList **addresses; + DBusList **addresses_if_possible; const char *user, *pidfile; char **auth_mechanisms; DBusList **auth_mechanisms_list; @@ -448,6 +481,7 @@ process_config_first_time_only (BusContext *context, while (link != NULL) { DBusServer *server; + dbus_bool_t is_afbus; server = dbus_server_listen (link->data, error); if (server == NULL) @@ -455,17 +489,78 @@ process_config_first_time_only (BusContext *context, _DBUS_ASSERT_ERROR_IS_SET (error); goto failed; } - else if (!setup_server (context, server, auth_mechanisms, error)) + is_afbus = dbus_server_is_afbus (server); + + /* Only accept one AF_BUS server */ + if (is_afbus && context->main_afbus_server != NULL) { + dbus_server_disconnect (server); + dbus_server_unref (server); + dbus_set_error (error, + DBUS_ERROR_MULTIPLE_AFBUS, + "Cannot listen on multiple AF_BUS address"); + goto failed; + } + + if (!setup_server (context, server, auth_mechanisms, error)) + { + shutdown_server (context, server); + dbus_server_unref (server); _DBUS_ASSERT_ERROR_IS_SET (error); goto failed; } + if (is_afbus) + context->main_afbus_server = server; if (!_dbus_list_append (&context->servers, server)) goto oom; link = _dbus_list_get_next_link (addresses, link); } + + addresses_if_possible = + bus_config_parser_get_addresses_if_possible (parser); + + link = _dbus_list_get_first_link (addresses_if_possible); + while (link != NULL) + { + DBusServer *server; + dbus_bool_t is_afbus; + + server = dbus_server_listen (link->data, NULL); + if (server == NULL) + { + link = _dbus_list_get_next_link (addresses_if_possible, link); + continue; + } + is_afbus = dbus_server_is_afbus (server); + + /* Only accept one AF_BUS server */ + if (is_afbus && context->main_afbus_server != NULL) + { + dbus_server_disconnect (server); + dbus_server_unref (server); + + link = _dbus_list_get_next_link (addresses_if_possible, link); + continue; + } + + if (!setup_server (context, server, auth_mechanisms, NULL)) + { + shutdown_server (context, server); + dbus_server_unref (server); + + link = _dbus_list_get_next_link (addresses_if_possible, link); + continue; + } + if (is_afbus) + context->main_afbus_server = server; + + if (!_dbus_list_append (&context->servers, server)) + goto oom; + + link = _dbus_list_get_next_link (addresses_if_possible, link); + } } context->fork = bus_config_parser_get_fork (parser); @@ -499,6 +594,7 @@ process_config_every_time (BusContext *context, DBusError *error) { DBusString full_address; + DBusString main_address; DBusList *link; DBusList **dirs; char *addr; @@ -518,6 +614,12 @@ process_config_every_time (BusContext *context, return FALSE; } + if (!_dbus_string_init (&main_address)) + { + BUS_SET_OOM (error); + return FALSE; + } + /* get our limits and timeout lengths */ bus_config_parser_get_limits (parser, &context->limits); @@ -554,6 +656,18 @@ process_config_every_time (BusContext *context, goto failed; } + if (dbus_server_is_afbus (link->data)) + { + /* There must be at most one AF_BUS server */ + _dbus_assert (_dbus_string_get_length (&main_address) == 0); + + if (!_dbus_string_append (&main_address, addr)) + { + BUS_SET_OOM (error); + goto failed; + } + } + dbus_free (addr); addr = NULL; @@ -561,7 +675,10 @@ process_config_every_time (BusContext *context, } if (is_reload) - dbus_free (context->address); + { + dbus_free (context->address); + dbus_free (context->main_address); + } if (!_dbus_string_copy_data (&full_address, &context->address)) { @@ -569,6 +686,12 @@ process_config_every_time (BusContext *context, goto failed; } + if (!_dbus_string_copy_data (&main_address, &context->main_address)) + { + BUS_SET_OOM (error); + goto failed; + } + /* get the service directories */ dirs = bus_config_parser_get_service_dirs (parser); @@ -609,6 +732,7 @@ process_config_every_time (BusContext *context, failed: _dbus_string_free (&full_address); + _dbus_string_free (&main_address); if (addr) dbus_free (addr); @@ -990,29 +1114,6 @@ bus_context_reload_config (BusContext *context, return ret; } -static void -shutdown_server (BusContext *context, - DBusServer *server) -{ - if (server == NULL || - !dbus_server_get_is_connected (server)) - return; - - if (!dbus_server_set_watch_functions (server, - NULL, NULL, NULL, - context, - NULL)) - _dbus_assert_not_reached ("setting watch functions to NULL failed"); - - if (!dbus_server_set_timeout_functions (server, - NULL, NULL, NULL, - context, - NULL)) - _dbus_assert_not_reached ("setting timeout functions to NULL failed"); - - dbus_server_disconnect (server); -} - void bus_context_shutdown (BusContext *context) { @@ -1099,6 +1200,7 @@ bus_context_unref (BusContext *context) dbus_free (context->log_prefix); dbus_free (context->type); dbus_free (context->address); + dbus_free (context->main_address); dbus_free (context->user); dbus_free (context->servicehelper); @@ -1134,6 +1236,12 @@ bus_context_get_address (BusContext *context) } const char* +bus_context_get_main_address (BusContext *context) +{ + return context->main_address; +} + +const char* bus_context_get_servicehelper (BusContext *context) { return context->servicehelper; |