[asterisk-commits] twilson: branch twilson/config_work r367837 - in /team/twilson/config_work: i...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue May 29 10:49:06 CDT 2012


Author: twilson
Date: Tue May 29 10:49:01 2012
New Revision: 367837

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=367837
Log:
Add the ability to match an option value via callback

For example, SIP entries users.conf can contain the hassip and
registersip options which need to be tested against ast_true() to be
able to determine whether the context should create a sip_peer or
sip_registry.

Modified:
    team/twilson/config_work/include/asterisk/config_options.h
    team/twilson/config_work/main/config_options.c

Modified: team/twilson/config_work/include/asterisk/config_options.h
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/include/asterisk/config_options.h?view=diff&rev=367837&r1=367836&r2=367837
==============================================================================
--- team/twilson/config_work/include/asterisk/config_options.h (original)
+++ team/twilson/config_work/include/asterisk/config_options.h Tue May 29 10:49:01 2012
@@ -95,6 +95,13 @@
  * \retval non-zero failure, stop processing
  */
 typedef int (*aco_type_prelink)(void *newitem);
+
+/*! \brief A function for determining whether the value for the matchfield in an aco_type is sufficient for a match
+ * \param text The value of the option
+ * \retval -1 The value is sufficient for a match
+ * \retval 0 The value is not sufficient for a match
+ */
+typedef int (*aco_matchvalue_func)(const char *text);
 
 /*! \struct aco_type
  * \brief Type information about a category-level configurable object
@@ -105,6 +112,7 @@
 	const char *category;   /*!< A regular expression for matching categories to be allowed or denied */
 	const char *matchfield; /*!< An option name to match for this type (i.e. a 'type'-like column) */
 	const char *matchvalue; /*!< The value of the option to require for matching (i.e. 'peer' for type= in sip.conf) */
+	aco_matchvalue_func matchfunc;       /*!< A function for determing whether the option value matches (i.e. hassip= requires ast_true()) */
 	enum aco_category_op category_match; /*!< Whether the following category regex is a whitelist or blacklist */
 	size_t item_offset;                  /*!< The offset in the config snapshot for the global config or item config container */
 

Modified: team/twilson/config_work/main/config_options.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/main/config_options.c?view=diff&rev=367837&r1=367836&r2=367837
==============================================================================
--- team/twilson/config_work/main/config_options.c (original)
+++ team/twilson/config_work/main/config_options.c Tue May 29 10:49:01 2012
@@ -249,12 +249,16 @@
 		}
 
 		/* Then, see if we need to match a particular field */
-		if (!ast_strlen_zero(match->matchfield) && !ast_strlen_zero(match->matchvalue)) {
+		if (!ast_strlen_zero(match->matchfield) && (!ast_strlen_zero(match->matchvalue) || match->matchfunc)) {
 			if (!(val = ast_variable_retrieve(cfg, category, match->matchfield))) {
 				ast_log(LOG_ERROR, "Required match field '%s' not found\n", match->matchfield);
 				return NULL;
 			}
-			if (strcasecmp(val, match->matchvalue)) {
+			if (match->matchfunc) {
+				if (!match->matchfunc(val)) {
+					continue;
+				}
+			} else if (strcasecmp(val, match->matchvalue)) {
 				continue;
 			}
 		}




More information about the asterisk-commits mailing list