summaryrefslogtreecommitdiff
path: root/bus/bus.c
diff options
context:
space:
mode:
Diffstat (limited to 'bus/bus.c')
-rw-r--r--bus/bus.c158
1 files changed, 133 insertions, 25 deletions
diff --git a/bus/bus.c b/bus/bus.c
index e80e7080..5038958c 100644
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -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;