diff options
author | Sean Bright <sean.bright@gmail.com> | 2017-11-09 09:21:38 -0500 |
---|---|---|
committer | Sean Bright <sean.bright@gmail.com> | 2017-11-13 15:08:50 -0500 |
commit | cf062303e35e4baa0dc2aa3dfb68b2c25b1ed2c2 (patch) | |
tree | ef53d0517a09247cd97c4d9ee70c294a5a607ae8 /res/res_sorcery_config.c | |
parent | b1743cb3c75a943a8a9cb55a3e4355f0133156fe (diff) |
sorcery: Add ast_sorcery_retrieve_by_prefix()
Some consumers of the sorcery API use ast_sorcery_retrieve_by_regex
only so that they can anchor the potential match as a prefix and not
because they truly need regular expressions.
Rather than using regular expressions for simple prefix lookups, add
a new operation - ast_sorcery_retrieve_by_prefix - that does them.
Patches against 13 and 15 have a compatibility layer needed to
maintain ABI that is not needed in master.
Change-Id: I56f4e20ba1154bd52281f995c27a429a854f6a79
Diffstat (limited to 'res/res_sorcery_config.c')
-rw-r--r-- | res/res_sorcery_config.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/res/res_sorcery_config.c b/res/res_sorcery_config.c index 7fd7e769a..b02000eab 100644 --- a/res/res_sorcery_config.c +++ b/res/res_sorcery_config.c @@ -73,6 +73,12 @@ struct sorcery_config_fields_cmp_params { /*! \brief Regular expression for checking object id */ regex_t *regex; + /*! \brief Prefix for matching object id */ + const char *prefix; + + /*! \brief Prefix length in bytes for matching object id */ + const size_t prefix_len; + /*! \brief Optional container to put object into */ struct ao2_container *container; }; @@ -85,6 +91,7 @@ static void *sorcery_config_retrieve_fields(const struct ast_sorcery *sorcery, v static void sorcery_config_retrieve_multiple(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const struct ast_variable *fields); static void sorcery_config_retrieve_regex(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *regex); +static void sorcery_config_retrieve_prefix(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *prefix, const size_t prefix_len); static void sorcery_config_close(void *data); static struct ast_sorcery_wizard config_object_wizard = { @@ -96,6 +103,7 @@ static struct ast_sorcery_wizard config_object_wizard = { .retrieve_fields = sorcery_config_retrieve_fields, .retrieve_multiple = sorcery_config_retrieve_multiple, .retrieve_regex = sorcery_config_retrieve_regex, + .retrieve_prefix = sorcery_config_retrieve_prefix, .close = sorcery_config_close, }; @@ -120,6 +128,11 @@ static int sorcery_config_fields_cmp(void *obj, void *arg, int flags) ao2_link(params->container, obj); } return 0; + } else if (params->prefix) { + if (!strncmp(params->prefix, ast_sorcery_object_get_id(obj), params->prefix_len)) { + ao2_link(params->container, obj); + } + return 0; } else if (params->fields && (!(objset = ast_sorcery_objectset_create(params->sorcery, obj)) || (!ast_variable_lists_match(objset, params->fields, 0)))) { @@ -208,6 +221,24 @@ static void sorcery_config_retrieve_regex(const struct ast_sorcery *sorcery, voi regfree(&expression); } +static void sorcery_config_retrieve_prefix(const struct ast_sorcery *sorcery, void *data, const char *type, struct ao2_container *objects, const char *prefix, const size_t prefix_len) +{ + struct sorcery_config *config = data; + RAII_VAR(struct ao2_container *, config_objects, ao2_global_obj_ref(config->objects), ao2_cleanup); + struct sorcery_config_fields_cmp_params params = { + .sorcery = sorcery, + .container = objects, + .prefix = prefix, + .prefix_len = prefix_len, + }; + + if (!config_objects) { + return; + } + + ao2_callback(config_objects, OBJ_NODATA | OBJ_MULTIPLE, sorcery_config_fields_cmp, ¶ms); +} + /*! \brief Internal function which determines if criteria has been met for considering an object set applicable */ static int sorcery_is_criteria_met(struct ast_variable *objset, struct ast_variable *criteria) { |