aco: Minimize use of regex.
authorCorey Farrell <git@cfware.com>
Tue, 12 Dec 2017 18:55:12 +0000 (13:55 -0500)
committerCorey Farrell <git@cfware.com>
Fri, 15 Dec 2017 15:14:31 +0000 (10:14 -0500)
Remove nearly all use of regex from ACO users.  Still remaining:
* app_confbridge has a legitamate use of option name regex.
* ast_sorcery_object_fields_register is implemented with regex, all
  callers use simple prefix based regex.  I haven't decided the best
  way to fix this in both 13/15 and master.

Change-Id: Ib5ed478218d8a661ace4d2eaaea98b59a897974b

18 files changed:
apps/app_agent_pool.c
apps/app_skel.c
apps/confbridge/conf_config_parser.c
channels/chan_motif.c
main/cdr.c
main/cel.c
main/features_config.c
main/named_acl.c
main/stasis.c
main/udptl.c
res/ari/config.c
res/res_hep.c
res/res_parking.c
res/res_pjsip_notify.c
res/res_resolver_unbound.c
res/res_statsd.c
res/res_xmpp.c
tests/test_config.c

index 6a8c395..3c2ea38 100644 (file)
@@ -455,11 +455,17 @@ struct agents_cfg {
        struct ao2_container *agents;
 };
 
