Realtime PBX Module. More...
#include "asterisk.h"#include "asterisk/file.h"#include "asterisk/logger.h"#include "asterisk/channel.h"#include "asterisk/config.h"#include "asterisk/pbx.h"#include "asterisk/module.h"#include "asterisk/frame.h"#include "asterisk/term.h"#include "asterisk/manager.h"#include "asterisk/cli.h"#include "asterisk/lock.h"#include "asterisk/md5.h"#include "asterisk/linkedlists.h"#include "asterisk/chanvars.h"#include "asterisk/sched.h"#include "asterisk/io.h"#include "asterisk/utils.h"#include "asterisk/crypto.h"#include "asterisk/astdb.h"#include "asterisk/app.h"
Go to the source code of this file.
Defines | |
| #define | EXT_DATA_SIZE 256 |
| #define | MODE_CANMATCH 2 |
| #define | MODE_MATCH 0 |
| #define | MODE_MATCHMORE 1 |
Enumerations | |
| enum | { OPTION_PATTERNS_DISABLED = (1 << 0) } |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | load_module (void) |
| static int | realtime_canmatch (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data) |
| static struct ast_variable * | realtime_common (const char *context, const char *exten, int priority, const char *data, int mode) |
| static int | realtime_exec (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data) |
| static int | realtime_exists (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data) |
| static int | realtime_matchmore (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data) |
| static struct ast_variable * | realtime_switch_common (const char *table, const char *context, const char *exten, int priority, int mode, struct ast_flags flags) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Switch" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| enum { ... } | option_flags |
| static struct ast_switch | realtime_switch |
| static struct ast_app_option | switch_opts [128] = { [ 'p' ] = { .flag = OPTION_PATTERNS_DISABLED },} |
Realtime PBX Module.
Definition in file pbx_realtime.c.
| #define EXT_DATA_SIZE 256 |
Definition at line 55 of file pbx_realtime.c.
Referenced by realtime_exec().
| #define MODE_CANMATCH 2 |
Definition at line 53 of file pbx_realtime.c.
Referenced by realtime_canmatch(), and realtime_switch_common().
| #define MODE_MATCH 0 |
Definition at line 51 of file pbx_realtime.c.
Referenced by realtime_exec(), realtime_exists(), and realtime_switch_common().
| #define MODE_MATCHMORE 1 |
Definition at line 52 of file pbx_realtime.c.
Referenced by realtime_matchmore(), and realtime_switch_common().
| anonymous enum |
Definition at line 57 of file pbx_realtime.c.
{
OPTION_PATTERNS_DISABLED = (1 << 0),
} option_flags;
| static void __reg_module | ( | void | ) | [static] |
Definition at line 296 of file pbx_realtime.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 296 of file pbx_realtime.c.
| static int load_module | ( | void | ) | [static] |
Definition at line 289 of file pbx_realtime.c.
References AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, and ast_register_switch().
{
if (ast_register_switch(&realtime_switch))
return AST_MODULE_LOAD_FAILURE;
return AST_MODULE_LOAD_SUCCESS;
}
| static int realtime_canmatch | ( | struct ast_channel * | chan, |
| const char * | context, | ||
| const char * | exten, | ||
| int | priority, | ||
| const char * | callerid, | ||
| const char * | data | ||
| ) | [static] |
Definition at line 176 of file pbx_realtime.c.
References ast_variables_destroy(), MODE_CANMATCH, realtime_common(), and var.
{
struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_CANMATCH);
if (var) {
ast_variables_destroy(var);
return 1;
}
return 0;
}
| static struct ast_variable* realtime_common | ( | const char * | context, |
| const char * | exten, | ||
| int | priority, | ||
| const char * | data, | ||
| int | mode | ||
| ) | [static, read] |
Definition at line 138 of file pbx_realtime.c.
References ast_app_parse_options(), ast_strdupa, ast_strlen_zero(), buf, realtime_switch_common(), S_OR, switch_opts, table, and var.
Referenced by realtime_canmatch(), realtime_exec(), realtime_exists(), and realtime_matchmore().
{
const char *ctx = NULL;
char *table;
struct ast_variable *var=NULL;
struct ast_flags flags = { 0, };
char *buf = ast_strdupa(data);
if (buf) {
/* "Realtime" prefix is stripped off in the parent engine. The
* remaining string is: [[context@]table][/opts] */
char *opts = strchr(buf, '/');
if (opts)
*opts++ = '\0';
table = strchr(buf, '@');
if (table) {
*table++ = '\0';
ctx = buf;
}
ctx = S_OR(ctx, context);
table = S_OR(table, "extensions");
if (!ast_strlen_zero(opts)) {
ast_app_parse_options(switch_opts, &flags, NULL, opts);
}
var = realtime_switch_common(table, ctx, exten, priority, mode, flags);
}
return var;
}
| static int realtime_exec | ( | struct ast_channel * | chan, |
| const char * | context, | ||
| const char * | exten, | ||
| int | priority, | ||
| const char * | callerid, | ||
| const char * | data | ||
| ) | [static] |
Definition at line 186 of file pbx_realtime.c.
References app, ast_compat_pbx_realtime, ast_log(), ast_strdupa, ast_strlen_zero(), ast_variables_destroy(), ast_verb, COLOR_BRCYAN, COLOR_BRMAGENTA, ast_channel::context, EVENT_FLAG_DIALPLAN, EXT_DATA_SIZE, ast_channel::exten, LOG_NOTICE, LOG_WARNING, manager_event, MODE_MATCH, ast_channel::name, ast_variable::name, ast_variable::next, pbx_exec(), pbx_findapp(), pbx_substitute_variables_helper(), ast_channel::priority, realtime_common(), S_OR, term_color(), ast_channel::uniqueid, ast_variable::value, and var.
{
int res = -1;
struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCH);
if (var) {
char *tmp="";
char *app = NULL;
struct ast_variable *v;
for (v = var; v ; v = v->next) {
if (!strcasecmp(v->name, "app"))
app = ast_strdupa(v->value);
else if (!strcasecmp(v->name, "appdata")) {
if (ast_compat_pbx_realtime) {
char *ptr;
int in = 0;
tmp = alloca(strlen(v->value) * 2 + 1);
for (ptr = tmp; *v->value; v->value++) {
if (*v->value == ',') {
*ptr++ = '\\';
*ptr++ = ',';
} else if (*v->value == '|' && !in) {
*ptr++ = ',';
} else {
*ptr++ = *v->value;
}
/* Don't escape '|', meaning 'or', inside expressions ($[ ]) */
if (v->value[0] == '[' && v->value[-1] == '$') {
in++;
} else if (v->value[0] == ']' && in) {
in--;
}
}
*ptr = '\0';
} else {
tmp = ast_strdupa(v->value);
}
}
}
ast_variables_destroy(var);
if (!ast_strlen_zero(app)) {
struct ast_app *a = pbx_findapp(app);
if (a) {
char appdata[512];
char tmp1[80];
char tmp2[80];
char tmp3[EXT_DATA_SIZE];
appdata[0] = 0; /* just in case the substitute var func isn't called */
if(!ast_strlen_zero(tmp))
pbx_substitute_variables_helper(chan, tmp, appdata, sizeof(appdata) - 1);
ast_verb(3, "Executing %s(\"%s\", \"%s\")\n",
term_color(tmp1, app, COLOR_BRCYAN, 0, sizeof(tmp1)),
term_color(tmp2, chan->name, COLOR_BRMAGENTA, 0, sizeof(tmp2)),
term_color(tmp3, S_OR(appdata, ""), COLOR_BRMAGENTA, 0, sizeof(tmp3)));
manager_event(EVENT_FLAG_DIALPLAN, "Newexten",
"Channel: %s\r\n"
"Context: %s\r\n"
"Extension: %s\r\n"
"Priority: %d\r\n"
"Application: %s\r\n"
"AppData: %s\r\n"
"Uniqueid: %s\r\n",
chan->name, chan->context, chan->exten, chan->priority, app, !ast_strlen_zero(appdata) ? appdata : "(NULL)", chan->uniqueid);
res = pbx_exec(chan, a, appdata);
} else
ast_log(LOG_NOTICE, "No such application '%s' for extension '%s' in context '%s'\n", app, exten, context);
} else {
ast_log(LOG_WARNING, "No application specified for realtime extension '%s' in context '%s'\n", exten, context);
}
}
return res;
}
| static int realtime_exists | ( | struct ast_channel * | chan, |
| const char * | context, | ||
| const char * | exten, | ||
| int | priority, | ||
| const char * | callerid, | ||
| const char * | data | ||
| ) | [static] |
Definition at line 166 of file pbx_realtime.c.
References ast_variables_destroy(), MODE_MATCH, realtime_common(), and var.
{
struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCH);
if (var) {
ast_variables_destroy(var);
return 1;
}
return 0;
}
| static int realtime_matchmore | ( | struct ast_channel * | chan, |
| const char * | context, | ||
| const char * | exten, | ||
| int | priority, | ||
| const char * | callerid, | ||
| const char * | data | ||
| ) | [static] |
Definition at line 263 of file pbx_realtime.c.
References ast_variables_destroy(), MODE_MATCHMORE, realtime_common(), and var.
{
struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCHMORE);
if (var) {
ast_variables_destroy(var);
return 1;
}
return 0;
}
| static struct ast_variable* realtime_switch_common | ( | const char * | table, |
| const char * | context, | ||
| const char * | exten, | ||
| int | priority, | ||
| int | mode, | ||
| struct ast_flags | flags | ||
| ) | [static, read] |
Definition at line 79 of file pbx_realtime.c.
References ast_category_browse(), ast_category_detach_variables(), ast_category_get(), ast_config_destroy(), ast_copy_string(), ast_extension_close(), ast_extension_match(), ast_load_realtime(), ast_load_realtime_multientry(), AST_MAX_EXTENSION, ast_test_flag, match(), MODE_CANMATCH, MODE_MATCH, MODE_MATCHMORE, OPTION_PATTERNS_DISABLED, SENTINEL, and var.
Referenced by realtime_common().
{
struct ast_variable *var;
struct ast_config *cfg;
char pri[20];
char *ematch;
char rexten[AST_MAX_EXTENSION + 20]="";
int match;
/* Optimization: since we don't support hints in realtime, it's silly to
* query for a hint here, since we won't actually do anything with it.
* This just wastes CPU time and resources. */
if (priority < 0) {
return NULL;
}
snprintf(pri, sizeof(pri), "%d", priority);
switch(mode) {
case MODE_MATCHMORE:
ematch = "exten LIKE";
snprintf(rexten, sizeof(rexten), "%s_%%", exten);
break;
case MODE_CANMATCH:
ematch = "exten LIKE";
snprintf(rexten, sizeof(rexten), "%s%%", exten);
break;
case MODE_MATCH:
default:
ematch = "exten";
ast_copy_string(rexten, exten, sizeof(rexten));
}
var = ast_load_realtime(table, ematch, rexten, "context", context, "priority", pri, SENTINEL);
if (!var && !ast_test_flag(&flags, OPTION_PATTERNS_DISABLED)) {
cfg = ast_load_realtime_multientry(table, "exten LIKE", "\\_%", "context", context, "priority", pri, SENTINEL);
if (cfg) {
char *cat = ast_category_browse(cfg, NULL);
while(cat) {
switch(mode) {
case MODE_MATCHMORE:
match = ast_extension_close(cat, exten, 1);
break;
case MODE_CANMATCH:
match = ast_extension_close(cat, exten, 0);
break;
case MODE_MATCH:
default:
match = ast_extension_match(cat, exten);
}
if (match) {
var = ast_category_detach_variables(ast_category_get(cfg, cat));
break;
}
cat = ast_category_browse(cfg, cat);
}
ast_config_destroy(cfg);
}
}
return var;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 283 of file pbx_realtime.c.
References ast_unregister_switch().
{
ast_unregister_switch(&realtime_switch);
return 0;
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Switch" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 296 of file pbx_realtime.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 296 of file pbx_realtime.c.
| enum { ... } option_flags |
struct ast_switch realtime_switch [static] |
Definition at line 273 of file pbx_realtime.c.
struct ast_app_option switch_opts[128] = { [ 'p' ] = { .flag = OPTION_PATTERNS_DISABLED },} [static] |
Definition at line 63 of file pbx_realtime.c.
Referenced by realtime_common().