Newer
Older
/*
* Asterisk -- A telephony toolkit for Linux.
*
* Core PBX routines.
*
*
* Mark Spencer <markster@linux-support.net>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
*/
#include <asterisk/pbx.h>
#include <asterisk/channel.h>
#include <asterisk/options.h>
#include <asterisk/logger.h>
#include <asterisk/file.h>
#include <asterisk/config.h>
#include <asterisk/manager.h>
#include <asterisk/ast_expr.h>
#include <asterisk/channel_pvt.h>
#include <asterisk/linkedlists.h>
#include <asterisk/utils.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
/*
* I M P O R T A N T :
*
* The speed of extension handling will likely be among the most important
* aspects of this PBX. The switching scheme as it exists right now isn't
* terribly bad (it's O(N+M), where N is the # of extensions and M is the avg #
* of priorities, but a constant search time here would be great ;-)
*
*/
struct ast_context;
/* An extension */
struct ast_exten {
char exten[AST_MAX_EXTENSION];
int priority;
/* An extension */
struct ast_context *parent;
/* Application to execute */
char app[AST_MAX_EXTENSION];
/* Data to use */
void *data;
/* Data destructor */
void (*datad)(void *);
/* Extension with a greater ID */
struct ast_exten *next;
};
struct ast_include {
char name[AST_MAX_EXTENSION];
int hastime;
unsigned int monthmask;
unsigned int daymask;
unsigned int dowmask;
unsigned int minmask[24];
struct ast_sw {
char name[AST_MAX_EXTENSION];
char *registrar;
char data[AST_MAX_EXTENSION];
struct ast_sw *next;
};
struct ast_ignorepat {
char pattern[AST_MAX_EXTENSION];
char *registrar;
struct ast_ignorepat *next;
};
/* An extension context */
struct ast_context {
/* Name of the context */
char name[AST_MAX_EXTENSION];
/* A lock to prevent multiple threads from clobbering the context */
ast_mutex_t lock;
/* The root of the list of extensions */
struct ast_exten *root;
/* Link them together */
struct ast_context *next;
/* Include other contexts */
struct ast_include *includes;
/* Patterns for which to continue playing dialtone */
struct ast_ignorepat *ignorepats;
/* Alternative switches */
struct ast_sw *alts;
};
/* An application */
struct ast_app {
/* Name of the application */
char name[AST_MAX_APP];
int (*execute)(struct ast_channel *chan, void *data);
/* An extension state notify */
struct ast_state_cb {
int id;
void *data;
ast_state_cb_type callback;
struct ast_state_cb *next;
struct ast_hint {
struct ast_exten *exten;
int laststate;
struct ast_state_cb *callbacks;
struct ast_hint *next;
static int pbx_builtin_prefix(struct ast_channel *, void *);
static int pbx_builtin_suffix(struct ast_channel *, void *);
static int pbx_builtin_stripmsd(struct ast_channel *, void *);
static int pbx_builtin_answer(struct ast_channel *, void *);
static int pbx_builtin_goto(struct ast_channel *, void *);
static int pbx_builtin_hangup(struct ast_channel *, void *);
static int pbx_builtin_background(struct ast_channel *, void *);
static int pbx_builtin_dtimeout(struct ast_channel *, void *);
static int pbx_builtin_rtimeout(struct ast_channel *, void *);
static int pbx_builtin_atimeout(struct ast_channel *, void *);
static int pbx_builtin_wait(struct ast_channel *, void *);
static int pbx_builtin_waitexten(struct ast_channel *, void *);
static int pbx_builtin_setlanguage(struct ast_channel *, void *);
static int pbx_builtin_resetcdr(struct ast_channel *, void *);
Mark Spencer
committed
static int pbx_builtin_setaccount(struct ast_channel *, void *);
static int pbx_builtin_ringing(struct ast_channel *, void *);
static int pbx_builtin_congestion(struct ast_channel *, void *);
static int pbx_builtin_busy(struct ast_channel *, void *);
static int pbx_builtin_setglobalvar(struct ast_channel *, void *);
static int pbx_builtin_noop(struct ast_channel *, void *);
static int pbx_builtin_gotoif(struct ast_channel *, void *);
static int pbx_builtin_gotoiftime(struct ast_channel *, void *);
static int pbx_builtin_saynumber(struct ast_channel *, void *);
static int pbx_builtin_saydigits(struct ast_channel *, void *);
static int pbx_builtin_saycharacters(struct ast_channel *, void *);
static int pbx_builtin_sayphonetic(struct ast_channel *, void *);
Martin Pycko
committed
int pbx_builtin_setvar(struct ast_channel *, void *);
void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
static struct varshead globals = AST_LIST_HEAD_INITIALIZER(varshead);
static struct pbx_builtin {
char name[AST_MAX_APP];
int (*execute)(struct ast_channel *chan, void *data);
} builtins[] =
{
/* These applications are built into the PBX core and do not
Mark Spencer
committed
need separate modules
*/
{ "AbsoluteTimeout", pbx_builtin_atimeout,
"Set absolute maximum time of call",
" AbsoluteTimeout(seconds): Set the absolute maximum amount of time permitted\n"
"for a call. A setting of 0 disables the timeout. Always returns 0.\n" },
"Answer a channel if ringing",
" Answer(): If the channel is ringing, answer it, otherwise do nothing. \n"
Loading
Loading full blame...