Lines Matching full:parser
2 /* config-parser.c XML-library-agnostic configuration file parser
23 #include "config-parser.h"
99 * Parser for bus configuration file.
185 push_element (BusConfigParser *parser,
196 if (!_dbus_list_append (&parser->stack, e))
217 pop_element (BusConfigParser *parser)
221 e = _dbus_list_pop_last (&parser->stack);
227 peek_element (BusConfigParser *parser)
231 e = _dbus_list_get_last (&parser->stack);
237 top_element_type (BusConfigParser *parser)
241 e = _dbus_list_get_last (&parser->stack);
339 merge_included (BusConfigParser *parser,
345 if (!bus_policy_merge (parser->policy,
352 if (!merge_service_context_hash (parser->service_context_table,
361 dbus_free (parser->user);
362 parser->user = included->user;
368 dbus_free (parser->bus_type);
369 parser->bus_type = included->bus_type;
374 parser->fork = TRUE;
378 dbus_free (parser->pidfile);
379 parser->pidfile = included->pidfile;
384 _dbus_list_append_link (&parser->listen_on, link);
387 _dbus_list_append_link (&parser->mechanisms, link);
390 service_dirs_append_link_unique_or_free (&parser->service_dirs, link);
393 _dbus_list_append_link (&parser->conf_dirs, link);
399 seen_include (BusConfigParser *parser,
404 iter = parser->included_files;
410 iter = _dbus_list_get_next_link (&parser->included_files, iter);
421 BusConfigParser *parser;
423 parser = dbus_new0 (BusConfigParser, 1);
424 if (parser == NULL)
427 parser->is_toplevel = !!is_toplevel;
429 if (!_dbus_string_init (&parser->basedir))
431 dbus_free (parser);
435 if (((parser->policy = bus_policy_new ()) == NULL) ||
436 !_dbus_string_copy (basedir, 0, &parser->basedir, 0) ||
437 ((parser->service_context_table = _dbus_hash_table_new (DBUS_HASH_STRING,
441 if (parser->policy)
442 bus_policy_unref (parser->policy);
444 _dbus_string_free (&parser->basedir);
446 dbus_free (parser);
452 /* Initialize the parser's limits from the parent. */
453 parser->limits = parent->limits;
457 parser->included_files = parent->included_files;
463 parser->limits.max_incoming_bytes = _DBUS_ONE_MEGABYTE * 63;
464 parser->limits.max_outgoing_bytes = _DBUS_ONE_MEGABYTE * 63;
465 parser->limits.max_message_size = _DBUS_ONE_MEGABYTE * 32;
471 parser->limits.activation_timeout = 25000; /* 25 seconds */
477 parser->limits.auth_timeout = 30000; /* 30 seconds */
479 parser->limits.max_incomplete_connections = 32;
480 parser->limits.max_connections_per_user = 128;
486 parser->limits.max_completed_connections = 1024;
488 parser->limits.max_pending_activations = 256;
489 parser->limits.max_services_per_connection = 256;
491 parser->limits.max_match_rules_per_connection = 512;
493 parser->limits.reply_timeout = 5 * 60 * 1000; /* 5 minutes */
494 parser->limits.max_replies_per_connection = 32;
497 parser->refcount = 1;
499 return parser;
503 bus_config_parser_ref (BusConfigParser *parser)
505 _dbus_assert (parser->refcount > 0);
507 parser->refcount += 1;
509 return parser;
513 bus_config_parser_unref (BusConfigParser *parser)
515 _dbus_assert (parser->refcount > 0);
517 parser->refcount -= 1;
519 if (parser->refcount == 0)
521 while (parser->stack != NULL)
522 pop_element (parser);
524 dbus_free (parser->user);
525 dbus_free (parser->bus_type);
526 dbus_free (parser->pidfile);
528 _dbus_list_foreach (&parser->listen_on,
532 _dbus_list_clear (&parser->listen_on);
534 _dbus_list_foreach (&parser->service_dirs,
538 _dbus_list_clear (&parser->service_dirs);
540 _dbus_list_foreach (&parser->conf_dirs,
544 _dbus_list_clear (&parser->conf_dirs);
546 _dbus_list_foreach (&parser->mechanisms,
550 _dbus_list_clear (&parser->mechanisms);
552 _dbus_string_free (&parser->basedir);
554 if (parser->policy)
555 bus_policy_unref (parser->policy);
557 if (parser->service_context_table)
558 _dbus_hash_table_unref (parser->service_context_table);
560 dbus_free (parser);
565 bus_config_parser_check_doctype (BusConfigParser *parser,
590 locate_attributes (BusConfigParser *parser,
689 check_no_attributes (BusConfigParser *parser,
707 start_busconfig_child (BusConfigParser *parser,
715 if (!check_no_attributes (parser, "user", attribute_names, attribute_values, error))
718 if (push_element (parser, ELEMENT_USER) == NULL)
728 if (!check_no_attributes (parser, "type", attribute_names, attribute_values, error))
731 if (push_element (parser, ELEMENT_TYPE) == NULL)
741 if (!check_no_attributes (parser, "fork", attribute_names, attribute_values, error))
744 if (push_element (parser, ELEMENT_FORK) == NULL)
750 parser->fork = TRUE;
756 if (!check_no_attributes (parser, "pidfile", attribute_names, attribute_values, error))
759 if (push_element (parser, ELEMENT_PIDFILE) == NULL)
769 if (!check_no_attributes (parser, "listen", attribute_names, attribute_values, error))
772 if (push_element (parser, ELEMENT_LISTEN) == NULL)
782 if (!check_no_attributes (parser, "auth", attribute_names, attribute_values, error))
785 if (push_element (parser, ELEMENT_AUTH) == NULL)
795 if (!check_no_attributes (parser, "includedir", attribute_names, attribute_values, error))
798 if (push_element (parser, ELEMENT_INCLUDEDIR) == NULL)
812 if (!check_no_attributes (parser, "standard_session_servicedirs", attribute_names, attribute_values, error))
815 if (push_element (parser, ELEMENT_STANDARD_SESSION_SERVICEDIRS) == NULL)
828 service_dirs_append_link_unique_or_free (&parser->service_dirs, link);
834 if (!check_no_attributes (parser, "servicedir", attribute_names, attribute_values, error))
837 if (push_element (parser, ELEMENT_SERVICEDIR) == NULL)
852 if ((e = push_element (parser, ELEMENT_INCLUDE)) == NULL)
862 if (!locate_attributes (parser, "include",
926 if ((e = push_element (parser, ELEMENT_POLICY)) == NULL)
934 if (!locate_attributes (parser, "policy",
1030 if ((e = push_element (parser, ELEMENT_LIMIT)) == NULL)
1036 if (!locate_attributes (parser, "limit",
1062 if (!check_no_attributes (parser, "selinux", attribute_names, attribute_values, error))
1065 if (push_element (parser, ELEMENT_SELINUX) == NULL)
1083 append_rule_from_element (BusConfigParser *parser,
1111 if (!locate_attributes (parser, element_name,
1515 pe = peek_element (parser);
1526 if (!bus_policy_append_default_rule (parser->policy, rule))
1530 if (!bus_policy_append_mandatory_rule (parser->policy, rule))
1542 if (!bus_policy_append_user_rule (parser->policy, pe->d.policy.gid_uid_or_at_console,
1555 if (!bus_policy_append_group_rule (parser->policy, pe->d.policy.gid_uid_or_at_console,
1562 if (!bus_policy_append_console_rule (parser->policy, pe->d.policy.gid_uid_or_at_console,
1583 start_policy_child (BusConfigParser *parser,
1591 if (!append_rule_from_element (parser, element_name,
1596 if (push_element (parser, ELEMENT_ALLOW) == NULL)
1606 if (!append_rule_from_element (parser, element_name,
1611 if (push_element (parser, ELEMENT_DENY) == NULL)
1629 start_selinux_child (BusConfigParser *parser,
1646 if (!locate_attributes (parser, "associate",
1655 if (push_element (parser, ELEMENT_ASSOCIATE) == NULL)
1675 if (!_dbus_hash_table_insert_string (parser->service_context_table,
1701 bus_config_parser_start_element (BusConfigParser *parser,
1713 t = top_element_type (parser);
1719 if (!check_no_attributes (parser, "busconfig", attribute_names, attribute_values, error))
1722 if (push_element (parser, ELEMENT_BUSCONFIG) == NULL)
1740 return start_busconfig_child (parser, element_name,
1746 return start_policy_child (parser, element_name,
1752 return start_selinux_child (parser, element_name,
1766 set_limit (BusConfigParser *parser,
1780 parser->limits.max_incoming_bytes = value;
1785 parser->limits.max_outgoing_bytes = value;
1790 parser->limits.max_message_size = value;
1796 parser->limits.activation_timeout = value;
1802 parser->limits.auth_timeout = value;
1808 parser->limits.reply_timeout = value;
1814 parser->limits.max_completed_connections = value;
1820 parser->limits.max_incomplete_connections = value;
1826 parser->limits.max_connections_per_user = value;
1832 parser->limits.max_pending_activations = value;
1838 parser->limits.max_services_per_connection = value;
1844 parser->limits.max_match_rules_per_connection = value;
1850 parser->limits.max_replies_per_connection = value;
1881 bus_config_parser_end_element (BusConfigParser *parser,
1893 t = top_element_type (parser);
1901 "XML parser ended element with no element on the stack");
1918 e = peek_element (parser);
1946 if (!set_limit (parser, e->d.limit.name, e->d.limit.value,
1963 pop_element (parser);
2000 include_file (BusConfigParser *parser,
2018 if (seen_include (parser, filename))
2026 if (! _dbus_list_append (&parser->included_files, (void *) filename_str))
2032 /* Since parser is passed in as the parent, included
2033 inherits parser's limits. */
2034 included = bus_config_load (filename, FALSE, parser, &tmp_error);
2036 _dbus_list_pop_last (&parser->included_files);
2058 if (!merge_included (parser, included, error))
2064 /* Copy included's limits back to parser. */
2065 parser->limits = included->limits;
2073 include_dir (BusConfigParser *parser,
2123 if (!include_file (parser, &full_path, TRUE, error))
2146 if (!_dbus_list_append (&parser->conf_dirs, s))
2165 bus_config_parser_content (BusConfigParser *parser,
2183 e = peek_element (parser);
2196 switch (top_element_type (parser))
2216 element_type_to_name (top_element_type (parser)));
2229 dbus_free (parser->pidfile);
2230 parser->pidfile = s;
2264 else if (!make_full_path (&parser->basedir, content, &full_path))
2270 if (!include_file (parser, &full_path,
2290 if (!make_full_path (&parser->basedir, content, &full_path))
2296 if (!include_dir (parser, &full_path, error))
2315 dbus_free (parser->user);
2316 parser->user = s;
2329 dbus_free (parser->bus_type);
2330 parser->bus_type = s;
2343 if (!_dbus_list_append (&parser->listen_on,
2361 if (!_dbus_list_append (&parser->mechanisms,
2380 if (!make_full_path (&parser->basedir, content, &full_path))
2392 if (!service_dirs_append_unique_or_free (&parser->service_dirs, s))
2436 bus_config_parser_finished (BusConfigParser *parser,
2441 if (parser->stack != NULL)
2445 element_type_to_name (top_element_type (parser)));
2450 if (parser->is_toplevel && parser->listen_on == NULL)
2461 bus_config_parser_get_user (BusConfigParser *parser)
2463 return parser->user;
2467 bus_config_parser_get_type (BusConfigParser *parser)
2469 return parser->bus_type;
2473 bus_config_parser_get_addresses (BusConfigParser *parser)
2475 return &parser->listen_on;
2479 bus_config_parser_get_mechanisms (BusConfigParser *parser)
2481 return &parser->mechanisms;
2485 bus_config_parser_get_service_dirs (BusConfigParser *parser)
2487 return &parser->service_dirs;
2491 bus_config_parser_get_conf_dirs (BusConfigParser *parser)
2493 return &parser->conf_dirs;
2497 bus_config_parser_get_fork (BusConfigParser *parser)
2499 return parser->fork;
2503 bus_config_parser_get_pidfile (BusConfigParser *parser)
2505 return parser->pidfile;
2509 bus_config_parser_steal_policy (BusConfigParser *parser)
2513 _dbus_assert (parser->policy != NULL); /* can only steal the policy 1 time */
2515 policy = parser->policy;
2517 parser->policy = NULL;
2524 bus_config_parser_get_limits (BusConfigParser *parser,
2527 *limits = parser->limits;
2531 bus_config_parser_steal_service_context_table (BusConfigParser *parser)
2535 _dbus_assert (parser->service_context_table != NULL); /* can only steal once */
2537 table = parser->service_context_table;
2539 parser->service_context_table = NULL;
2559 BusConfigParser *parser;
2564 parser = bus_config_load (full_path, TRUE, NULL, &error);
2565 if (parser == NULL)
2594 bus_config_parser_unref (parser);
2901 BusConfigParser *parser;
2908 parser = NULL;
2951 parser = bus_config_load (&full_path, TRUE, NULL, &error);
2953 if (parser == NULL)
2965 first_parser = parser;
2970 equal = config_parsers_equal (first_parser, parser);
2971 bus_config_parser_unref (parser);