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().