102static const char config[] = 
"extensions.conf";
 
  142        e->
command = 
"dialplan remove context";
 
  144            "Usage: dialplan remove context <context>\n" 
  145            "       Removes all extensions from a specified context.\n";
 
  156        ast_cli(
a->fd, 
"There is no such context as '%s'\n", 
a->argv[3]);
 
  159        ast_cli(
a->fd, 
"Removed context '%s'\n", 
a->argv[3]);
 
 
  170        e->
command = 
"dialplan remove include";
 
  172            "Usage: dialplan remove include <context> from <context>\n" 
  173            "       Remove an included context from another context.\n";
 
  179    if (
a->argc != 6 || strcmp(
a->argv[4], 
"from"))
 
  183        ast_cli(
a->fd, 
"We are not including '%s' into '%s' now\n",
 
  184            a->argv[3], 
a->argv[5]);
 
  188    ast_cli(
a->fd, 
"Failed to remove '%s' include from '%s' context\n",
 
  189        a->argv[3], 
a->argv[5]);
 
 
  245    for (;n && *p; p++) {
 
  246        if (isblank(*p)  && !in_blank) {
 
  249        } 
else if ( in_blank) {
 
 
  265static int split_ec(
const char *src, 
char **
ext, 
char ** 
const ctx, 
char ** 
const cid)
 
  279        if (strchr(
c, 
'@')) { 
 
  284    if (cid && (i = strchr(e, 
'/'))) {
 
 
  299    int len = strlen(
a->word); 
 
  318                int already_served = 0;
 
  331                if (!already_served && ++which > 
a->n) {
 
  341    } 
else if (
a->pos == 4) { 
 
  346        char *context, *dupline;
 
  373    } 
else if (
a->pos == 5) { 
 
  377        char *context, *dupline, *from;
 
  388        from = 
strsep(&dupline, 
" ");
 
  389        if (!from || strcmp(from, 
"from")) {
 
 
  423    int removing_priority = 0;
 
  424    char *exten, *context, *cid;
 
  429        e->
command = 
"dialplan remove extension";
 
  431            "Usage: dialplan remove extension exten[/cid]@context [priority]\n" 
  432            "       Remove an extension from a given context. If a priority\n" 
  433            "       is given, only that specific priority from the given extension\n" 
  434            "       will be removed.\n";
 
  440    if (
a->argc != 5 && 
a->argc != 4)
 
  447        const char *
c = 
a->argv[4];
 
  453        if (!strcmp(
"hint", 
c))
 
  456            while (*
c && isdigit(*
c))
 
  459                ast_cli(
a->fd, 
"Invalid priority '%s'\n", 
a->argv[4]);
 
  462            removing_priority = atoi(
a->argv[4]);
 
  465        if (removing_priority == 0) {
 
  466            ast_cli(
a->fd, 
"If you want to remove whole extension, please " \
 
  467                "omit priority argument\n");
 
  476    if (
split_ec(
a->argv[3], &exten, &context, &cid))
 
  478    if ((!strlen(exten)) || (!(strlen(context)))) {
 
  479        ast_cli(
a->fd, 
"Missing extension or context name in third argument '%s'\n",
 
  487            cid ? cid : (removing_priority ? 
"" : 
NULL), cid ? 1 : 0, 
registrar)) {
 
  488        if (!removing_priority)
 
  489            ast_cli(
a->fd, 
"Whole extension %s@%s removed\n",
 
  492            ast_cli(
a->fd, 
"Extension %s@%s with priority %d removed\n",
 
  493                exten, context, removing_priority);
 
  498            ast_cli(
a->fd, 
"Failed to remove extension %s/%s@%s\n", exten, cid, context);
 
  500            ast_cli(
a->fd, 
"Failed to remove extension %s@%s\n", exten, context);
 
 
  516    char *cidmatch = 
NULL;
 
  520            "for DialplanExtensionRemove");
 
  526    if (strchr(exten, 
'/')) {
 
  533    } 
else if (!strcmp(
"hint", 
priority)) {
 
  535    } 
else if ((sscanf(
priority, 
"%30d", &ipriority) != 1) || ipriority <= 0) {
 
  545            astman_send_ack(s, m, 
"Removed the requested priority from the extension");
 
 
  568        lc = 
split_ec(
a->word, &exten, &context, &cid);
 
  573        lc = strlen(context);
 
  574        lcid = cid ? strlen(cid) : -1;
 
  588                if ( !strchr(
a->word, 
'/') ||
 
  593                        if (++which > 
a->n) {
 
  617    } 
else if (
a->pos == 4) { 
 
  622        int i = 
split_ec(s, &exten, &context, &cid);    
 
  626        if ( (p = strchr(exten, 
' ')) ) 
 
  628        if ( (p = strchr(context, 
' ')) ) 
 
  631        lc = strlen(context);
 
  632        len = strlen(
a->word);
 
  633        if (le == 0 || lc == 0)
 
 
  682    const char *into_context;
 
  686        e->
command = 
"dialplan add include";
 
  688            "Usage: dialplan add include <context> into <context>\n" 
  689            "       Include a context in another context.\n";
 
  699    if (strcmp(
a->argv[4], 
"into"))
 
  702    into_context = 
a->argv[5];
 
  705        ast_cli(
a->fd, 
"Context '%s' did not exist prior to add include - the context will be created.\n", into_context);
 
  709        ast_cli(
a->fd, 
"ast_context_find_or_create() failed\n");
 
  710        ast_cli(
a->fd, 
"Failed to include '%s' in '%s' context\n",
a->argv[3], 
a->argv[5]);
 
  717            ast_cli(
a->fd, 
"Out of memory for context addition\n");
 
  721            ast_cli(
a->fd, 
"Failed to lock context(s) list, please try again later\n");
 
  725            ast_cli(
a->fd, 
"Context '%s' already included in '%s' context\n",
 
  726                a->argv[3], 
a->argv[5]);
 
  731            ast_cli(
a->fd, 
"There is no existence of context '%s'\n",
 
  732                errno == ENOENT ? 
a->argv[5] : 
a->argv[3]);
 
  736            ast_cli(
a->fd, 
"Failed to include '%s' in '%s' context\n",
 
  737                a->argv[3], 
a->argv[5]);
 
  744    ast_cli(
a->fd, 
"Context '%s' included in '%s' context\n",
 
  745        a->argv[3], 
a->argv[5]);
 
 
  755    int len = strlen(
a->word);
 
  767    } 
else if (
a->pos == 4) { 
 
  770    } 
else if (
a->pos == 5) { 
 
  771        char *context, *dupline, *into;
 
  781        into = 
strsep(&dupline, 
" ");
 
  783        if (!strlen(context) || strcmp(into, 
"into")) {
 
 
  824    const char *base, *slash;
 
  830            "Usage: dialplan save [/path/to/extension/file]\n" 
  831            "       Save dialplan created by pbx_config module.\n" 
  833            "Example: dialplan save                 (/etc/asterisk/extensions.conf)\n" 
  834            "         dialplan save /home/markster  (/home/markster/extensions.conf)\n";
 
  842            "I can't save dialplan now, see '%s' example file.\n",
 
  847    if (
a->argc != 2 && 
a->argc != 3)
 
  852            "Failed to lock dialplan saving (another process saving?)\n");
 
  860        if (!strstr(
a->argv[2], 
".conf")) { 
 
  862            slash = (*(
a->argv[2] + strlen(
a->argv[2]) -1) == 
'/') ? 
"/" : 
"";
 
  871    snprintf(filename, 
sizeof(filename), 
"%s%s%s", base, slash, 
config);
 
  875        ast_cli(
a->fd, 
"Failed to load extensions.conf\n");
 
  882        ast_cli(
a->fd, 
"Failed to lock contexts list\n");
 
  889    if (!(output = fopen(filename, 
"wt"))) {
 
  890        ast_cli(
a->fd, 
"Failed to create file '%s'\n",
 
  902    fprintf(output, 
"[general]\nstatic=%s\nwriteprotect=%s\nautofallthrough=%s\nclearglobalvars=%s\n%sextenpatternmatchnew=%s\n\n",
 
  911        fprintf(output, 
"[globals]\n");
 
  913            int escaped_len = 2 * strlen(v->
value) + 1;
 
  914            char escaped[escaped_len];
 
  917            fprintf(output, 
"%s => %s\n", v->
name, escaped);
 
  920        fprintf(output, 
"\n");
 
  925#define PUT_CTX_HDR do { \ 
  926    if (!context_header_written) {  \ 
  927        fprintf(output, "[%s]\n", ast_get_context_name(c)); \ 
  928        context_header_written = 1; \ 
  934        int context_header_written = 0;
 
  947            context_header_written = 1;
 
  960                if (last_written_e != 
NULL &&
 
  963                    fprintf(output, 
"\n");
 
  969                    fprintf(output, 
"exten => %s,hint,%s\n",
 
  973                    const char *sep, *cid;
 
  975                    char label[128] = 
"";
 
  978                    int escaped_len = (!
ast_strlen_zero(appdata)) ? 2 * strlen(appdata) + 1 : 1;
 
  979                    char escaped[escaped_len];
 
  988                    if (
el && (snprintf(
label, 
sizeof(
label), 
"(%s)", 
el) != (strlen(
el) + 2))) {
 
  998                    fprintf(output, 
"exten => %s%s%s,%d%s,%s(%s)\n",
 
 1008            fprintf(output, 
"\n");
 
 1020            fprintf(output, 
"\n");
 
 1030            fprintf(output, 
"switch => %s/%s\n",
 
 1035            fprintf(output, 
"\n");
 
 1045            fprintf(output, 
"ignorepat => %s\n",
 
 1057        ast_cli(
a->fd, 
"Saved dialplan is incomplete\n");
 
 1061    ast_cli(
a->fd, 
"Dialplan successfully saved into '%s'\n",
 
 
 1072    char *exten, *prior;
 
 1076    const char *into_context;
 
 1080        e->
command = 
"dialplan add extension";
 
 1082            "Usage: dialplan add extension <exten>,<priority>,<app> into <context> [replace]\n" 
 1084            "       app can be either:\n" 
 1086            "         app-name(app-data)\n" 
 1087            "         app-name,<app-data>\n" 
 1089            "       This command will add the new extension into <context>.  If\n" 
 1090            "       an extension with the same priority already exists and the\n" 
 1091            "       'replace' option is given we will replace the extension.\n" 
 1093            "Example: dialplan add extension 6123,1,Dial,IAX/216.207.245.56/6123 into local\n" 
 1094            "         Now, you can dial 6123 and talk to Markster :)\n";
 
 1101    if (
a->argc != 6 && 
a->argc != 7)
 
 1103    if (strcmp(
a->argv[4], 
"into"))
 
 1106        if (strcmp(
a->argv[6], 
"replace"))
 
 1110    exten = 
strsep(&whole_exten,
",");
 
 1111    if (strchr(exten, 
'/')) {
 
 1117    prior = 
strsep(&whole_exten,
",");
 
 1119        if (!strcmp(prior, 
"hint")) {
 
 1122            if (sscanf(prior, 
"%30d", &iprior) != 1) {
 
 1123                ast_cli(
a->fd, 
"'%s' is not a valid priority\n", prior);
 
 1130        if ((start = strchr(
app, 
'(')) && (
end = strrchr(
app, 
')'))) {
 
 1131            *start = *
end = 
'\0';
 
 1143    if (!exten || !prior || !
app) {
 
 1150    into_context = 
a->argv[5];
 
 1153        ast_cli(
a->fd, 
"Context '%s' did not exist prior to add extension - the context will be created.\n", into_context);
 
 1157        ast_cli(
a->fd, 
"Failed to add '%s,%s,%s(%s)' extension into '%s' context\n",
 
 1166            ast_cli(
a->fd, 
"Out of free memory\n");
 
 1170            ast_cli(
a->fd, 
"Failed to lock context(s) list, please try again later\n");
 
 1174            ast_cli(
a->fd, 
"No existence of '%s' context\n", into_context);
 
 1178            ast_cli(
a->fd, 
"Extension %s@%s with priority %s already exists\n",
 
 1179                exten, into_context, prior);
 
 1183            ast_cli(
a->fd, 
"Failed to add '%s,%s,%s(%s)' extension into '%s' context\n",
 
 1191        ast_cli(
a->fd, 
"Extension %s@%s (%s) replace by '%s,%s,%s(%s)'\n",
 
 1192            exten, into_context, prior, exten, prior, 
app, 
app_data);
 
 1194        ast_cli(
a->fd, 
"Extension '%s,%s,%s(%s)' added into '%s' context\n",
 
 
 1211    char *cidmatch = 
NULL;
 
 1217            "Application must be defined for DialplanExtensionAdd.");
 
 1224    } 
else if ((sscanf(
priority, 
"%30d", &ipriority) != 1) || (ipriority < 0)) {
 
 1232    if (strchr(exten, 
'/')) {
 
 1245            "for the extension.");
 
 1267            astman_send_error(s, m, 
"That extension and priority already exist at that context");
 
 
 1286    int len = strlen(
a->word);
 
 
 1318    } 
else if (
a->pos == 5) { 
 
 1320        int len = strlen(
a->word);
 
 1335    } 
else if (
a->pos == 6) {
 
 
 1348        e->
command = 
"dialplan add ignorepat";
 
 1350            "Usage: dialplan add ignorepat <pattern> into <context>\n" 
 1351            "       This command adds a new ignore pattern into context <context>\n" 
 1353            "Example: dialplan add ignorepat _3XX into local\n";
 
 1362    if (strcmp(
a->argv[4], 
"into"))
 
 1368            ast_cli(
a->fd, 
"Out of free memory\n");
 
 1372            ast_cli(
a->fd, 
"There is no existence of '%s' context\n", 
a->argv[5]);
 
 1376            ast_cli(
a->fd, 
"Ignore pattern '%s' already included in '%s' context\n",
 
 1377                a->argv[3], 
a->argv[5]);
 
 1381            ast_cli(
a->fd, 
"Failed to lock context(s) list, please, try again later\n");
 
 1385            ast_cli(
a->fd, 
"Failed to add ignore pattern '%s' into '%s' context\n",
 
 1386                a->argv[3], 
a->argv[5]);
 
 1392    ast_cli(
a->fd, 
"Ignore pattern '%s' added into '%s' context\n",
 
 1393        a->argv[3], 
a->argv[5]);
 
 
 1402    else if (
a->pos == 5) {
 
 1405        char *dupline, *ignorepat = 
NULL;
 
 1408        int len = strlen(
a->word);
 
 1419        ignorepat = 
strsep(&dupline, 
" ");
 
 1433            if (!found && ++which > 
a->n)
 
 
 1449        e->
command = 
"dialplan remove ignorepat";
 
 1451            "Usage: dialplan remove ignorepat <pattern> from <context>\n" 
 1452            "       This command removes an ignore pattern from context <context>\n" 
 1454            "Example: dialplan remove ignorepat _3XX from local\n";
 
 1463    if (strcmp(
a->argv[4], 
"from"))
 
 1469            ast_cli(
a->fd, 
"Failed to lock context(s) list, please try again later\n");
 
 1473            ast_cli(
a->fd, 
"There is no existence of '%s' context\n", 
a->argv[5]);
 
 1477            ast_cli(
a->fd, 
"There is no existence of '%s' ignore pattern in '%s' context\n",
 
 1478                    a->argv[3], 
a->argv[5]);
 
 1482            ast_cli(
a->fd, 
"Failed to remove ignore pattern '%s' from '%s' context\n",
 
 1483                    a->argv[3], 
a->argv[5]);
 
 1489    ast_cli(
a->fd, 
"Ignore pattern '%s' removed from '%s' context\n",
 
 1490        a->argv[3], 
a->argv[5]);
 
 
 1501        int len = strlen(
a->word);
 
 1531    } 
else if (
a->pos == 4) {
 
 1533    } 
else if (
a->pos == 5) { 
 
 1534        char *dupline, *duplinet, *ignorepat;
 
 1535        int len = strlen(
a->word);
 
 1546        ignorepat = 
strsep(&duplinet, 
" ");
 
 
 1586        e->
command = 
"dialplan reload";
 
 1588            "Usage: dialplan reload\n" 
 1589            "       Reload extensions.conf without reloading any other\n" 
 1590            "       modules.  This command does not delete global variables\n" 
 1591            "       unless clearglobalvars is set to yes in extensions.conf\n";
 
 1604    ast_cli(
a->fd, 
"Dialplan reloaded.\n");
 
 
 1625#define AMI_EXTENSION_ADD "DialplanExtensionAdd" 
 1626#define AMI_EXTENSION_REMOVE "DialplanExtensionRemove" 
 1655    if (!destructible || !*destructible) {
 
 1658    res = *destructible;
 
 1659    for (; **destructible; (*destructible)++) {
 
 1660        if (**destructible == 
'[' && !strchr(delim, 
'[')) {
 
 1662        } 
else if (**destructible == 
']' && !strchr(delim, 
']')) {
 
 1666        } 
else if (**destructible == 
'\\' && !strchr(delim, 
'\\')) {
 
 1668        } 
else if (strchr(delim, **destructible) && !square) {
 
 1669            **destructible = 
'\0';
 
 1674    if (**destructible == 
'\0') {
 
 1675        *destructible = 
NULL;
 
 
 1686    char realvalue[256];
 
 1688    char realvalue[8192];
 
 1695    const char *newpm, *ovsw;
 
 1697    char lastextension[256];
 
 1727        if (strcasecmp(cxt, 
"globals")) {
 
 1741        if (!strcasecmp(cxt, 
"general") || !strcasecmp(cxt, 
"globals")) {
 
 1749        lastextension[0] = 
'\0';
 
 1754            char realext[256] = 
"";
 
 1755            char *stringp, *
ext;
 
 1761            if (!strncasecmp(v->
name, 
"same", 4)) {
 
 1764                        "No previous pattern in the first entry of context '%s' to match '%s' at line %d of %s!\n",
 
 1770                    goto process_extension;
 
 1772            } 
else if (!strcasecmp(v->
name, 
"exten")) {
 
 1775                char *pri, *appl, *data, *cidmatch;
 
 1786                if ((cidmatch = strchr(realext, 
'/'))) {
 
 1791                if ((label = strchr(pri, 
'('))) {
 
 1793                    if ((
end = strchr(label, 
')'))) {
 
 1797                            "Label missing trailing ')' at line %d of %s\n",
 
 1803                if ((plus = strchr(pri, 
'+'))) {
 
 1806                if (!strcmp(pri,
"hint")) {
 
 1808                } 
else if (!strcmp(pri, 
"next") || !strcmp(pri, 
"n")) {
 
 1813                            "Can't use 'next' priority on the first entry at line %d of %s!\n",
 
 1818                } 
else if (!strcmp(pri, 
"same") || !strcmp(pri, 
"s")) {
 
 1823                            "Can't use 'same' priority on the first entry at line %d of %s!\n",
 
 1828                } 
else if (sscanf(pri, 
"%30d", &ipri) != 1 &&
 
 1831                        "Invalid priority/label '%s' at line %d of %s\n",
 
 1836                } 
else if (ipri < 1) {
 
 1842                appl = 
S_OR(stringp, 
"");
 
 1844                if (!strchr(appl, 
'(')) {
 
 1855                    appl = 
strsep(&stringp, 
"(");
 
 1858                    if (strstr(appl, 
"${") || strstr(appl, 
"$[")){
 
 1860                        strcpy(appl, orig_appl);
 
 1865                        data = 
S_OR(stringp, 
"");
 
 1866                        if ((
end = strrchr(data, 
')'))) {
 
 1870                                "No closing parenthesis found? '%s(%s' at line %d of %s\n",
 
 1871                                appl, data, v->
lineno, vfile);
 
 1879                    const char *registrar_file;
 
 1886                            "The use of '%s' for an extension is strongly discouraged and can have unexpected behavior.  Please use '_X%c' instead at line %d of %s\n",
 
 1887                            realext, realext[1], v->
lineno, vfile);
 
 1890                    registrar_file = strrchr(vfile, 
'/');
 
 1891                    if (!registrar_file) {
 
 1892                        registrar_file = vfile;
 
 1896                    if (
ast_add_extension2(con, 0, realext, ipri, label, cidmatch, appl, 
ast_strdup(data), 
ast_free_ptr, 
registrar, registrar_file, v->
lineno)) {
 
 1898                            "Unable to register extension at line %d of %s\n",
 
 1903            } 
else if (!strcasecmp(v->
name, 
"include")) {
 
 1917                            "Context '%s' already included in '%s' context on include at line %d of %s\n",
 
 1924                            "There is no existence of context '%s' included at line %d of %s\n",
 
 1930                            "Failed to include '%s' in '%s' context at line %d of %s\n",
 
 1935            } 
else if (!strcasecmp(v->
name, 
"ignorepat")) {
 
 1939                        "Unable to include ignorepat '%s' in context '%s' at line %d of %s\n",
 
 1942            } 
else if (!strcasecmp(v->
name, 
"switch") || !strcasecmp(v->
name, 
"lswitch") || !strcasecmp(v->
name, 
"eswitch")) {
 
 1944                stringp = realvalue;
 
 1946                if (!strcasecmp(v->
name, 
"switch")) {
 
 1951                appl = 
strsep(&stringp, 
"/");
 
 1952                data = 
S_OR(stringp, 
"");
 
 1955                        "Unable to include switch '%s' in context '%s' at line %d of %s\n",
 
 1958            } 
else if (!strcasecmp(v->
name, 
"autohints")) {
 
 1962                    "==!!== Unknown directive: %s at line %d of %s -- IGNORING!!!\n",
 
 
void ast_context_destroy(void)
void ast_context_verify_includes(void)
void ast_merge_contexts_and_delete(void)
struct ast_context * ast_walk_contexts(void)
void ast_cli_unregister_multiple(void)
char * strsep(char **str, const char *delims)
Asterisk main include file. File version handling, generic pbx functions.
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
void ast_free_ptr(void *ptr)
free() wrapper
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
void ast_shrink_phone_number(char *n)
Shrink a phone number in place to just digits (more accurately it just removes ()'s,...
static const char config_file[]
General Asterisk PBX channel definitions.
#define AST_MAX_EXTENSION
Standard Command Line Interface.
int ast_cli_unregister(struct ast_cli_entry *e)
Unregisters a command or an array of commands.
#define ast_cli_register(e)
Registers a command or an array of commands.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
void ast_hashtab_destroy(struct ast_hashtab *tab, void(*objdestroyfunc)(void *obj))
This func will free the hash table and all its memory.
int ast_hashtab_newsize_java(struct ast_hashtab *tab)
Create a prime number roughly 2x the current table size.
#define ast_hashtab_create(initial_buckets, compare, resize, newsize, hash, do_locking)
Create the hashtable list.
int ast_hashtab_resize_java(struct ast_hashtab *tab)
Determines if a table resize should occur using the Java algorithm (if the table load factor is 75% o...
Configuration File Parser.
#define ast_config_load(filename, flags)
Load a config file.
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
#define CONFIG_STATUS_FILEINVALID
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Support for logging to various files, console and syslog Configuration in file logger....
#define ast_mutex_unlock(a)
#define ast_mutex_lock(a)
#define AST_MUTEX_DEFINE_STATIC(mutex)
#define EVENT_FLAG_SYSTEM
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Asterisk module definitions.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
@ AST_MODULE_LOAD_SUCCESS
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
#define ast_opt_dont_warn
Asterisk file paths, configured in asterisk.conf.
const char * ast_config_AST_CONFIG_DIR
static char * overrideswitch
Core PBX routines and definitions.
void * ast_get_extension_app_data(struct ast_exten *e)
const struct ast_sw * ast_context_switches_get(const struct ast_context *con, int idx)
int ast_add_extension(const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
Add and extension to an extension context.
int ast_context_destroy_by_name(const char *context, const char *registrar)
Destroy a context by name.
int ast_context_remove_ignorepat(const char *context, const char *ignorepat, const char *registrar)
Remove an ignorepat.
int ast_get_extension_priority(struct ast_exten *exten)
int ast_wrlock_contexts(void)
Write locks the context list.
void ast_context_set_autohints(struct ast_context *con, int enabled)
Enable or disable autohints support on a context.
int ast_hashtab_compare_contexts(const void *ah_a, const void *ah_b)
hashtable functions for contexts
int ast_context_add_ignorepat(const char *context, const char *ignorepat, const char *registrar)
Add an ignorepat.
int ast_get_extension_matchcid(struct ast_exten *e)
struct ast_context * ast_context_find(const char *name)
Find a context.
const char * ast_get_extension_app(struct ast_exten *e)
int ast_context_add_include(const char *context, const char *include, const char *registrar)
Add a context include.
int ast_add_extension2(struct ast_context *con, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar, const char *registrar_file, int registrar_line)
Add an extension to an extension context, this time with an ast_context *.
int ast_context_add_include2(struct ast_context *con, const char *value, const char *registrar)
Add a context include.
const char * ast_get_switch_name(const struct ast_sw *sw)
int ast_context_add_ignorepat2(struct ast_context *con, const char *ignorepat, const char *registrar)
const char * ast_get_extension_cidmatch(struct ast_exten *e)
const char * ast_get_extension_label(struct ast_exten *e)
unsigned int ast_hashtab_hash_contexts(const void *obj)
const char * ast_get_switch_data(const struct ast_sw *sw)
struct ast_context * ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
Register a new context or find an existing one.
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
const char * ast_get_include_name(const struct ast_include *include)
const char * ast_get_context_registrar(struct ast_context *c)
void pbx_set_overrideswitch(const char *newval)
int ast_unlock_context(struct ast_context *con)
struct ast_exten * ast_walk_extension_priorities(struct ast_exten *exten, struct ast_exten *priority)
int ast_context_remove_extension_callerid(const char *context, const char *extension, int priority, const char *callerid, int matchcid, const char *registrar)
int pbx_set_extenpatternmatchnew(int newval)
const char * ast_get_context_name(struct ast_context *con)
const char * ast_get_ignorepat_registrar(const struct ast_ignorepat *ip)
void pbx_builtin_clear_globals(void)
int ast_rdlock_contexts(void)
Read locks the context list.
int ast_context_ignorepats_count(const struct ast_context *con)
int ast_context_add_switch2(struct ast_context *con, const char *sw, const char *data, int eval, const char *registrar)
Adds a switch (first param is a ast_context)
const struct ast_include * ast_context_includes_get(const struct ast_context *con, int idx)
struct ast_exten * ast_walk_context_extensions(struct ast_context *con, struct ast_exten *priority)
int ast_findlabel_extension2(struct ast_channel *c, struct ast_context *con, const char *exten, const char *label, const char *callerid)
Find the priority of an extension that has the specified label.
int ast_context_remove_include(const char *context, const char *include, const char *registrar)
Remove a context include.
const struct ast_ignorepat * ast_context_ignorepats_get(const struct ast_context *con, int idx)
int ast_unlock_contexts(void)
Unlocks contexts.
int ast_context_switches_count(const struct ast_context *con)
int pbx_set_autofallthrough(int newval)
int ast_context_includes_count(const struct ast_context *con)
const char * ast_get_include_registrar(const struct ast_include *i)
const char * ast_get_extension_name(struct ast_exten *exten)
int ast_rdlock_context(struct ast_context *con)
Read locks a given context.
const char * ast_get_ignorepat_name(const struct ast_ignorepat *ip)
const char * ast_get_extension_registrar(struct ast_exten *e)
void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
const char * ast_get_switch_registrar(const struct ast_sw *sw)
static char * complete_dialplan_remove_extension(struct ast_cli_args *)
static char * complete_dialplan_add_extension(struct ast_cli_args *)
static char * complete_dialplan_remove_context(struct ast_cli_args *)
static int manager_dialplan_extension_add(struct mansession *s, const struct message *m)
static char * complete_dialplan_add_include(struct ast_cli_args *)
static const char registrar[]
static char * pbx_strsep(char **destructible, const char *delim)
static char * overrideswitch_config
static int extenpatternmatchnew_config
static char * handle_cli_dialplan_remove_context(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int autofallthrough_config
static char * complete_dialplan_add_ignorepat(struct ast_cli_args *)
static char * handle_cli_dialplan_save(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
'save dialplan' CLI command implementation functions ...
static struct ast_cli_entry cli_dialplan_save
static const char * skip_words(const char *p, int n)
moves to the n-th word in the string, or empty string if none
#define AMI_EXTENSION_ADD
static int lookup_c_ip(struct ast_context *c, const char *name)
return true if 'name' is in the ignorepats for context c
static int pbx_load_module(void)
static char * handle_cli_dialplan_remove_include(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct ast_context * local_contexts
static struct ast_cli_entry cli_pbx_config[]
static char * handle_cli_dialplan_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define AMI_EXTENSION_REMOVE
static char * handle_cli_dialplan_add_extension(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
ADD EXTENSION command stuff.
static int clearglobalvars_config
static int split_ec(const char *src, char **ext, char **const ctx, char **const cid)
split extension@context in two parts, return -1 on error. The return string is malloc'ed and pointed ...
static char * handle_cli_dialplan_add_ignorepat(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_cli_dialplan_remove_ignorepat(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * complete_dialplan_remove_include(struct ast_cli_args *)
static const char config[]
static char userscontext[AST_MAX_EXTENSION]
static int pbx_load_config(const char *config_file)
static int lookup_ci(struct ast_context *c, const char *name)
return true if 'name' is included by context c
static ast_mutex_t reload_lock
static int load_module(void)
static int unload_module(void)
static char * handle_cli_dialplan_add_include(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static ast_mutex_t save_dialplan_lock
static char * complete_dialplan_remove_ignorepat(struct ast_cli_args *)
static int partial_match(const char *s, const char *word, int len)
match the first 'len' chars of word. len==0 always succeeds
static struct ast_hashtab * local_table
static char * handle_cli_dialplan_remove_extension(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int manager_dialplan_extension_remove(struct mansession *s, const struct message *m)
static int write_protect_config
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
static force_inline int attribute_pure ast_strlen_zero(const char *s)
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
descriptor for a cli entry.
ast_context: An extension context
ast_exten: An extension The dialplan is saved as a linked list with each context having it's own link...
Structure used to handle boolean flags.
ast_ignorepat: Ignore patterns in dial plan
ast_include: include= support in extensions.conf
ast_sw: Switch statement in extensions.conf
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
structure to hold extensions
In case you didn't read that giant block of text above the mansession_session struct,...
char * ast_escape_semicolons(const char *string, char *outbuf, int buflen)
Escape semicolons found in a string.