aboutsummaryrefslogtreecommitdiffstats
path: root/pbx/pbx_realtime.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-11-24 03:07:08 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-11-24 03:07:08 +0000
commit858a683291052dea2930137675ae812027bc16db (patch)
treebcd0e0ca1d561867119d44cfffd88075bea9671e /pbx/pbx_realtime.c
parent728e18f777e12ee91e1828805e6eabfb7c6b5dc3 (diff)
Make realtime pbx understand patterns.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4326 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx/pbx_realtime.c')
-rwxr-xr-xpbx/pbx_realtime.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 5a828f44a..52de08ba8 100755
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -13,6 +13,7 @@
#include <asterisk/logger.h>
#include <asterisk/channel.h>
#include <asterisk/config.h>
+#include <asterisk/config_pvt.h>
#include <asterisk/options.h>
#include <asterisk/pbx.h>
#include <asterisk/module.h>
@@ -34,9 +35,9 @@
#include <string.h>
#include <errno.h>
-#define MODE_MATCH 0
-#define MODE_MATCHMORE 1
-#define MODE_CANMATCH 2
+#define MODE_MATCH 0
+#define MODE_MATCHMORE 1
+#define MODE_CANMATCH 2
static char *tdesc = "Realtime Switch";
@@ -49,7 +50,7 @@ static char *tdesc = "Realtime Switch";
The realtime table should have entries for context,exten,priority,app,args
- The realtime table currently does not support patterns or callerid fields.
+ The realtime table currently does not support callerid fields.
*/
@@ -86,9 +87,12 @@ static char *tdesc = "Realtime Switch";
static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority, int mode)
{
struct ast_variable *var;
+ struct ast_config *cfg;
+ struct ast_category *cat;
char pri[20];
char *ematch;
char rexten[AST_MAX_EXTENSION + 20]="";
+ int match;
snprintf(pri, sizeof(pri), "%d", priority);
switch(mode) {
case MODE_MATCHMORE:
@@ -104,7 +108,33 @@ static struct ast_variable *realtime_switch_common(const char *table, const char
ematch = "exten";
strncpy(rexten, exten, sizeof(rexten) - 1);
}
- var = ast_load_realtime(table, "context", context, ematch, rexten, "priority", pri, NULL);
+ var = ast_load_realtime(table, ematch, rexten, "context", context, "priority", pri, NULL);
+ if (!var) {
+ cfg = ast_load_realtime_multientry(table, "exten RLIKE", "_.*", "context", context, "priority", pri, NULL);
+ if (cfg) {
+ cat = cfg->root;
+ while(cat) {
+ switch(mode) {
+ case MODE_MATCHMORE:
+ match = ast_extension_close(cat->name, exten, 1);
+ break;
+ case MODE_CANMATCH:
+ match = ast_extension_close(cat->name, exten, 0);
+ break;
+ case MODE_MATCH:
+ default:
+ match = ast_extension_match(cat->name, exten);
+ }
+ if (match) {
+ var = cat->root;
+ cat->root = NULL;
+ break;
+ }
+ cat = cat->next;
+ }
+ ast_destroy(cfg);
+ }
+ }
return var;
}