From eeb88949d8d2ca84d9cbe54c07e73b9907d3163e Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Thu, 3 Apr 2003 05:22:49 +0000 Subject: 2003-04-03 Havoc Pennington * 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 to specify well-known type * doc/dbus-specification.sgml: document the env variables to locate well-known buses and find service activator --- bus/activation.c | 10 +++++- bus/bus.c | 14 ++++++++- bus/bus.h | 1 + bus/config-parser.c | 87 +++++++++++++++++++++++++++++++++++++++++------------ bus/config-parser.h | 1 + bus/session.conf.in | 4 +++ bus/system.conf.in | 3 ++ 7 files changed, 99 insertions(+), 21 deletions(-) (limited to 'bus') 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 * 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 @@ -57,11 +58,6 @@ typedef struct unsigned int ignore_missing : 1; } include; - struct - { - char *mechanism; - } auth; - struct { char *context; @@ -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 @@ + + session + unix:path=/tmp/foobar + 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"> + + system + messagebus -- cgit