+static const char *agent_type_blacklist[] = {
+       "general",
+       "agents",
+       NULL,
+};
+
 static struct aco_type agent_type = {
        .type = ACO_ITEM,
        .name = "agent-id",
-       .category_match = ACO_BLACKLIST,
-       .category = "^(general|agents)$",
+       .category_match = ACO_BLACKLIST_ARRAY,
+       .category = (const char *)agent_type_blacklist,
        .item_alloc = agent_cfg_alloc,
        .item_find = agent_cfg_find,
        .item_offset = offsetof(struct agents_cfg, agents),
@@ -471,8 +477,8 @@ static struct aco_type *agent_types[] = ACO_TYPES(&agent_type);
 static struct aco_type general_type = {
        .type = ACO_GLOBAL,
        .name = "global",
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 static struct aco_file agents_conf = {
index b3c8876..68f313f 100644 (file)
@@ -242,8 +242,8 @@ static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "globals",
        .item_offset = offsetof(struct skel_config, global),
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
@@ -253,18 +253,24 @@ static struct aco_type sound_option = {
        .type = ACO_GLOBAL,
        .name = "sounds",
        .item_offset = offsetof(struct skel_config, global),
-       .category_match = ACO_WHITELIST,
-       .category = "^sounds$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "sounds",
 };
 
 struct aco_type *sound_options[] = ACO_TYPES(&sound_option);
 
+static const char *level_categories[] = {
+       "general",
+       "sounds",
+       NULL,
+};
+
 /*! \brief An aco_type structure to link the everything but the "general" and "sounds" categories to the skel_level type */
 static struct aco_type level_option = {
        .type = ACO_ITEM,
        .name = "level",
-       .category_match = ACO_BLACKLIST,
-       .category = "^(general|sounds)$",
+       .category_match = ACO_BLACKLIST_ARRAY,
+       .category = (const char *)level_categories,
        .item_alloc = skel_level_alloc,
        .item_find = skel_level_find,
        .item_offset = offsetof(struct skel_config, levels),
index 6659305..99eea0a 100644 (file)
                                                regardless if this limit is reached or not.
                                        </para></description>
                                </configOption>
-                               <configOption name="^sound_">
+                               <configOption name="sound_">
                                        <synopsis>Override the various conference bridge sound files</synopsis>
                                        <description><para>
                                                All sounds in the conference are customizable using the bridge profile options below.
@@ -639,8 +639,8 @@ static void *bridge_profile_find(struct ao2_container *container, const char *ca
 static struct aco_type bridge_type = {
        .type = ACO_ITEM,
        .name = "bridge_profile",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .matchfield = "type",
        .matchvalue = "bridge",
        .item_alloc = bridge_profile_alloc,
@@ -676,8 +676,8 @@ static void *user_profile_find(struct ao2_container *container, const char *cate
 static struct aco_type user_type = {
        .type = ACO_ITEM,
        .name  = "user_profile",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .matchfield = "type",
        .matchvalue = "user",
        .item_alloc = user_profile_alloc,
@@ -707,8 +707,8 @@ static void *menu_find(struct ao2_container *container, const char *category)
 static struct aco_type menu_type = {
        .type = ACO_ITEM,
        .name = "menu",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .matchfield = "type",
        .matchvalue = "menu",
        .item_alloc = menu_alloc,
@@ -725,8 +725,8 @@ static struct aco_type *user_types[] = ACO_TYPES(&user_type);
 static struct aco_type general_type = {
        .type = ACO_GLOBAL,
        .name = "global",
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 static struct aco_file confbridge_conf = {
@@ -2235,7 +2235,7 @@ int conf_load_config(void)
        aco_option_register(&cfg_info, "record_command", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_command));
        aco_option_register(&cfg_info, "regcontext", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, regcontext));
        aco_option_register(&cfg_info, "language", ACO_EXACT, bridge_types, "en", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, language));
-       aco_option_register_custom(&cfg_info, "^sound_", ACO_REGEX, bridge_types, NULL, sound_option_handler, 0);
+       aco_option_register_custom(&cfg_info, "sound_", ACO_PREFIX, bridge_types, NULL, sound_option_handler, 0);
        aco_option_register(&cfg_info, "video_update_discard", ACO_EXACT, bridge_types, "2000", OPT_UINT_T, 0, FLDSET(struct bridge_profile, video_update_discard));
        /* This option should only be used with the CONFBRIDGE dialplan function */
        aco_option_register_custom(&cfg_info, "template", ACO_EXACT, bridge_types, NULL, bridge_template_handler, 0);
index 210cf36..6e8ce35 100644 (file)
@@ -541,8 +541,8 @@ static int jingle_endpoint_cmp(void *obj, void *arg, int flags)
 static struct aco_type endpoint_option = {
        .type = ACO_ITEM,
        .name = "endpoint",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .item_alloc = jingle_endpoint_alloc,
        .item_find = jingle_endpoint_find,
        .item_offset = offsetof(struct jingle_config, endpoints),
index 3681cdc..d7384f2 100644 (file)
@@ -238,8 +238,29 @@ static struct aco_type general_option = {
        .type = ACO_GLOBAL,
        .name = "general",
        .item_offset = offsetof(struct module_config, general),
-       .category = "^general$",
-       .category_match = ACO_WHITELIST,
+       .category = "general",
+       .category_match = ACO_WHITELIST_EXACT,
+};
+
+/*! Config sections used by existing modules. Do not add to this list. */
+static const char *ignore_categories[] = {
+       "csv",
+       "custom",
+       "manager",
+       "odbc",
+       "pgsql",
+       "radius",
+       "sqlite",
+       "tds",
+       "mysql",
+       NULL,
+};
+
+static struct aco_type ignore_option = {
+       .type = ACO_IGNORE,
+       .name = "modules",
+       .category = (const char*)ignore_categories,
+       .category_match = ACO_WHITELIST_ARRAY,
 };
 
 static void *module_config_alloc(void);
@@ -249,8 +270,7 @@ static void module_config_post_apply(void);
 /*! \brief The file definition */
 static struct aco_file module_file_conf = {
        .filename = "cdr.conf",
-       .skip_category = "(^csv$|^custom$|^manager$|^odbc$|^pgsql$|^radius$|^sqlite$|^tds$|^mysql$)",
-       .types = ACO_TYPES(&general_option),
+       .types = ACO_TYPES(&general_option, &ignore_option),
 };
 
 CONFIG_INFO_CORE("cdr", cfg_info, module_configs, module_config_alloc,
index faf4fde..cec0a85 100644 (file)
@@ -242,15 +242,28 @@ static struct aco_type general_option = {
        .type = ACO_GLOBAL,
        .name = "general",
        .item_offset = offsetof(struct cel_config, general),
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
+};
+
+/*! Config sections used by existing modules. Do not add to this list. */
+static const char *ignore_categories[] = {
+       "manager",
+       "radius",
+       NULL,
+};
+
+static struct aco_type ignore_option = {
+       .type = ACO_IGNORE,
+       .name = "modules",
+       .category = (const char*)ignore_categories,
+       .category_match = ACO_WHITELIST_ARRAY,
 };
 
 /*! \brief The config file to be processed for the module. */
 static struct aco_file cel_conf = {
        .filename = "cel.conf",                  /*!< The name of the config file */
-       .types = ACO_TYPES(&general_option),     /*!< The mapping object types to be processed */
-       .skip_category = "(^manager$|^radius$)", /*!< Config sections used by existing modules. Do not add to this list. */
+       .types = ACO_TYPES(&general_option, &ignore_option),     /*!< The mapping object types to be processed */
 };
 
 static int cel_pre_apply_config(void);
index 72cd040..a773f49 100644 (file)
                                        The <replaceable>DYNAMIC_FEATURES</replaceable> is a <literal>#</literal> separated list of
                                        either applicationmap item names or featuregroup names.</para>
                                </description>
-                               <configOption name="^.*$" regex="true">
+                               <configOption name="">
                                        <synopsis>A custom feature to invoke during a bridged call</synopsis>
                                        <description>
                                                <para>Each item listed here is a comma-separated list of parameters that determine
                                        DTMF sequence used to invoke an applicationmap item to be overridden with
                                        a different sequence.</para>
                                </description>
-                               <configOption name="^.*$" regex="true">
+                               <configOption name="">
                                        <synopsis>Applicationmap item to place in the feature group</synopsis>
                                        <description>
                                                <para>Each item here must be a name of an item in the applicationmap. The
@@ -578,24 +578,24 @@ struct features_config {
 static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "globals",
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
        .item_offset = offsetof(struct features_config, global),
 };
 
 static struct aco_type featuremap_option = {
        .type = ACO_GLOBAL,
        .name = "featuremap",
-       .category_match = ACO_WHITELIST,
-       .category = "^featuremap$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "featuremap",
        .item_offset = offsetof(struct features_config, featuremap),
 };
 
 static struct aco_type applicationmap_option = {
        .type = ACO_GLOBAL,
        .name = "applicationmap",
-       .category_match = ACO_WHITELIST,
-       .category = "^applicationmap$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "applicationmap",
        .item_offset = offsetof(struct features_config, applicationmap),
 };
 
@@ -1851,13 +1851,13 @@ static int load_config(void)
        aco_option_register_custom(&cfg_info, "automixmon", ACO_EXACT, featuremap_options,
                        DEFAULT_FEATUREMAP_AUTOMIXMON, featuremap_handler, 0);
 
-       aco_option_register_custom(&cfg_info, "^.*$", ACO_REGEX, applicationmap_options,
+       aco_option_register_custom(&cfg_info, "", ACO_PREFIX, applicationmap_options,
                        "", applicationmap_handler, 0);
 
-       aco_option_register_custom(&cfg_info, "^.*$", ACO_REGEX, featuregroup_options,
+       aco_option_register_custom(&cfg_info, "", ACO_PREFIX, featuregroup_options,
                        "", featuregroup_handler, 0);
 
-       aco_option_register_custom_nodoc(&cfg_info, "^.*$", ACO_REGEX, parkinglot_options,
+       aco_option_register_custom_nodoc(&cfg_info, "", ACO_PREFIX, parkinglot_options,
                        "", unsupported_handler, 0);
 
        if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
index 8b5aeda..393532a 100644 (file)
@@ -80,8 +80,8 @@ static void *named_acl_find(struct ao2_container *container, const char *cat);
 static struct aco_type named_acl_type = {
        .type = ACO_ITEM,                  /*!< named_acls are items stored in containers, not individual global objects */
        .name = "named_acl",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",           /*!< Match everything but "general" */
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",           /*!< Match everything but "general" */
        .item_alloc = named_acl_alloc,     /*!< A callback to allocate a new named_acl based on category */
        .item_find = named_acl_find,       /*!< A callback to find a named_acl in some container of named_acls */
        .item_offset = offsetof(struct named_acl_config, named_acl_list), /*!< Could leave this out since 0 */
index 186d88f..77bf340 100644 (file)
@@ -1434,8 +1434,8 @@ static struct aco_type threadpool_option = {
        .type = ACO_GLOBAL,
        .name = "threadpool",
        .item_offset = offsetof(struct stasis_config, threadpool_options),
-       .category = "^threadpool$",
-       .category_match = ACO_WHITELIST,
+       .category = "threadpool",
+       .category_match = ACO_WHITELIST_EXACT,
 };
 
 static struct aco_type *threadpool_options[] = ACO_TYPES(&threadpool_option);
@@ -1445,8 +1445,8 @@ static struct aco_type declined_option = {
        .type = ACO_GLOBAL,
        .name = "declined_message_types",
        .item_offset = offsetof(struct stasis_config, declined_message_types),
-       .category_match = ACO_WHITELIST,
-       .category = "^declined_message_types$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "declined_message_types",
 };
 
 struct aco_type *declined_options[] = ACO_TYPES(&declined_option);
index d982f6b..5a491e6 100644 (file)
@@ -237,9 +237,9 @@ static int udptl_pre_apply_config(void);
 static struct aco_type general_option = {
        .type = ACO_GLOBAL,
        .name = "global",
-       .category_match = ACO_WHITELIST,
+       .category_match = ACO_WHITELIST_EXACT,
        .item_offset = offsetof(struct udptl_config, general),
-       .category = "^general$",
+       .category = "general",
 };
 
 static struct aco_type *general_options[] = ACO_TYPES(&general_option);
index a080bb7..46d23c6 100644 (file)
@@ -39,8 +39,8 @@ static struct aco_type general_option = {
        .type = ACO_GLOBAL,
        .name = "general",
        .item_offset = offsetof(struct ast_ari_conf, general),
-       .category = "^general$",
-       .category_match = ACO_WHITELIST,
+       .category = "general",
+       .category_match = ACO_WHITELIST_EXACT,
 };
 
 static struct aco_type *general_options[] = ACO_TYPES(&general_option);
@@ -156,8 +156,8 @@ static void *user_find(struct ao2_container *tmp_container, const char *cat)
 static struct aco_type user_option = {
        .type = ACO_ITEM,
        .name = "user",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .matchfield = "type",
        .matchvalue = "user",
        .item_alloc = user_alloc,
index 25b4d13..48e7bbc 100644 (file)
@@ -258,8 +258,8 @@ static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "general",
        .item_offset = offsetof(struct module_config, general),
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
index 2dbe6f7..5d1b30c 100644 (file)
@@ -289,8 +289,8 @@ static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "globals",
        .item_offset = offsetof(struct parking_config, global),
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
@@ -298,8 +298,8 @@ struct aco_type *global_options[] = ACO_TYPES(&global_option);
 static struct aco_type parking_lot_type = {
        .type = ACO_ITEM,
        .name = "parking_lot",
-       .category_match = ACO_BLACKLIST,
-       .category = "^(general)$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .item_alloc = parking_lot_cfg_alloc,
        .item_find = named_item_find,
        .item_offset = offsetof(struct parking_config, parking_lots),
index 8de88c7..59b7c6e 100644 (file)
@@ -82,7 +82,7 @@
                                        order; any other header is treated as part of the SIP
                                        request.</para>
                                </description>
-                               <configOption name="^.*$">
+                               <configOption name="">
                                        <synopsis>A key/value pair to add to a NOTIFY request.</synopsis>
                                        <description>
                                                <para>If the key is <literal>Content</literal>,
@@ -234,8 +234,8 @@ static void *notify_cfg_alloc(void)
 static struct aco_type notify_option = {
        .type = ACO_ITEM,
        .name = "notify",
-       .category_match = ACO_BLACKLIST,
-       .category = "^general$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .item_offset = offsetof(struct notify_cfg, notify_options),
        .item_alloc = notify_option_alloc,
        .item_find = notify_option_find
@@ -993,7 +993,7 @@ static int load_module(void)
                return AST_MODULE_LOAD_DECLINE;
        }
 
-       aco_option_register_custom(&notify_cfg, "^.*$", ACO_REGEX, notify_options,
+       aco_option_register_custom(&notify_cfg, "", ACO_PREFIX, notify_options,
                                   "", notify_option_handler, 0);
 
        if (aco_process_config(&notify_cfg, 0)) {
index 3c78050..25f6150 100644 (file)
@@ -142,8 +142,8 @@ static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "general",
        .item_offset = offsetof(struct unbound_config, global),
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 static struct aco_type *global_options[] = ACO_TYPES(&global_option);
index aee0bcd..221b359 100644 (file)
@@ -231,8 +231,8 @@ static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "global",
        .item_offset = offsetof(struct conf, global),
-       .category = "^general$",
-       .category_match = ACO_WHITELIST
+       .category = "general",
+       .category_match = ACO_WHITELIST_EXACT,
 };
 
 static struct aco_type *global_options[] = ACO_TYPES(&global_option);
index f683557..b72581f 100644 (file)
@@ -820,8 +820,8 @@ static struct aco_type global_option = {
        .type = ACO_GLOBAL,
        .name = "global",
        .item_offset = offsetof(struct xmpp_config, global),
-       .category_match = ACO_WHITELIST,
-       .category = "^general$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "general",
 };
 
 struct aco_type *global_options[] = ACO_TYPES(&global_option);
@@ -829,8 +829,8 @@ struct aco_type *global_options[] = ACO_TYPES(&global_option);
 static struct aco_type client_option = {
        .type = ACO_ITEM,
        .name = "client",
-       .category_match = ACO_BLACKLIST,
-       .category = "^(general)$",
+       .category_match = ACO_BLACKLIST_EXACT,
+       .category = "general",
        .item_alloc = ast_xmpp_client_config_alloc,
        .item_find = xmpp_config_find,
        .item_prelink = xmpp_config_prelink,
index d74726a..de85f23 100644 (file)
@@ -1456,13 +1456,19 @@ static struct aco_type global = {
 static struct aco_type global_defaults = {
        .type = ACO_GLOBAL,
        .item_offset = offsetof(struct test_config, global_defaults),
-       .category_match = ACO_WHITELIST,
-       .category = "^global_defaults$",
+       .category_match = ACO_WHITELIST_EXACT,
+       .category = "global_defaults",
+};
+static const char *item_blacklist[] = {
+       "global",
+       "global_defaults",
+       NULL,
 };
+
 static struct aco_type item = {
        .type = ACO_ITEM,
-       .category_match = ACO_BLACKLIST,
-       .category = "^(global|global_defaults)$",
+       .category_match = ACO_BLACKLIST_ARRAY,
+       .category = (const char *)item_blacklist,
        .item_alloc = test_item_alloc,
        .item_find = test_item_find,
        .item_offset = offsetof(struct test_config, items),