diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index 6f5d13738f503ab7f21df12a35ff8e9ddc03f5d2..10a147b14b11ea2369ebd1d486b4228a4e0802fb 100644 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -141,6 +141,13 @@ static void *cleanup(void *unused) return NULL; } +static int extension_length_comparator(struct ast_category *p, struct ast_category *q) +{ + const char *extenp = S_OR(ast_variable_find(p, "exten"), ""); + const char *extenq = S_OR(ast_variable_find(q, "exten"), ""); + + return strlen(extenp) - strlen(extenq); +} /* Realtime switch looks up extensions in the supplied realtime table. @@ -191,6 +198,9 @@ static struct ast_variable *realtime_switch_common(const char *table, const char if (cfg) { char *cat = NULL; + /* Sort so that longer patterns are checked first */ + ast_config_sort_categories(cfg, 1, extension_length_comparator); + while ((cat = ast_category_browse(cfg, cat))) { const char *realtime_exten = ast_variable_retrieve(cfg, cat, "exten");