summaryrefslogtreecommitdiffstats
path: root/bus
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-04-03 05:22:49 +0000
committerHavoc Pennington <hp@redhat.com>2003-04-03 05:22:49 +0000
commiteeb88949d8d2ca84d9cbe54c07e73b9907d3163e (patch)
tree9520b0d32fd0c105f41619f8d247a298f93caf9c /bus
parent5364beac6cbfa8793fd34c7a634528a2112787f8 (diff)
2003-04-03 Havoc Pennington <hp@pobox.com>
* bus/config-parser.c (bus_config_parser_unref): free list of mechanisms, bug discovered by test suite enhancements (putting system.conf and session.conf into suite) * test/Makefile.am, test/test-service.c: add placeholder for a test service that we'll activate as part of test suite. Doesn't do anything yet. * dbus/dbus-sysdeps.c (_dbus_setenv): support unsetenv by setting NULL value, and use system malloc not dbus_malloc() when we have unavoidable memleakage. * dbus/dbus-bus.c (dbus_bus_get): fix bug where bus type of 0 didn't work, and support DBUS_BUS_ACTIVATION. * bus/activation.c (child_setup): pass our well-known bus type to the child * bus/config-parser.c: support <type> to specify well-known type * doc/dbus-specification.sgml: document the env variables to locate well-known buses and find service activator
Diffstat (limited to 'bus')
-rw-r--r--bus/activation.c10
-rw-r--r--bus/bus.c14
-rw-r--r--bus/bus.h1
-rw-r--r--bus/config-parser.c87
-rw-r--r--bus/config-parser.h1
-rw-r--r--bus/session.conf.in4
-rw-r--r--bus/system.conf.in3
7 files changed, 99 insertions, 21 deletions
diff --git a/bus/activation.c b/bus/activation.c
index 0dfce3f8..eb56a744 100644
--- a/bus/activation.c
+++ b/bus/activation.c
@@ -404,12 +404,20 @@ static void
child_setup (void *data)
{
BusActivation *activation = data;
+ const char *type;
/* If no memory, we simply have the child exit, so it won't try
* to connect to the wrong thing.
*/
- if (!_dbus_setenv ("DBUS_ADDRESS", activation->server_address))
+ if (!_dbus_setenv ("DBUS_ACTIVATION_ADDRESS", activation->server_address))
_dbus_exit (1);
+
+ type = bus_context_get_type (activation->context);
+ if (type != NULL)
+ {
+ if (!_dbus_setenv ("DBUS_BUS_TYPE", type))
+ _dbus_exit (1);
+ }
}
dbus_bool_t
diff --git a/bus/bus.c b/bus/bus.c
index 82452d07..381f6317 100644
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -36,6 +36,7 @@
struct BusContext
{
int refcount;
+ char *type;
char *address;
DBusList *servers;
BusConnections *connections;
@@ -290,6 +291,9 @@ bus_context_new (const DBusString *config_file,
if (!_dbus_change_identity (creds.uid, creds.gid, error))
goto failed;
}
+
+ /* note that type may be NULL */
+ context->type = _dbus_strdup (bus_config_parser_get_type (parser));
/* We have to build the address backward, so that
* <listen> later in the config file have priority
@@ -496,12 +500,20 @@ bus_context_unref (BusContext *context)
_dbus_hash_table_unref (context->rules_by_gid);
context->rules_by_gid = NULL;
}
-
+
+ dbus_free (context->type);
dbus_free (context->address);
dbus_free (context);
}
}
+/* type may be NULL */
+const char*
+bus_context_get_type (BusContext *context)
+{
+ return context->type;
+}
+
BusRegistry*
bus_context_get_registry (BusContext *context)
{
diff --git a/bus/bus.h b/bus/bus.h
index 3e2dc465..902f5fac 100644
--- a/bus/bus.h
+++ b/bus/bus.h
@@ -43,6 +43,7 @@ BusContext* bus_context_new (const DBusString *config_f
void bus_context_shutdown (BusContext *context);
void bus_context_ref (BusContext *context);
void bus_context_unref (BusContext *context);
+const char* bus_context_get_type (BusContext *context);
BusRegistry* bus_context_get_registry (BusContext *context);
BusConnections* bus_context_get_connections (BusContext *context);
BusActivation* bus_context_get_activation (BusContext *context);
diff --git a/bus/config-parser.c b/bus/config-parser.c
index 9e16e4fc..f9473ff9 100644
--- a/bus/config-parser.c
+++ b/bus/config-parser.c
@@ -41,7 +41,8 @@ typedef enum
ELEMENT_DENY,
ELEMENT_FORK,
ELEMENT_SERVICEDIR,
- ELEMENT_INCLUDEDIR
+ ELEMENT_INCLUDEDIR,
+ ELEMENT_TYPE
} ElementType;
typedef struct
@@ -59,11 +60,6 @@ typedef struct
struct
{
- char *mechanism;
- } auth;
-
- struct
- {
char *context;
char *user;
char *group;
@@ -89,6 +85,8 @@ struct BusConfigParser
char *user; /**< user to run as */
+ char *bus_type; /**< Message bus type */
+
DBusList *listen_on; /**< List of addresses to listen to */
DBusList *mechanisms; /**< Auth mechanisms */
@@ -129,6 +127,8 @@ element_type_to_name (ElementType type)
return "servicedir";
case ELEMENT_INCLUDEDIR:
return "includedir";
+ case ELEMENT_TYPE:
+ return "type";
}
_dbus_assert_not_reached ("bad element type");
@@ -213,6 +213,13 @@ merge_included (BusConfigParser *parser,
included->user = NULL;
}
+ if (included->bus_type != NULL)
+ {
+ dbus_free (parser->bus_type);
+ parser->bus_type = included->bus_type;
+ included->bus_type = NULL;
+ }
+
if (included->fork)
parser->fork = TRUE;
@@ -276,7 +283,8 @@ bus_config_parser_unref (BusConfigParser *parser)
pop_element (parser);
dbus_free (parser->user);
-
+ dbus_free (parser->bus_type);
+
_dbus_list_foreach (&parser->listen_on,
(DBusForeachFunction) dbus_free,
NULL);
@@ -289,6 +297,12 @@ bus_config_parser_unref (BusConfigParser *parser)
_dbus_list_clear (&parser->service_dirs);
+ _dbus_list_foreach (&parser->mechanisms,
+ (DBusForeachFunction) dbus_free,
+ NULL);
+
+ _dbus_list_clear (&parser->mechanisms);
+
_dbus_string_free (&parser->basedir);
dbus_free (parser);
@@ -451,7 +465,20 @@ start_busconfig_child (BusConfigParser *parser,
if (push_element (parser, ELEMENT_USER) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+ else if (strcmp (element_name, "type") == 0)
+ {
+ if (!check_no_attributes (parser, "type", attribute_names, attribute_values, error))
+ return FALSE;
+
+ if (push_element (parser, ELEMENT_TYPE) == NULL)
+ {
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -464,7 +491,7 @@ start_busconfig_child (BusConfigParser *parser,
if (push_element (parser, ELEMENT_FORK) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -479,7 +506,7 @@ start_busconfig_child (BusConfigParser *parser,
if (push_element (parser, ELEMENT_LISTEN) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -492,7 +519,7 @@ start_busconfig_child (BusConfigParser *parser,
if (push_element (parser, ELEMENT_AUTH) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -505,7 +532,7 @@ start_busconfig_child (BusConfigParser *parser,
if (push_element (parser, ELEMENT_INCLUDEDIR) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -518,7 +545,7 @@ start_busconfig_child (BusConfigParser *parser,
if (push_element (parser, ELEMENT_SERVICEDIR) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -531,7 +558,7 @@ start_busconfig_child (BusConfigParser *parser,
if ((e = push_element (parser, ELEMENT_INCLUDE)) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -570,7 +597,7 @@ start_busconfig_child (BusConfigParser *parser,
if ((e = push_element (parser, ELEMENT_POLICY)) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -608,7 +635,7 @@ start_policy_child (BusConfigParser *parser,
{
if (push_element (parser, ELEMENT_ALLOW) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -618,7 +645,7 @@ start_policy_child (BusConfigParser *parser,
{
if (push_element (parser, ELEMENT_DENY) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -657,7 +684,7 @@ bus_config_parser_start_element (BusConfigParser *parser,
if (push_element (parser, ELEMENT_BUSCONFIG) == NULL)
{
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+ BUS_SET_OOM (error);
return FALSE;
}
@@ -725,7 +752,8 @@ bus_config_parser_end_element (BusConfigParser *parser,
* being paranoid about XML parsers
*/
dbus_set_error (error, DBUS_ERROR_FAILED,
- "XML element ended which was not the topmost element on the stack");
+ "XML element <%s> ended but topmost element on the stack was <%s>",
+ element_name, n);
return FALSE;
}
@@ -740,6 +768,7 @@ bus_config_parser_end_element (BusConfigParser *parser,
case ELEMENT_INCLUDE:
case ELEMENT_USER:
+ case ELEMENT_TYPE:
case ELEMENT_LISTEN:
case ELEMENT_AUTH:
case ELEMENT_SERVICEDIR:
@@ -1040,6 +1069,20 @@ bus_config_parser_content (BusConfigParser *parser,
}
break;
+ case ELEMENT_TYPE:
+ {
+ char *s;
+
+ e->had_content = TRUE;
+
+ if (!_dbus_string_copy_data (content, &s))
+ goto nomem;
+
+ dbus_free (parser->bus_type);
+ parser->bus_type = s;
+ }
+ break;
+
case ELEMENT_LISTEN:
{
char *s;
@@ -1149,6 +1192,12 @@ bus_config_parser_get_user (BusConfigParser *parser)
return parser->user;
}
+const char*
+bus_config_parser_get_type (BusConfigParser *parser)
+{
+ return parser->bus_type;
+}
+
DBusList**
bus_config_parser_get_addresses (BusConfigParser *parser)
{
diff --git a/bus/config-parser.h b/bus/config-parser.h
index 9b433f04..af5c8260 100644
--- a/bus/config-parser.h
+++ b/bus/config-parser.h
@@ -56,6 +56,7 @@ dbus_bool_t bus_config_parser_finished (BusConfigParser *parser,
/* Functions for extracting the parse results */
const char* bus_config_parser_get_user (BusConfigParser *parser);
+const char* bus_config_parser_get_type (BusConfigParser *parser);
DBusList** bus_config_parser_get_addresses (BusConfigParser *parser);
DBusList** bus_config_parser_get_mechanisms (BusConfigParser *parser);
dbus_bool_t bus_config_parser_get_fork (BusConfigParser *parser);
diff --git a/bus/session.conf.in b/bus/session.conf.in
index fe7aa5f0..28478955 100644
--- a/bus/session.conf.in
+++ b/bus/session.conf.in
@@ -5,6 +5,9 @@
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
+ <!-- Our well-known bus type, don't change this -->
+ <type>session</type>
+
<!-- FIXME - this is fairly complicated to fix.
Propose the following:
- add "unix:tmpdir=/tmp" which means unix domain transport
@@ -18,6 +21,7 @@
reads the address from there and sets the env variable
-->
<listen>unix:path=/tmp/foobar</listen>
+
<policy context="default">
<!-- Allow everything -->
<allow send="*"/>
diff --git a/bus/system.conf.in b/bus/system.conf.in
index 7752b576..15a4972e 100644
--- a/bus/system.conf.in
+++ b/bus/system.conf.in
@@ -11,6 +11,9 @@
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
+ <!-- Our well-known bus type, do not change this -->
+ <type>system</type>
+
<!-- Run as special user -->
<user>messagebus</user>