diff options
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | bus/bus.c | 2 | ||||
-rw-r--r-- | bus/config-loader-expat.c | 9 | ||||
-rw-r--r-- | bus/config-loader-libxml.c | 29 | ||||
-rw-r--r-- | bus/config-parser.c | 435 | ||||
-rw-r--r-- | bus/config-parser.h | 13 | ||||
-rw-r--r-- | test/data/equiv-config-files/basic/basic-1.conf | 25 | ||||
-rw-r--r-- | test/data/equiv-config-files/basic/basic-2.conf | 5 | ||||
-rw-r--r-- | test/data/equiv-config-files/basic/basic.d/basic.conf | 13 | ||||
-rw-r--r-- | test/data/equiv-config-files/entities/basic.d/basic.conf | 13 | ||||
-rw-r--r-- | test/data/equiv-config-files/entities/entities-1.conf | 14 | ||||
-rw-r--r-- | test/data/equiv-config-files/entities/entities-2.conf | 5 |
12 files changed, 533 insertions, 58 deletions
@@ -1,3 +1,31 @@ +2004-04-09 Jon Trowbridge <trow@ximian.com> + + * bus/config-parser.c (bus_config_parser_new): Added a 'parent' + argument. If non-null, the newly-constructed BusConfigParser will + be initialized with the parent's BusLimits instead of the default + values. + (include_file): When including a config file, pass in + the current parser as the parent and then copy the BusLimits + from the included BusConfigParser pack to the current parser. + (process_test_valid_subdir): Renamed from process_test_subdir. + (process_test_equiv_subdir): Added. Walks through a directory, + descending into each subdirectory and loading the config files + it finds there. If any subdirectory contains two config files + that don't produce identical BusConfigParser structs, fail. + For now, the BusConfigParser's BusPolicies are not compared. + (bus_config_parser_test): Call both process_test_valid_subdir and + process_test_equiv_subdir. + + * bus/config-loader-libxml.c (bus_config_load): Take a parent + argument and pass it along to the call to bus_config_parser_new. + Also made a few small changes to allow this code to compile. + + * bus/config-loader-expat.c (bus_config_load): Take a parent + argument and pass it along to the call to bus_config_parser_new. + + * bus/bus.c (bus_context_new): Load the config file + with a NULL parent argument. + 2004-03-29 Michael Meeks <michael@ximian.com> * glib/dbus-gobject.c (set_object_property): split out / @@ -283,7 +283,7 @@ bus_context_new (const DBusString *config_file, context = NULL; auth_mechanisms = NULL; - parser = bus_config_load (config_file, TRUE, error); + parser = bus_config_load (config_file, TRUE, NULL, error); if (parser == NULL) goto failed; diff --git a/bus/config-loader-expat.c b/bus/config-loader-expat.c index 15fbdd15..ed973ac1 100644 --- a/bus/config-loader-expat.c +++ b/bus/config-loader-expat.c @@ -163,9 +163,10 @@ expat_CharacterDataHandler (void *userData, BusConfigParser* -bus_config_load (const DBusString *file, - dbus_bool_t is_toplevel, - DBusError *error) +bus_config_load (const DBusString *file, + dbus_bool_t is_toplevel, + const BusConfigParser *parent, + DBusError *error) { XML_Parser expat; const char *filename; @@ -208,7 +209,7 @@ bus_config_load (const DBusString *file, goto failed; } - parser = bus_config_parser_new (&dirname, is_toplevel); + parser = bus_config_parser_new (&dirname, is_toplevel, parent); if (parser == NULL) { dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); diff --git a/bus/config-loader-libxml.c b/bus/config-loader-libxml.c index 4e0ebe8b..054acc6e 100644 --- a/bus/config-loader-libxml.c +++ b/bus/config-loader-libxml.c @@ -71,18 +71,22 @@ xml_text_reader_error (void *arg, } BusConfigParser* -bus_config_load (const DBusString *file, - DBusError *error) +bus_config_load (const DBusString *file, + dbus_bool_t is_toplevel, + const BusConfigParser *parent, + DBusError *error) + { xmlTextReader *reader; const char *filename; BusConfigParser *parser; + DBusString dirname; DBusError tmp_error; int ret; _DBUS_ASSERT_ERROR_IS_CLEAR (error); - _dbus_string_get_const_data (file, &filename); + filename = _dbus_string_get_const_data (file); parser = NULL; reader = NULL; dbus_error_init (&tmp_error); @@ -100,12 +104,24 @@ bus_config_load (const DBusString *file, "xmlMemSetup() didn't work for some reason\n"); return NULL; } + + if (!_dbus_string_init (&dirname)) + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + return NULL; + } + + if (!_dbus_string_get_dirname (file, &dirname)) + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + goto failed; + } - parser = bus_config_parser_new (); + parser = bus_config_parser_new (&dirname, is_toplevel, parent); if (parser == NULL) { dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); - return NULL; + goto failed; } errno = 0; @@ -163,12 +179,13 @@ bus_config_load (const DBusString *file, if (!bus_config_parser_finished (parser, error)) goto failed; - + _dbus_string_free (&dirname); _DBUS_ASSERT_ERROR_IS_CLEAR (error); return parser; failed: _DBUS_ASSERT_ERROR_IS_SET (error); + _dbus_string_free (&dirname); if (parser) bus_config_parser_unref (parser); _dbus_assert (reader == NULL); /* must go to reader_out first */ diff --git a/bus/config-parser.c b/bus/config-parser.c index a4e266f2..19afe8e7 100644 --- a/bus/config-parser.c +++ b/bus/config-parser.c @@ -278,8 +278,9 @@ merge_included (BusConfigParser *parser, } BusConfigParser* -bus_config_parser_new (const DBusString *basedir, - dbus_bool_t is_toplevel) +bus_config_parser_new (const DBusString *basedir, + dbus_bool_t is_toplevel, + const BusConfigParser *parent) { BusConfigParser *parser; @@ -306,42 +307,51 @@ bus_config_parser_new (const DBusString *basedir, return NULL; } - /* Make up some numbers! woot! */ - parser->limits.max_incoming_bytes = _DBUS_ONE_MEGABYTE * 63; - parser->limits.max_outgoing_bytes = _DBUS_ONE_MEGABYTE * 63; - parser->limits.max_message_size = _DBUS_ONE_MEGABYTE * 32; - - /* Making this long means the user has to wait longer for an error - * message if something screws up, but making it too short means - * they might see a false failure. - */ - parser->limits.activation_timeout = 25000; /* 25 seconds */ - - /* Making this long risks making a DOS attack easier, but too short - * and legitimate auth will fail. If interactive auth (ask user for - * password) is allowed, then potentially it has to be quite long. - */ - parser->limits.auth_timeout = 30000; /* 30 seconds */ - - parser->limits.max_incomplete_connections = 32; - parser->limits.max_connections_per_user = 128; - - /* Note that max_completed_connections / max_connections_per_user - * is the number of users that would have to work together to - * DOS all the other users. - */ - parser->limits.max_completed_connections = 1024; - - parser->limits.max_pending_activations = 256; - parser->limits.max_services_per_connection = 256; + if (parent != NULL) + { + /* Initialize the parser's limits from the parent. */ + parser->limits = parent->limits; + } + else + { - parser->limits.max_match_rules_per_connection = 128; + /* Make up some numbers! woot! */ + parser->limits.max_incoming_bytes = _DBUS_ONE_MEGABYTE * 63; + parser->limits.max_outgoing_bytes = _DBUS_ONE_MEGABYTE * 63; + parser->limits.max_message_size = _DBUS_ONE_MEGABYTE * 32; + + /* Making this long means the user has to wait longer for an error + * message if something screws up, but making it too short means + * they might see a false failure. + */ + parser->limits.activation_timeout = 25000; /* 25 seconds */ - parser->limits.reply_timeout = 5 * 60 * 1000; /* 5 minutes */ - parser->limits.max_replies_per_connection = 32; - + /* Making this long risks making a DOS attack easier, but too short + * and legitimate auth will fail. If interactive auth (ask user for + * password) is allowed, then potentially it has to be quite long. + */ + parser->limits.auth_timeout = 30000; /* 30 seconds */ + + parser->limits.max_incomplete_connections = 32; + parser->limits.max_connections_per_user = 128; + + /* Note that max_completed_connections / max_connections_per_user + * is the number of users that would have to work together to + * DOS all the other users. + */ + parser->limits.max_completed_connections = 1024; + + parser->limits.max_pending_activations = 256; + parser->limits.max_services_per_connection = 256; + + parser->limits.max_match_rules_per_connection = 128; + + parser->limits.reply_timeout = 5 * 60 * 1000; /* 5 minutes */ + parser->limits.max_replies_per_connection = 32; + } + parser->refcount = 1; - + return parser; } @@ -1628,7 +1638,11 @@ include_file (BusConfigParser *parser, DBusError tmp_error; dbus_error_init (&tmp_error); - included = bus_config_load (filename, FALSE, &tmp_error); + + /* Since parser is passed in as the parent, included + inherits parser's limits. */ + included = bus_config_load (filename, FALSE, parser, &tmp_error); + if (included == NULL) { _DBUS_ASSERT_ERROR_IS_SET (&tmp_error); @@ -1655,6 +1669,9 @@ include_file (BusConfigParser *parser, return FALSE; } + /* Copy included's limits back to parser. */ + parser->limits = included->limits; + bus_config_parser_unref (included); return TRUE; } @@ -2093,7 +2110,7 @@ do_load (const DBusString *full_path, dbus_error_init (&error); - parser = bus_config_load (full_path, TRUE, &error); + parser = bus_config_load (full_path, TRUE, NULL, &error); if (parser == NULL) { _DBUS_ASSERT_ERROR_IS_SET (&error); @@ -2150,9 +2167,9 @@ check_loader_oom_func (void *data) } static dbus_bool_t -process_test_subdir (const DBusString *test_base_dir, - const char *subdir, - Validity validity) +process_test_valid_subdir (const DBusString *test_base_dir, + const char *subdir, + Validity validity) { DBusString test_directory; DBusString filename; @@ -2211,7 +2228,7 @@ process_test_subdir (const DBusString *test_base_dir, { _dbus_verbose ("Skipping non-.conf file %s\n", _dbus_string_get_const_data (&filename)); - _dbus_string_free (&full_path); + _dbus_string_free (&full_path); goto next; } @@ -2251,6 +2268,337 @@ process_test_subdir (const DBusString *test_base_dir, return retval; } +static dbus_bool_t +bools_equal (dbus_bool_t a, + dbus_bool_t b) +{ + return a ? b : !b; +} + +static dbus_bool_t +strings_equal_or_both_null (const char *a, + const char *b) +{ + if (a == NULL || b == NULL) + return a == b; + else + return !strcmp (a, b); +} + +static dbus_bool_t +elements_equal (const Element *a, + const Element *b) +{ + if (a->type != b->type) + return FALSE; + + if (!bools_equal (a->had_content, b->had_content)) + return FALSE; + + switch (a->type) + { + + case ELEMENT_INCLUDE: + if (!bools_equal (a->d.include.ignore_missing, + b->d.include.ignore_missing)) + return FALSE; + break; + + case ELEMENT_POLICY: + if (a->d.policy.type != b->d.policy.type) + return FALSE; + if (a->d.policy.gid_or_uid != b->d.policy.gid_or_uid) + return FALSE; + break; + + case ELEMENT_LIMIT: + if (strcmp (a->d.limit.name, b->d.limit.name)) + return FALSE; + if (a->d.limit.value != b->d.limit.value) + return FALSE; + break; + + default: + /* do nothing */ + break; + } + + return TRUE; + +} + +static dbus_bool_t +lists_of_elements_equal (DBusList *a, + DBusList *b) +{ + DBusList *ia; + DBusList *ib; + + ia = a; + ib = b; + + while (ia != NULL && ib != NULL) + { + if (elements_equal (ia->data, ib->data)) + return FALSE; + ia = _dbus_list_get_next_link (&a, ia); + ib = _dbus_list_get_next_link (&b, ib); + } + + return ia == NULL && ib == NULL; +} + +static dbus_bool_t +lists_of_c_strings_equal (DBusList *a, + DBusList *b) +{ + DBusList *ia; + DBusList *ib; + + ia = a; + ib = b; + + while (ia != NULL && ib != NULL) + { + if (strcmp (ia->data, ib->data)) + return FALSE; + ia = _dbus_list_get_next_link (&a, ia); + ib = _dbus_list_get_next_link (&b, ib); + } + + return ia == NULL && ib == NULL; +} + +static dbus_bool_t +limits_equal (const BusLimits *a, + const BusLimits *b) +{ + return + (a->max_incoming_bytes == b->max_incoming_bytes + || a->max_outgoing_bytes == b->max_outgoing_bytes + || a->max_message_size == b->max_message_size + || a->activation_timeout == b->activation_timeout + || a->auth_timeout == b->auth_timeout + || a->max_completed_connections == b->max_completed_connections + || a->max_incomplete_connections == b->max_incomplete_connections + || a->max_connections_per_user == b->max_connections_per_user + || a->max_pending_activations == b->max_pending_activations + || a->max_services_per_connection == b->max_services_per_connection + || a->max_match_rules_per_connection == b->max_match_rules_per_connection + || a->max_replies_per_connection == b->max_replies_per_connection + || a->reply_timeout == b->reply_timeout); +} + +static dbus_bool_t +config_parsers_equal (const BusConfigParser *a, + const BusConfigParser *b) +{ + if (!_dbus_string_equal (&a->basedir, &b->basedir)) + return FALSE; + + if (!lists_of_elements_equal (a->stack, b->stack)) + return FALSE; + + if (!strings_equal_or_both_null (a->user, b->user)) + return FALSE; + + if (!lists_of_c_strings_equal (a->listen_on, b->listen_on)) + return FALSE; + + if (!lists_of_c_strings_equal (a->mechanisms, b->mechanisms)) + return FALSE; + + if (!lists_of_c_strings_equal (a->service_dirs, b->service_dirs)) + return FALSE; + + /* FIXME: compare policy */ + + if (! limits_equal (&a->limits, &b->limits)) + return FALSE; + + if (!strings_equal_or_both_null (a->pidfile, b->pidfile)) + return FALSE; + + if (! bools_equal (a->fork, b->fork)) + return FALSE; + + if (! bools_equal (a->is_toplevel, b->is_toplevel)) + return FALSE; + + return TRUE; +} + +static dbus_bool_t +all_are_equiv (const DBusString *target_directory) +{ + DBusString filename; + DBusDirIter *dir; + BusConfigParser *first_parser; + BusConfigParser *parser; + DBusError error; + dbus_bool_t equal; + dbus_bool_t retval; + + dir = NULL; + first_parser = NULL; + parser = NULL; + retval = FALSE; + + if (!_dbus_string_init (&filename)) + _dbus_assert_not_reached ("didn't allocate filename string"); + + dbus_error_init (&error); + dir = _dbus_directory_open (target_directory, &error); + if (dir == NULL) + { + _dbus_warn ("Could not open %s: %s\n", + _dbus_string_get_const_data (target_directory), + error.message); + dbus_error_free (&error); + goto finished; + } + + printf ("Comparing:\n"); + + next: + while (_dbus_directory_get_next_file (dir, &filename, &error)) + { + DBusString full_path; + + if (!_dbus_string_init (&full_path)) + _dbus_assert_not_reached ("couldn't init string"); + + if (!_dbus_string_copy (target_directory, 0, &full_path, 0)) + _dbus_assert_not_reached ("couldn't copy dir to full_path"); + + if (!_dbus_concat_dir_and_file (&full_path, &filename)) + _dbus_assert_not_reached ("couldn't concat file to dir"); + + if (!_dbus_string_ends_with_c_str (&full_path, ".conf")) + { + _dbus_verbose ("Skipping non-.conf file %s\n", + _dbus_string_get_const_data (&filename)); + _dbus_string_free (&full_path); + goto next; + } + + printf (" %s\n", _dbus_string_get_const_data (&filename)); + + parser = bus_config_load (&full_path, TRUE, NULL, &error); + _dbus_string_free (&full_path); + + if (parser == NULL) + { + _dbus_warn ("Could not load file %s: %s\n", + _dbus_string_get_const_data (&full_path), + error.message); + dbus_error_free (&error); + goto finished; + } + else if (first_parser == NULL) + { + first_parser = parser; + } + else + { + equal = config_parsers_equal (first_parser, parser); + bus_config_parser_unref (parser); + if (! equal) + goto finished; + } + + } + + retval = TRUE; + + finished: + _dbus_string_free (&filename); + if (first_parser) + bus_config_parser_unref (first_parser); + if (dir) + _dbus_directory_close (dir); + + return retval; + +} + +static dbus_bool_t +process_test_equiv_subdir (const DBusString *test_base_dir, + const char *subdir) +{ + DBusString test_directory; + DBusString filename; + DBusDirIter *dir; + DBusError error; + dbus_bool_t equal; + dbus_bool_t retval; + + dir = NULL; + retval = FALSE; + + if (!_dbus_string_init (&test_directory)) + _dbus_assert_not_reached ("didn't allocate test_directory"); + + _dbus_string_init_const (&filename, subdir); + + if (!_dbus_string_copy (test_base_dir, 0, + &test_directory, 0)) + _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory"); + + if (!_dbus_concat_dir_and_file (&test_directory, &filename)) + _dbus_assert_not_reached ("couldn't allocate full path"); + + _dbus_string_free (&filename); + if (!_dbus_string_init (&filename)) + _dbus_assert_not_reached ("didn't allocate filename string"); + + dbus_error_init (&error); + dir = _dbus_directory_open (&test_directory, &error); + if (dir == NULL) + { + _dbus_warn ("Could not open %s: %s\n", + _dbus_string_get_const_data (&test_directory), + error.message); + dbus_error_free (&error); + goto finished; + } + + while (_dbus_directory_get_next_file (dir, &filename, &error)) + { + DBusString full_path; + + /* Skip CVS's magic directories! */ + if (_dbus_string_equal_c_str (&filename, "CVS")) + continue; + + if (!_dbus_string_init (&full_path)) + _dbus_assert_not_reached ("couldn't init string"); + + if (!_dbus_string_copy (&test_directory, 0, &full_path, 0)) + _dbus_assert_not_reached ("couldn't copy dir to full_path"); + + if (!_dbus_concat_dir_and_file (&full_path, &filename)) + _dbus_assert_not_reached ("couldn't concat file to dir"); + + equal = all_are_equiv (&full_path); + _dbus_string_free (&full_path); + + if (!equal) + goto finished; + } + + retval = TRUE; + + finished: + _dbus_string_free (&test_directory); + _dbus_string_free (&filename); + if (dir) + _dbus_directory_close (dir); + + return retval; + +} + dbus_bool_t bus_config_parser_test (const DBusString *test_data_dir) { @@ -2261,7 +2609,10 @@ bus_config_parser_test (const DBusString *test_data_dir) return TRUE; } - if (!process_test_subdir (test_data_dir, "valid-config-files", VALID)) + if (!process_test_valid_subdir (test_data_dir, "valid-config-files", VALID)) + return FALSE; + + if (!process_test_equiv_subdir (test_data_dir, "equiv-config-files")) return FALSE; return TRUE; diff --git a/bus/config-parser.h b/bus/config-parser.h index 028ec430..a48eda19 100644 --- a/bus/config-parser.h +++ b/bus/config-parser.h @@ -35,8 +35,10 @@ typedef struct BusConfigParser BusConfigParser; -BusConfigParser* bus_config_parser_new (const DBusString *basedir, - dbus_bool_t is_toplevel); +BusConfigParser* bus_config_parser_new (const DBusString *basedir, + dbus_bool_t is_toplevel, + const BusConfigParser *parent); + BusConfigParser* bus_config_parser_ref (BusConfigParser *parser); void bus_config_parser_unref (BusConfigParser *parser); dbus_bool_t bus_config_parser_check_doctype (BusConfigParser *parser, @@ -71,9 +73,10 @@ void bus_config_parser_get_limits (BusConfigParser *parser, /* Loader functions (backended off one of the XML parsers). Returns a * finished ConfigParser. */ -BusConfigParser* bus_config_load (const DBusString *file, - dbus_bool_t is_toplevel, - DBusError *error); +BusConfigParser* bus_config_load (const DBusString *file, + dbus_bool_t is_toplevel, + const BusConfigParser *parent, + DBusError *error); #endif /* BUS_CONFIG_PARSER_H */ diff --git a/test/data/equiv-config-files/basic/basic-1.conf b/test/data/equiv-config-files/basic/basic-1.conf new file mode 100644 index 00000000..4500ad70 --- /dev/null +++ b/test/data/equiv-config-files/basic/basic-1.conf @@ -0,0 +1,25 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <user>mybususer</user> + <listen>unix:path=/foo/bar</listen> + <listen>tcp:port=1234</listen> + <includedir>basic.d</includedir> + <servicedir>/usr/share/foo</servicedir> + <include ignore_missing="yes">nonexistent.conf</include> + <policy context="default"> + <allow user="*"/> + </policy> + + <limit name="max_incoming_bytes">5000</limit> + <limit name="max_outgoing_bytes">5000</limit> + <limit name="max_message_size">300</limit> + <limit name="activation_timeout">5000</limit> + <limit name="auth_timeout">6000</limit> + <limit name="max_completed_connections">50</limit> + <limit name="max_incomplete_connections">80</limit> + <limit name="max_connections_per_user">64</limit> + <limit name="max_pending_activations">64</limit> + <limit name="max_services_per_connection">256</limit> + +</busconfig> diff --git a/test/data/equiv-config-files/basic/basic-2.conf b/test/data/equiv-config-files/basic/basic-2.conf new file mode 100644 index 00000000..49e707e8 --- /dev/null +++ b/test/data/equiv-config-files/basic/basic-2.conf @@ -0,0 +1,5 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> +<include>basic-1.conf</include> +</busconfig>
\ No newline at end of file diff --git a/test/data/equiv-config-files/basic/basic.d/basic.conf b/test/data/equiv-config-files/basic/basic.d/basic.conf new file mode 100644 index 00000000..d109d71d --- /dev/null +++ b/test/data/equiv-config-files/basic/basic.d/basic.conf @@ -0,0 +1,13 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <user>mybususer</user> + <listen>unix:path=/foo/bar</listen> + <listen>tcp:port=1234</listen> + <includedir>basic.d</includedir> + <servicedir>/usr/share/foo</servicedir> + <include ignore_missing="yes">nonexistent.conf</include> + <policy context="default"> + <allow user="*"/> + </policy> +</busconfig> diff --git a/test/data/equiv-config-files/entities/basic.d/basic.conf b/test/data/equiv-config-files/entities/basic.d/basic.conf new file mode 100644 index 00000000..d109d71d --- /dev/null +++ b/test/data/equiv-config-files/entities/basic.d/basic.conf @@ -0,0 +1,13 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <user>mybususer</user> + <listen>unix:path=/foo/bar</listen> + <listen>tcp:port=1234</listen> + <includedir>basic.d</includedir> + <servicedir>/usr/share/foo</servicedir> + <include ignore_missing="yes">nonexistent.conf</include> + <policy context="default"> + <allow user="*"/> + </policy> +</busconfig> diff --git a/test/data/equiv-config-files/entities/entities-1.conf b/test/data/equiv-config-files/entities/entities-1.conf new file mode 100644 index 00000000..3d3cea79 --- /dev/null +++ b/test/data/equiv-config-files/entities/entities-1.conf @@ -0,0 +1,14 @@ +<!-- This config file contains XML entities --> +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <user>mybususer</user> + <listen>unix:path=/foo/<bar></listen> + <listen>tcp:port=1234</listen> + <includedir>basic.d</includedir> + <servicedir>/usr/&share/foo</servicedir> + <include ignore_missing="yes">nonexistent.confn</include> + <policy context="default"> + <allow user="*"/> + </policy> +</busconfig> diff --git a/test/data/equiv-config-files/entities/entities-2.conf b/test/data/equiv-config-files/entities/entities-2.conf new file mode 100644 index 00000000..9ffabeae --- /dev/null +++ b/test/data/equiv-config-files/entities/entities-2.conf @@ -0,0 +1,5 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> +<include>entities-1.conf</include> +</busconfig>
\ No newline at end of file |