Skip to content
Snippets Groups Projects
pbx.c 125 KiB
Newer Older
Mark Spencer's avatar
Mark Spencer committed
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * Core PBX routines.
 * 
Mark Spencer's avatar
Mark Spencer committed
 * Copyright (C) 1999, Mark Spencer
Mark Spencer's avatar
Mark Spencer committed
 *
 * Mark Spencer <markster@linux-support.net>
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */

Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/lock.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/cli.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/pbx.h>
#include <asterisk/channel.h>
#include <asterisk/options.h>
#include <asterisk/logger.h>
#include <asterisk/file.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/callerid.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/cdr.h>
#include <asterisk/config.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/term.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/manager.h>
#include <asterisk/ast_expr.h>
#include <asterisk/channel_pvt.h>
#include <asterisk/linkedlists.h>
Mark Spencer's avatar
Mark Spencer committed
#include <asterisk/say.h>
#include <asterisk/utils.h>
Mark Spencer's avatar
Mark Spencer committed
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>
#include <ctype.h>
Mark Spencer's avatar
Mark Spencer committed
#include <errno.h>
#include <time.h>
#include <sys/time.h>
Mark Spencer's avatar
Mark Spencer committed
#include "asterisk.h"
Mark Spencer's avatar
Mark Spencer committed

/*
 * 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];
Mark Spencer's avatar
Mark Spencer committed
	int matchcid;
	char cidmatch[AST_MAX_EXTENSION];
Mark Spencer's avatar
Mark Spencer committed
	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 *);
Mark Spencer's avatar
Mark Spencer committed
	/* Next higher priority with our extension */
Mark Spencer's avatar
Mark Spencer committed
	struct ast_exten *peer;
Mark Spencer's avatar
Mark Spencer committed
	/* Registrar */
	char *registrar;
Mark Spencer's avatar
Mark Spencer committed
	/* Extension with a greater ID */
	struct ast_exten *next;
};

Mark Spencer's avatar
Mark Spencer committed
struct ast_include {
	char name[AST_MAX_EXTENSION];
Mark Spencer's avatar
Mark Spencer committed
	char rname[AST_MAX_EXTENSION];
Mark Spencer's avatar
Mark Spencer committed
	char *registrar;
Mark Spencer's avatar
Mark Spencer committed
	int hastime;
	unsigned int monthmask;
	unsigned int daymask;
	unsigned int dowmask;
	unsigned int minmask[24];
Mark Spencer's avatar
Mark Spencer committed
	struct ast_include *next;
};

Mark Spencer's avatar
Mark Spencer committed
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;
};

Mark Spencer's avatar
Mark Spencer committed
/* 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 */
Mark Spencer's avatar
Mark Spencer committed
	/* The root of the list of extensions */
	struct ast_exten *root;
	/* Link them together */
	struct ast_context *next;
Mark Spencer's avatar
Mark Spencer committed
	/* Include other contexts */
	struct ast_include *includes;
Mark Spencer's avatar
Mark Spencer committed
	/* Patterns for which to continue playing dialtone */
	struct ast_ignorepat *ignorepats;
Mark Spencer's avatar
Mark Spencer committed
	/* Registrar */
	char *registrar;
Mark Spencer's avatar
Mark Spencer committed
	/* Alternative switches */
	struct ast_sw *alts;
Mark Spencer's avatar
Mark Spencer committed
};


/* An application */
struct ast_app {
	/* Name of the application */
	char name[AST_MAX_APP];
	int (*execute)(struct ast_channel *chan, void *data);
Mark Spencer's avatar
Mark Spencer committed
	char *synopsis;
	char *description;
Mark Spencer's avatar
Mark Spencer committed
	struct ast_app *next;
};

/* An extension state notify */
    ast_state_cb_type callback;
    struct ast_state_cb *next;
    struct ast_exten *exten;
    int laststate; 
    struct ast_state_cb *callbacks;
    struct ast_hint *next;
Mark Spencer's avatar
Mark Spencer committed
static int pbx_builtin_prefix(struct ast_channel *, void *);
static int pbx_builtin_suffix(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
static int pbx_builtin_stripmsd(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
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 *);
Mark Spencer's avatar
Mark Spencer committed
static int pbx_builtin_atimeout(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
static int pbx_builtin_wait(struct ast_channel *, void *);
static int pbx_builtin_waitexten(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
static int pbx_builtin_setlanguage(struct ast_channel *, void *);
static int pbx_builtin_resetcdr(struct ast_channel *, void *);
static int pbx_builtin_setaccount(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
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 *);
Mark Spencer's avatar
Mark Spencer committed
static int pbx_builtin_gotoif(struct ast_channel *, void *);
static int pbx_builtin_gotoiftime(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
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 *);
int pbx_builtin_setvar(struct ast_channel *, void *);
Mark Spencer's avatar
Mark Spencer committed
void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
Mark Spencer's avatar
Mark Spencer committed
char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
static struct varshead globals = AST_LIST_HEAD_INITIALIZER(varshead);
Mark Spencer's avatar
Mark Spencer committed

static struct pbx_builtin {
	char name[AST_MAX_APP];
	int (*execute)(struct ast_channel *chan, void *data);
Mark Spencer's avatar
Mark Spencer committed
	char *synopsis;
	char *description;
Mark Spencer's avatar
Mark Spencer committed
} builtins[] = 
{
	/* These applications are built into the PBX core and do not
	   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" },

Mark Spencer's avatar
Mark Spencer committed
	{ "Answer", pbx_builtin_answer, 
Mark Spencer's avatar
Mark Spencer committed
"Answer a channel if ringing", 
"  Answer(): If the channel is ringing, answer it, otherwise do nothing. \n"
Loading
Loading full blame...